Embed WASM parsers and document deployment

ober

a5e53a2930b3c84f610dd65fe38312c4faff4524

diff --git a/.gitsafe.json b/.gitsafe.json
new file mode 100644
index 0000000..f99a110
--- /dev/null
+++ b/.gitsafe.json
@@ -0,0 +1,10 @@
+{
+  "severity": "medium",
+  "entropy": true,
+  "allowlist": {
+    "patterns": [
+      "048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57",
+      "b93cf8c6eef9ab3895065465a92a5f7e15f4726577b4adad630e7ba47eb7349c"
+    ]
+  }
+}
diff --git a/Makefile b/Makefile
index 26b6372..bc335a9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 # jerbuild bundles Chez Scheme + the jerboa stdlib + the jerboa-native Rust
 # crate, so building jdns needs only jerbuild + a C compiler + cargo (with the
 # wasm32-unknown-unknown target for the sandbox payloads). No jerboa checkout.
-JERBUILD ?= $(shell if [ -x "$(CURDIR)/../jerboa/dist/jerbuild" ]; then printf '%s\n' "$(CURDIR)/../jerboa/dist/jerbuild"; elif command -v jerbuild >/dev/null 2>&1; then command -v jerbuild; else printf '%s\n' jerbuild; fi)
+JERBUILD ?= $(shell if command -v jerbuild >/dev/null 2>&1; then command -v jerbuild; else printf '%s\n' jerbuild; fi)
 JH := $(shell $(JERBUILD) --jerboa-home 2>/dev/null)
 ifeq ($(JH),)
 $(error jerbuild not found on PATH (or '$(JERBUILD) --jerboa-home' failed). Install jerbuild, or set JERBUILD=/path/to/jerbuild)
diff --git a/README.md b/README.md
index 5173e41..9c3bde8 100644
--- a/README.md
+++ b/README.md
@@ -69,13 +69,17 @@ JDNS_ALLOW_SANDBOX_FALLBACK=1 jdns ...
 jdns --allow-sandbox-fallback ...
 ```
 
-The WASM DNS parser and WASM CDB reader are used when available. To require
-them and fail instead of falling back to in-process parsing, set:
-
-```sh
-JDNS_REQUIRE_WASM_PARSER=1
-JDNS_REQUIRE_WASM_CDB=1
-```
+The WASM DNS parser and WASM CDB reader are embedded into the binary at build
+time (`lib/jerboa-dns/wasm-embedded.ss`, regenerated by `wasm/build.sh`), so
+the sandbox is active with no files on disk, including inside the chroot.
+If the wasmi runtime itself is not linked in, startup/query handling fails
+closed by default. The only in-process parser fallback is the explicit
+development opt-out `JDNS_ALLOW_IN_PROCESS_PARSER=1` or
+`JDNS_ALLOW_IN_PROCESS_CDB=1`.
+
+`JDNS_PARSER_WASM` / `JDNS_CDB_WASM` point at on-disk modules as an explicit
+development override (useful for testing a rebuilt parser without relinking);
+they are not needed in production.
 
 ## Zone Updates
 
diff --git a/docs/deploy.md b/docs/deploy.md
new file mode 100644
index 0000000..a02edcf
--- /dev/null
+++ b/docs/deploy.md
@@ -0,0 +1,120 @@
+# Deploying jerboa-dns
+
+This is the production deployment checklist for `jdns` as an authoritative
+tinydns replacement.
+
+## 1. Build Or Select Artifacts
+
+For a local host build:
+
+```sh
+make clean
+make binary
+make test
+make security
+make fuzz-check
+```
+
+For a release candidate, prefer the release gate:
+
+```sh
+make release-evidence JERBUILD=/path/to/jerbuild
+```
+
+Static release artifacts are named by target, for example
+`jdns-linux-amd64` and `jdns-data-linux-amd64`. The matching static build
+scripts under `static/` build both the daemon and zone compiler. Release
+candidates must ship with the matching `dist/release-evidence/` bundle.
+
+## 2. Files To Install
+
+Install these files on the target:
+
+- `jdns` or the target-specific `jdns-*` daemon binary.
+- `jdns-data` or the target-specific `jdns-data-*` compiler, unless CDB files
+  are compiled off-host.
+- `data.cdb`, generated from the zone source.
+- The reviewed release evidence bundle for the exact binary.
+
+Do not install separate `*.wasm` files for production. The DNS packet parser
+and CDB reader modules are embedded into the binary by `wasm/build.sh`, and the
+daemon uses them without reading parser files from disk or from inside the
+chroot.
+
+## 3. Compile Zone Data
+
+Compile zone source into a CDB on a build host or control-plane host:
+
+```sh
+./jdns-data zones/example.sexp data.cdb
+```
+
+Publish updates by writing the new CDB in the same directory and atomically
+renaming it over the live `data.cdb`. The checked-in compiler already follows
+that pattern. The daemon validates replacements off the request path and keeps
+serving the last valid snapshot if a replacement is malformed or unstable.
+
+## 4. Runtime Layout
+
+Create a minimal root directory for the daemon, owned by root and writable only
+by the deployment/update process:
+
+```sh
+install -d -o root -g root -m 0755 /var/jdns
+install -m 0644 data.cdb /var/jdns/data.cdb
+```
+
+Run the daemon with `--root /var/jdns --data data.cdb`. The data path is
+relative to the root after sandbox setup.
+
+## 5. Privileges And Sandbox
+
+If binding as root, configure both a non-zero UID and non-zero GID for the
+serving process. The daemon clears supplementary groups, drops privileges, and
+verifies that root cannot be regained before serving.
+
+Production must not set these development overrides:
+
+- `JDNS_RETAIN_PRIVILEGES=1`
+- `JDNS_ALLOW_SANDBOX_FALLBACK=1`
+- `JDNS_ALLOW_IN_PROCESS_PARSER=1`
+- `JDNS_ALLOW_IN_PROCESS_CDB=1`
+- `JDNS_PARSER_WASM`
+- `JDNS_CDB_WASM`
+
+The WASM parser and CDB reader are required by default. If a binary was built
+without the wasmi runtime, it fails closed instead of silently serving with the
+in-process parsers.
+
+## 6. Start And Smoke Test
+
+Example foreground start:
+
+```sh
+UID=53 GID=53 ./jdns --ip 0.0.0.0 --port 53 --root /var/jdns --data data.cdb
+```
+
+Smoke test from another shell:
+
+```sh
+dig @127.0.0.1 example.com SOA +time=2 +tries=1
+dig @127.0.0.1 example.com SOA +tcp +time=2 +tries=1
+```
+
+Startup logs should show the CDB opened with `parser=sandboxed`. Any
+`parser=in-process` or `wasm_*_fallback` log is a release blocker unless it was
+from an explicitly marked local development run.
+
+## 7. Edge Controls
+
+`jdns` is authoritative-only and does not recurse. `ANY` responses are
+minimized, but production still requires external edge rate limiting until
+native response-rate limiting is implemented. Keep the rate-limit evidence with
+the release packet as described in `docs/release-evidence.md`.
+
+## 8. Rollback
+
+Keep the previous daemon binary and previous known-good `data.cdb` together.
+Rollback is either replacing the binary and restarting, or atomically renaming
+the previous CDB back over `data.cdb`. Check logs after rollback and repeat the
+UDP and TCP smoke queries.
diff --git a/docs/threat-model.md b/docs/threat-model.md
index 1258452..2d7ae61 100644
--- a/docs/threat-model.md
+++ b/docs/threat-model.md
@@ -23,8 +23,10 @@ cases must be modeled before release.
 
 - Network boundary: UDP and TCP packets are hostile.
 - Parser boundary: DNS wire messages and CDB records are parsed from
-  untrusted bytes; WASM parsers are preferred and can be required with
-  `JDNS_REQUIRE_WASM_PARSER=1` and `JDNS_REQUIRE_WASM_CDB=1`.
+  untrusted bytes; the WASM sandbox parsers are embedded in the binary and
+  required by default (no files on disk, including inside the chroot). If the
+  wasmi runtime is not linked in, startup/query handling fails closed unless a
+  development-only `JDNS_ALLOW_IN_PROCESS_*` opt-out is explicit.
 - Filesystem boundary: startup reads config and CDB files before sandboxing;
   runtime should operate inside `ROOT`.
 - Privilege boundary: sockets are bound before chroot, supplementary groups are
diff --git a/lib/jerboa-dns/wasm-cdb.ss b/lib/jerboa-dns/wasm-cdb.ss
index 9e01a6e..9e801f4 100644
--- a/lib/jerboa-dns/wasm-cdb.ss
+++ b/lib/jerboa-dns/wasm-cdb.ss
@@ -3,7 +3,9 @@
 ;;;
 ;;; Mirrors the shape of (jerboa-dns cdb) cdb-find-all, but the
 ;;; attacker-influenced bytes (the CDB file contents) are walked by
-;;; the wasm module — never by the host directly.
+;;; the wasm module — never by the host directly. The module bytes are
+;;; embedded in the binary via (jerboa-dns wasm-embedded), so the sandbox
+;;; works after chroot with no files on disk.
 ;;;
 ;;; The wasm module exports:
 ;;;   alloc(len)              -> ptr in linear memory
@@ -57,7 +59,8 @@
     (except (jerboa prelude) meta atom?)
     (std wasm sandbox)
     (jerboa-dns cdb)
-    (jerboa-dns log))
+    (jerboa-dns log)
+    (jerboa-dns wasm-embedded))
 
   ;; Tag bytes — must match wasm/cdb/src/lib.rs.
   (def TAG-REC #x02)
@@ -82,13 +85,17 @@
   ;; inspect the CDB. This matches wasm/cdb/src/lib.rs::CDB_CAP.
   (def MAX-CDB-BYTES (* 16 1024 1024))
 
-  (def (resolve-wasm-path)
-    (or (getenv "JDNS_CDB_WASM")
-        (find file-exists?
-              '("lib/jerboa-dns/sandbox/cdb_parser.wasm"
-                "sandbox/cdb_parser.wasm"
-                "/etc/jdns/cdb_parser.wasm"))
-        "lib/jerboa-dns/sandbox/cdb_parser.wasm"))
+  ;; Module bytes come from the binary itself: the payloads are embedded
+  ;; via (jerboa-dns wasm-embedded) at build time, so the sandbox never
+  ;; depends on files inside the chroot. JDNS_CDB_WASM is an explicit
+  ;; development override for testing a rebuilt module without relinking.
+  (def (cdb-module-bytes)
+    (let ([override (getenv "JDNS_CDB_WASM")])
+      (if (and override
+               (not (string=? override ""))
+               (file-exists? override))
+        (load-wasm-bytes override)
+        cdb-parser-wasm-bytes)))
 
   (def %module #f)
 
@@ -104,13 +111,9 @@
       [(not (wasm-sandbox-available?)) #f]
       [else
        (try
-         (let* ([path (resolve-wasm-path)]
-                [bytes (and (file-exists? path) (load-wasm-bytes path))])
-           (if (not bytes)
-             #f
-             (let ([m (wasm-sandbox-load bytes)])
-               (set! %module m)
-               #t)))
+         (let ([m (wasm-sandbox-load (cdb-module-bytes))])
+           (set! %module m)
+           #t)
          (catch (e) (set! %module #f) #f))]))
 
   (def (wasm-cdb-shutdown!)
@@ -119,15 +122,25 @@
       (set! %module #f)))
 
   (def (sandbox-available?)
-    (and (wasm-sandbox-available?)
-         (file-exists? (resolve-wasm-path))))
-
-  (def *require-sandbox?* #f)
+    ;; The module is embedded in the binary, so availability reduces to
+    ;; the wasmi runtime being linked in.
+    (wasm-sandbox-available?))
+
+  ;; Fail closed by default: the sandboxed CDB walker is required, and a
+  ;; binary without the wasmi runtime refuses to serve rather than silently
+  ;; parsing attacker-influenced bytes in-process. The only escape is the
+  ;; explicit development opt-out JDNS_ALLOW_IN_PROCESS_CDB=1.
+  ;; (JDNS_REQUIRE_WASM_CDB is accepted for backwards compatibility but no
+  ;; longer changes anything: required is the default posture.)
+  (def *require-sandbox?* #t)
+
+  (def (truthy-env? name)
+    (let ([v (getenv name)])
+      (and v (not (member v '("" "0" "false"))))))
 
   (def (require-sandbox?)
-    (or *require-sandbox?*
-        (let ([v (getenv "JDNS_REQUIRE_WASM_CDB")])
-          (and v (not (member v '("" "0" "false")))))))
+    (and *require-sandbox?*
+         (not (truthy-env? "JDNS_ALLOW_IN_PROCESS_CDB"))))
 
   (def (set-require-sandbox! flag)
     (set! *require-sandbox?* (and flag #t)))
@@ -138,7 +151,7 @@
       (set! *warned-fallback?* #t)
       (log-info 'wasm_cdb_fallback
         'reason reason
-        'hint "set JDNS_REQUIRE_WASM_CDB=1 to error instead")))
+        'hint "in-process fallback allowed by JDNS_ALLOW_IN_PROCESS_CDB=1 (development only)")))
 
   ;; ========== Reader record ==========
   ;; Carries both the wasm instance (when sandboxed) and the underlying
@@ -189,13 +202,12 @@
            [inst (try-load-into-sandbox bv)])
       (when (and (not inst) (require-sandbox?))
         (error 'open-sandboxed-cdb
-               "JDNS_REQUIRE_WASM_CDB set but sandbox unavailable for this CDB"))
+               "WASM CDB sandbox required but unavailable (wasmi runtime not linked in); refusing to serve in-process"))
       (when (not inst)
         (warn-fallback-once!
           (cond
             [(not (wasm-sandbox-available?)) "libjerboa_native not loaded"]
-            [(not (file-exists? (resolve-wasm-path))) "wasm module missing on disk"]
-            [else "cdb_finalize rejected the file"])))
+            [else "cdb module load or finalize failed"])))
       (make-sandboxed-cdb-reader inst bv fallback #f (make-mutex))))
 
   (def (try-load-into-sandbox bv)
diff --git a/lib/jerboa-dns/wasm-dns.ss b/lib/jerboa-dns/wasm-dns.ss
index f284be8..c0e1fdd 100644
--- a/lib/jerboa-dns/wasm-dns.ss
+++ b/lib/jerboa-dns/wasm-dns.ss
@@ -5,8 +5,10 @@
 ;;;   (values id qname qtype qclass)
 ;;; or #f for "not a query I can answer" (matching parse-query's contract).
 ;;;
-;;; The actual parsing happens in lib/jerboa-dns/sandbox/dns_parser.wasm
-;;; (Rust, no_std) running inside wasmi. The host only sees a tagged
+;;; The actual parsing happens in the dns_parser wasm module (Rust, no_std)
+;;; running inside wasmi. The module bytes are embedded in the binary via
+;;; (jerboa-dns wasm-embedded) — no file on disk is required, which matters
+;;; because initialization happens after chroot. The host only sees a tagged
 ;;; record — a tiny deterministic grammar trivial to validate.
 ;;;
 ;;; The wasm module exports:
@@ -42,7 +44,8 @@
     (except (jerboa prelude) meta atom?)
     (std wasm sandbox)
     (jerboa-dns protocol)
-    (jerboa-dns log))
+    (jerboa-dns log)
+    (jerboa-dns wasm-embedded))
 
   ;; Tag bytes — must match wasm/src/lib.rs.
   (def TAG-QUERY #x01)
@@ -61,14 +64,17 @@
   ;; at 4096 too. DNS UDP w/o EDNS is 512; with EDNS up to ~4 KB.
   (def MAX-INPUT 4096)
 
-  (def (resolve-wasm-path)
-    (or (getenv "JDNS_PARSER_WASM")
-        ;; Search the same places the Makefile populates.
-        (find file-exists?
-              '("lib/jerboa-dns/sandbox/dns_parser.wasm"
-                "sandbox/dns_parser.wasm"
-                "/etc/jdns/dns_parser.wasm"))
-        "lib/jerboa-dns/sandbox/dns_parser.wasm"))
+  ;; Module bytes come from the binary itself: the payloads are embedded
+  ;; via (jerboa-dns wasm-embedded) at build time, so the sandbox never
+  ;; depends on files inside the chroot. JDNS_PARSER_WASM is an explicit
+  ;; development override for testing a rebuilt module without relinking.
+  (def (dns-module-bytes)
+    (let ([override (getenv "JDNS_PARSER_WASM")])
+      (if (and override
+               (not (string=? override ""))
+               (file-exists? override))
+        (load-wasm-bytes override)
+        dns-parser-wasm-bytes)))
 
   (def %module #f)
   (def %instance #f)
@@ -84,15 +90,11 @@
       [(not (wasm-sandbox-available?)) #f]
       [else
        (try
-         (let* ([path (resolve-wasm-path)]
-                [bytes (and (file-exists? path) (load-wasm-bytes path))])
-           (if (not bytes)
-             #f
-             (let* ([m (wasm-sandbox-load bytes)]
-                    [i (wasm-sandbox-instantiate m)])
-               (set! %module m)
-               (set! %instance i)
-               #t)))
+         (let* ([m (wasm-sandbox-load (dns-module-bytes))]
+                [i (wasm-sandbox-instantiate m)])
+           (set! %module m)
+           (set! %instance i)
+           #t)
          (catch (e)
            (set! %module #f)
            (set! %instance #f)
@@ -107,18 +109,25 @@
       (set! %module #f)))
 
   (def (sandbox-available?)
-    (and (wasm-sandbox-available?)
-         (file-exists? (resolve-wasm-path))))
+    ;; The module is embedded in the binary, so availability reduces to
+    ;; the wasmi runtime being linked in.
+    (wasm-sandbox-available?))
 
-  ;; Operator can force sandbox-or-fail mode by setting either the env
-  ;; var or this in-process flag. This closes the silent-fallback gap
-  ;; called out in vs-djbdns.md (issue F).
-  (def *require-sandbox?* #f)
+  ;; Fail closed by default: the sandboxed query parser is required, and a
+  ;; binary without the wasmi runtime refuses to parse rather than silently
+  ;; handling hostile packets in-process. The only escape is the explicit
+  ;; development opt-out JDNS_ALLOW_IN_PROCESS_PARSER=1.
+  ;; (JDNS_REQUIRE_WASM_PARSER is accepted for backwards compatibility but no
+  ;; longer changes anything: required is the default posture.)
+  (def *require-sandbox?* #t)
+
+  (def (truthy-env? name)
+    (let ([v (getenv name)])
+      (and v (not (member v '("" "0" "false"))))))
 
   (def (require-sandbox?)
-    (or *require-sandbox?*
-        (let ([v (getenv "JDNS_REQUIRE_WASM_PARSER")])
-          (and v (not (member v '("" "0" "false")))))))
+    (and *require-sandbox?*
+         (not (truthy-env? "JDNS_ALLOW_IN_PROCESS_PARSER"))))
 
   (def (set-require-sandbox! flag)
     (set! *require-sandbox?* (and flag #t)))
@@ -129,7 +138,7 @@
       (set! *warned-fallback?* #t)
       (log-info 'wasm_dns_fallback
         'reason reason
-        'hint "set JDNS_REQUIRE_WASM_PARSER=1 to error instead")))
+        'hint "in-process fallback allowed by JDNS_ALLOW_IN_PROCESS_PARSER=1 (development only)")))
 
   ;; ---------- Output decoder ----------
 
@@ -232,13 +241,10 @@
     (cond
       [(or (negative? pkt-len) (> pkt-len MAX-INPUT)) #f]
       [(not (sandbox-available?))
-       (let ([reason (cond
-                       [(not (wasm-sandbox-available?))
-                        "libjerboa_native not loaded"]
-                       [else "wasm module missing on disk"])])
+       (let ([reason "libjerboa_native not loaded"])
          (when (require-sandbox?)
            (error 'parse-query-sandboxed
-                  "JDNS_REQUIRE_WASM_PARSER set but sandbox unavailable"
+                  "WASM DNS parser sandbox required but unavailable (wasmi runtime not linked in)"
                   reason))
          (warn-fallback-once! reason)
          (parse-query-fallback pkt-bv pkt-len))]
diff --git a/lib/jerboa-dns/wasm-embedded.ss b/lib/jerboa-dns/wasm-embedded.ss
new file mode 100644
index 0000000..97358ab
--- /dev/null
+++ b/lib/jerboa-dns/wasm-embedded.ss
@@ -0,0 +1,779 @@
+#!chezscheme
+;;; (jerboa-dns wasm-embedded) — wasm sandbox payloads embedded in the binary.
+;;;
+;;; AUTO-GENERATED by wasm/embed-gen.py from lib/jerboa-dns/sandbox/*.wasm.
+;;; Do not edit by hand: run `make wasm` (or sh wasm/build.sh) to regenerate
+;;; after changing the Rust parsers. The sha256 digests below must match
+;;; dist/release-evidence/wasm-sha256.txt for a release build.
+;;;
+;;; (jerboa-dns wasm-dns) and (jerboa-dns wasm-cdb) load these bytevectors
+;;; directly, so the wasmi sandbox needs no files on disk — in particular
+;;; nothing inside the chroot. JDNS_PARSER_WASM / JDNS_CDB_WASM remain as
+;;; explicit development overrides.
+
+(library (jerboa-dns wasm-embedded)
+  (export
+    dns-parser-wasm-bytes
+    cdb-parser-wasm-bytes
+    dns-parser-wasm-sha256
+    cdb-parser-wasm-sha256)
+  (import (chezscheme))
+
+  ;; dns_parser.wasm: 5434 bytes, sha256 048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57
+  (define dns-parser-wasm-bytes
+    #vu8(      0 97 115 109 1 0 0 0 1 83 12 96 2 127 127 1
+      127 96 3 127 127 127 1 127 96 1 127 0 96 6 127 127
+      127 127 127 127 0 96 3 127 127 127 0 96 5 127 127 127
+      127 127 0 96 1 127 1 127 96 4 127 127 127 127 1 127
+      96 0 0 96 6 127 127 127 127 127 127 1 127 96 4 127
+      127 127 127 0 96 5 127 127 127 127 127 1 127 3 19 18
+      2 3 1 4 0 5 6 7 8 9 1 4 4 0 10 11
+      0 4 4 5 1 112 1 2 2 5 3 1 0 19 6 25
+      3 127 1 65 128 128 192 0 11 127 0 65 212 133 200 0
+      11 127 0 65 224 133 200 0 11 7 67 6 6 109 101 109
+      111 114 121 2 0 5 97 108 108 111 99 0 6 11 112 97
+      114 115 101 95 113 117 101 114 121 0 7 5 114 101 115 101
+      116 0 8 10 95 95 100 97 116 97 95 101 110 100 3 1
+      11 95 95 104 101 97 112 95 98 97 115 101 3 2 9 7
+      1 0 65 1 11 1 13 10 247 34 18 3 0 0 11 55
+      0 2 64 32 2 32 1 73 13 0 32 2 32 4 75 13
+      0 32 0 32 2 32 1 107 54 2 4 32 0 32 3 32
+      1 106 54 2 0 15 11 32 1 32 2 32 4 32 5 16
+      142 128 128 128 0 0 11 83 1 1 127 2 64 2 64 32
+      2 32 1 79 13 0 32 2 65 1 106 34 3 32 1 73
+      13 1 32 3 32 1 65 148 131 192 128 0 16 140 128 128
+      128 0 0 11 32 2 32 1 65 132 131 192 128 0 16 140
+      128 128 128 0 0 11 32 0 32 2 106 45 0 0 65 8
+      116 32 0 32 3 106 45 0 0 114 11 60 1 1 127 65
+      1 33 3 2 64 32 1 32 2 65 128 254 3 113 65 8
+      118 16 132 128 128 128 0 65 1 113 13 0 32 1 32 2
+      16 132 128 128 128 0 33 3 11 32 0 65 125 54 2 4
+      32 0 32 3 54 2 0 11 55 1 2 127 65 1 33 2
+      2 64 32 0 40 2 8 34 3 32 0 40 2 4 79 13
+      0 32 0 32 3 65 1 106 54 2 8 32 0 40 2 0
+      32 3 106 32 1 58 0 0 65 0 33 2 11 32 2 11
+      44 0 2 64 32 1 32 3 71 13 0 2 64 32 1 69
+      13 0 32 0 32 2 32 1 252 10 0 0 11 15 11 32
+      1 32 3 32 4 16 145 128 128 128 0 0 11 72 1 1
+      127 65 0 65 0 40 2 208 133 200 128 0 34 1 32 0
+      65 7 106 65 120 113 106 34 0 54 2 208 133 200 128 0
+      2 64 32 0 65 128 128 8 75 13 0 32 1 65 208 133
+      192 128 0 106 15 11 65 0 65 128 128 8 54 2 208 133
+      200 128 0 65 0 11 140 8 2 12 127 1 126 35 128 128
+      128 128 0 65 192 2 107 34 4 36 128 128 128 128 0 65
+      126 33 5 2 64 32 1 65 128 32 75 13 0 65 127 33
+      5 32 2 65 208 133 192 128 0 73 13 0 32 0 65 208
+      133 192 128 0 73 13 0 65 127 32 0 32 1 106 34 6
+      32 6 32 0 73 27 65 208 133 200 128 0 75 13 0 65
+      127 32 2 32 3 106 34 6 32 6 32 2 73 27 65 208
+      133 200 128 0 75 13 0 65 124 33 5 32 1 65 12 73
+      13 0 32 0 44 0 2 65 0 72 13 0 32 0 32 1
+      65 4 16 130 128 128 128 0 65 255 255 3 113 65 1 71
+      13 0 65 0 33 7 32 0 32 1 65 0 16 130 128 128
+      128 0 33 8 2 64 65 128 2 69 13 0 32 4 65 52
+      106 65 0 65 128 2 252 11 0 11 65 12 33 9 65 1
+      33 10 65 0 33 11 65 0 33 12 2 64 2 64 3 64
+      2 64 32 7 65 229 0 71 13 0 65 122 33 5 12 4
+      11 3 64 65 123 33 5 32 9 32 1 79 13 4 2 64
+      32 0 32 9 106 45 0 0 34 6 13 0 32 11 65 255
+      1 77 13 3 12 4 11 2 64 32 6 65 192 1 113 34
+      13 69 13 0 2 64 32 13 65 192 1 70 13 0 65 120
+      33 5 12 6 11 32 9 65 1 106 34 13 32 1 79 13
+      5 65 120 33 5 32 6 65 63 113 65 8 116 32 0 32
+      13 106 45 0 0 114 34 6 32 9 79 13 5 32 13 32
+      14 32 10 65 1 113 27 33 14 32 7 65 1 106 33 7
+      32 10 32 12 114 33 12 65 0 33 10 32 6 33 9 12
+      2 11 65 120 33 5 32 6 65 63 75 13 4 65 123 33
+      5 32 9 65 1 106 34 13 32 6 106 32 1 75 13 4
+      32 11 65 1 106 34 5 32 6 106 34 15 65 255 1 75
+      13 3 2 64 32 11 65 255 1 75 13 0 32 4 65 52
+      106 32 11 106 32 6 58 0 0 32 4 65 40 106 32 5
+      32 15 32 4 65 52 106 65 128 2 65 212 131 192 128 0
+      16 129 128 128 128 0 32 4 40 2 40 32 4 40 2 44
+      32 0 32 13 106 32 6 65 228 131 192 128 0 16 133 128
+      128 128 0 32 6 65 1 106 34 5 32 9 106 33 9 32
+      5 32 11 106 33 11 12 1 11 11 11 32 11 65 128 2
+      65 196 131 192 128 0 16 140 128 128 128 0 0 11 32 4
+      65 52 106 32 11 106 65 0 58 0 0 32 14 32 9 32
+      12 65 1 113 27 34 6 65 5 106 32 1 75 13 1 32
+      0 32 1 32 6 65 1 106 16 130 128 128 128 0 33 9
+      32 0 32 1 32 6 65 3 106 16 130 128 128 128 0 33
+      6 32 4 32 3 54 2 184 2 32 4 32 2 54 2 180
+      2 65 125 33 5 32 3 69 13 1 32 2 65 1 58 0
+      0 32 4 65 1 54 2 188 2 32 4 65 32 106 32 4
+      65 180 2 106 32 8 16 131 128 128 128 0 2 64 32 4
+      40 2 32 65 1 113 69 13 0 32 4 40 2 36 33 5
+      12 2 11 32 4 40 2 188 2 34 1 32 4 40 2 184
+      2 34 3 32 1 32 3 75 27 33 0 32 11 65 1 106
+      34 13 173 33 16 32 4 40 2 180 2 33 2 2 64 3
+      64 2 64 32 16 66 255 0 86 13 0 32 1 32 3 79
+      13 4 32 2 32 1 106 32 16 60 0 0 32 11 32 1
+      106 65 2 106 34 0 32 3 75 13 4 32 4 65 24 106
+      32 1 65 1 106 32 0 32 2 32 3 65 164 131 192 128
+      0 16 129 128 128 128 0 32 4 40 2 24 32 4 40 2
+      28 32 4 65 52 106 32 13 65 180 131 192 128 0 16 133
+      128 128 128 0 32 4 32 0 54 2 188 2 32 4 65 16
+      106 32 4 65 180 2 106 32 9 16 131 128 128 128 0 32
+      4 40 2 16 65 1 113 69 13 2 32 4 40 2 20 33
+      5 12 4 11 32 0 32 1 70 13 3 32 2 32 1 106
+      32 16 167 65 128 1 114 58 0 0 32 16 66 7 136 33
+      16 32 1 65 1 106 33 1 12 0 11 11 32 4 65 8
+      106 32 4 65 180 2 106 32 6 16 131 128 128 128 0 2
+      64 32 4 40 2 8 65 1 113 69 13 0 32 4 40 2
+      12 33 5 12 2 11 32 4 40 2 188 2 34 1 32 4
+      40 2 184 2 79 13 1 32 4 40 2 180 2 32 1 106
+      65 255 1 58 0 0 32 1 65 1 106 33 5 12 1 11
+      65 121 33 5 11 32 4 65 192 2 106 36 128 128 128 128
+      0 32 5 11 13 0 65 0 65 0 54 2 208 133 200 128
+      0 11 177 6 2 8 127 1 126 2 64 2 64 32 1 13
+      0 32 5 65 1 106 33 6 32 0 40 2 8 33 7 65
+      45 33 8 12 1 11 65 43 65 128 128 196 0 32 0 40
+      2 8 34 7 65 128 128 128 1 113 34 1 27 33 8 32
+      1 65 21 118 32 5 106 33 6 11 2 64 2 64 32 7
+      65 128 128 128 4 113 13 0 65 0 33 2 12 1 11 2
+      64 2 64 32 3 65 16 73 13 0 32 2 32 3 16 144
+      128 128 128 0 33 1 12 1 11 2 64 32 3 13 0 65
+      0 33 1 12 1 11 32 3 65 3 113 33 9 2 64 2
+      64 32 3 65 4 79 13 0 65 0 33 10 65 0 33 1
+      12 1 11 32 3 65 12 113 33 11 65 0 33 10 65 0
+      33 1 3 64 32 1 32 2 32 10 106 34 12 44 0 0
+      65 191 127 74 106 32 12 65 1 106 44 0 0 65 191 127
+      74 106 32 12 65 2 106 44 0 0 65 191 127 74 106 32
+      12 65 3 106 44 0 0 65 191 127 74 106 33 1 32 11
+      32 10 65 4 106 34 10 71 13 0 11 11 32 9 69 13
+      0 32 2 32 10 106 33 12 3 64 32 1 32 12 44 0
+      0 65 191 127 74 106 33 1 32 12 65 1 106 33 12 32
+      9 65 127 106 34 9 13 0 11 11 32 1 32 6 106 33
+      6 11 2 64 2 64 32 6 32 0 47 1 12 34 11 79
+      13 0 2 64 2 64 2 64 32 7 65 128 128 128 8 113
+      13 0 32 11 32 6 107 33 13 65 0 33 1 65 0 33
+      11 2 64 2 64 2 64 32 7 65 29 118 65 3 113 14
+      4 2 0 1 0 2 11 32 13 33 11 12 1 11 32 13
+      65 254 255 3 113 65 1 118 33 11 11 32 7 65 255 255
+      255 0 113 33 6 32 0 40 2 4 33 9 32 0 40 2
+      0 33 10 3 64 32 1 65 255 255 3 113 32 11 65 255
+      255 3 113 79 13 2 65 1 33 12 32 1 65 1 106 33
+      1 32 10 32 6 32 9 40 2 16 17 128 128 128 128 0
+      128 128 128 128 0 69 13 0 12 5 11 11 32 0 32 0
+      41 2 8 34 14 167 65 128 128 128 255 121 113 65 176 128
+      128 128 2 114 54 2 8 65 1 33 12 32 0 40 2 0
+      34 10 32 0 40 2 4 34 9 32 8 32 2 32 3 16
+      143 128 128 128 0 13 3 65 0 33 1 32 11 32 6 107
+      65 255 255 3 113 33 2 3 64 32 1 65 255 255 3 113
+      32 2 79 13 2 65 1 33 12 32 1 65 1 106 33 1
+      32 10 65 48 32 9 40 2 16 17 128 128 128 128 0 128
+      128 128 128 0 69 13 0 12 4 11 11 65 1 33 12 32
+      10 32 9 32 8 32 2 32 3 16 143 128 128 128 0 13
+      2 32 10 32 4 32 5 32 9 40 2 12 17 129 128 128
+      128 0 128 128 128 128 0 13 2 65 0 33 1 32 13 32
+      11 107 65 255 255 3 113 33 0 3 64 32 1 65 255 255
+      3 113 34 2 32 0 73 33 12 32 2 32 0 79 13 3
+      32 1 65 1 106 33 1 32 10 32 6 32 9 40 2 16
+      17 128 128 128 128 0 128 128 128 128 0 69 13 0 12 3
+      11 11 65 1 33 12 32 10 32 4 32 5 32 9 40 2
+      12 17 129 128 128 128 0 128 128 128 128 0 13 1 32 0
+      32 14 55 2 8 65 0 15 11 65 1 33 12 32 0 40
+      2 0 34 1 32 0 40 2 4 34 10 32 8 32 2 32
+      3 16 143 128 128 128 0 13 0 32 1 32 4 32 5 32
+      10 40 2 12 17 129 128 128 128 0 128 128 128 128 0 33
+      12 11 32 12 11 193 4 1 9 127 32 0 33 3 32 2
+      33 4 2 64 32 0 65 232 7 73 13 0 32 1 65 124
+      106 33 5 65 0 33 6 32 0 33 7 2 64 2 64 3
+      64 32 7 32 7 65 144 206 0 110 34 3 65 144 206 0
+      108 107 34 8 65 255 255 3 113 65 228 0 110 33 9 2
+      64 2 64 32 2 32 6 106 34 4 65 124 106 32 2 79
+      13 0 32 5 32 2 106 34 10 32 9 65 1 116 34 11
+      45 0 244 131 192 128 0 58 0 0 32 4 65 125 106 32
+      2 73 13 1 32 4 65 125 106 32 2 65 188 133 192 128
+      0 16 140 128 128 128 0 0 11 32 4 65 124 106 32 2
+      65 188 133 192 128 0 16 140 128 128 128 0 0 11 32 10
+      65 1 106 32 11 65 245 131 192 128 0 106 45 0 0 58
+      0 0 2 64 32 4 65 126 106 32 2 79 13 0 32 10
+      65 2 106 32 8 32 9 65 228 0 108 107 65 1 116 65
+      254 255 7 113 34 9 45 0 244 131 192 128 0 58 0 0
+      32 4 65 127 106 32 2 79 13 2 32 10 65 3 106 32
+      9 65 245 131 192 128 0 106 45 0 0 58 0 0 32 5
+      65 124 106 33 5 32 6 65 124 106 33 6 32 7 65 255
+      172 226 4 75 33 4 32 3 33 7 32 4 69 13 3 12
+      1 11 11 32 4 65 126 106 32 2 65 188 133 192 128 0
+      16 140 128 128 128 0 0 11 32 4 65 127 106 32 2 65
+      188 133 192 128 0 16 140 128 128 128 0 0 11 32 2 32
+      6 106 33 4 11 2 64 2 64 32 3 65 9 75 13 0
+      32 3 33 10 32 4 33 7 12 1 11 32 3 65 255 255
+      3 113 65 228 0 110 33 10 2 64 2 64 32 4 65 126
+      106 34 7 32 2 79 13 0 32 1 32 7 106 32 3 32
+      10 65 228 0 108 107 65 255 255 3 113 65 1 116 34 6
+      45 0 244 131 192 128 0 58 0 0 32 4 65 127 106 34
+      4 32 2 79 13 1 32 1 32 4 106 32 6 65 245 131
+      192 128 0 106 45 0 0 58 0 0 12 2 11 32 7 32
+      2 65 188 133 192 128 0 16 140 128 128 128 0 0 11 32
+      4 32 2 65 188 133 192 128 0 16 140 128 128 128 0 0
+      11 2 64 2 64 32 0 69 13 0 32 10 69 13 1 11
+      2 64 32 7 65 127 106 34 7 32 2 73 13 0 32 7
+      32 2 65 188 133 192 128 0 16 140 128 128 128 0 0 11
+      32 1 32 7 106 32 10 65 1 116 45 0 245 131 192 128
+      0 58 0 0 11 32 7 11 71 1 1 127 35 128 128 128
+      128 0 65 32 107 34 3 36 128 128 128 128 0 32 3 32
+      1 54 2 16 32 3 32 0 54 2 12 32 3 65 1 59
+      1 28 32 3 32 2 54 2 24 32 3 32 3 65 12 106
+      54 2 20 32 3 65 20 106 16 128 128 128 128 0 0 11
+      95 2 1 127 1 126 35 128 128 128 128 0 65 32 107 34
+      3 36 128 128 128 128 0 32 3 32 1 54 2 12 32 3
+      32 0 54 2 8 32 3 65 129 128 128 128 0 173 66 32
+      134 34 4 32 3 65 8 106 173 132 55 3 24 32 3 32
+      4 32 3 65 12 106 173 132 55 3 16 65 168 128 192 128
+      0 32 3 65 16 106 32 2 16 139 128 128 128 0 0 11
+      81 1 1 127 35 128 128 128 128 0 65 16 107 34 2 36
+      128 128 128 128 0 32 1 65 1 65 1 65 0 32 2 65
+      6 106 32 0 40 2 0 32 2 65 6 106 65 10 16 138
+      128 128 128 0 34 0 106 65 10 32 0 107 16 137 128 128
+      128 0 33 0 32 2 65 16 106 36 128 128 128 128 0 32
+      0 11 205 2 2 1 127 1 126 35 128 128 128 128 0 65
+      32 107 34 4 36 128 128 128 128 0 2 64 2 64 2 64
+      32 0 32 2 75 13 0 32 1 32 2 75 13 1 65 129
+      128 128 128 0 173 66 32 134 33 5 32 0 32 1 77 13
+      2 32 4 32 0 54 2 8 32 4 32 1 54 2 12 32
+      4 32 5 32 4 65 12 106 173 132 55 3 24 32 4 32
+      5 32 4 65 8 106 173 132 55 3 16 65 128 128 192 128
+      0 32 4 65 16 106 32 3 16 139 128 128 128 0 0 11
+      32 4 32 0 54 2 8 32 4 32 2 54 2 12 32 4
+      65 129 128 128 128 0 173 66 32 134 34 5 32 4 65 12
+      106 173 132 55 3 24 32 4 32 5 32 4 65 8 106 173
+      132 55 3 16 65 223 128 192 128 0 32 4 65 16 106 32
+      3 16 139 128 128 128 0 0 11 32 4 32 1 54 2 8
+      32 4 32 2 54 2 12 32 4 65 129 128 128 128 0 173
+      66 32 134 34 5 32 4 65 12 106 173 132 55 3 24 32
+      4 32 5 32 4 65 8 106 173 132 55 3 16 65 152 129
+      192 128 0 32 4 65 16 106 32 3 16 139 128 128 128 0
+      0 11 32 4 32 1 54 2 8 32 4 32 2 54 2 12
+      32 4 32 5 32 4 65 12 106 173 132 55 3 24 32 4
+      32 5 32 4 65 8 106 173 132 55 3 16 65 152 129 192
+      128 0 32 4 65 16 106 32 3 16 139 128 128 128 0 0
+      11 73 0 2 64 32 2 65 128 128 196 0 70 13 0 32
+      0 32 2 32 1 40 2 16 17 128 128 128 128 0 128 128
+      128 128 0 69 13 0 65 1 15 11 2 64 32 3 13 0
+      65 0 15 11 32 0 32 3 32 4 32 1 40 2 12 17
+      129 128 128 128 0 128 128 128 128 0 11 244 6 1 8 127
+      2 64 2 64 32 1 32 0 65 3 106 65 124 113 34 2
+      32 0 107 34 3 73 13 0 32 1 32 3 107 34 4 65
+      4 73 13 0 32 4 65 3 113 33 5 65 0 33 6 65
+      0 33 1 2 64 32 2 32 0 70 13 0 65 0 33 7
+      65 0 33 1 2 64 32 0 32 2 107 34 8 65 124 75
+      13 0 65 0 33 7 65 0 33 1 3 64 32 1 32 0
+      32 7 106 34 2 44 0 0 65 191 127 74 106 32 2 65
+      1 106 44 0 0 65 191 127 74 106 32 2 65 2 106 44
+      0 0 65 191 127 74 106 32 2 65 3 106 44 0 0 65
+      191 127 74 106 33 1 32 7 65 4 106 34 7 13 0 11
+      11 32 0 32 7 106 33 2 3 64 32 1 32 2 44 0
+      0 65 191 127 74 106 33 1 32 2 65 1 106 33 2 32
+      8 65 1 106 34 8 13 0 11 11 32 0 32 3 106 33
+      8 2 64 32 5 69 13 0 32 8 32 4 65 252 255 255
+      255 7 113 106 34 2 44 0 0 65 191 127 74 33 6 32
+      5 65 1 70 13 0 32 6 32 2 44 0 1 65 191 127
+      74 106 33 6 32 5 65 2 70 13 0 32 6 32 2 44
+      0 2 65 191 127 74 106 33 6 11 32 4 65 2 118 33
+      3 32 6 32 1 106 33 7 3 64 32 8 33 4 32 3
+      69 13 2 32 3 65 192 1 32 3 65 192 1 73 27 34
+      6 65 3 113 33 5 2 64 2 64 32 6 65 2 116 34
+      9 65 240 7 113 34 1 13 0 65 0 33 2 12 1 11
+      32 4 32 1 106 33 0 65 0 33 2 32 4 33 1 3
+      64 32 1 65 12 106 40 2 0 34 8 65 127 115 65 7
+      118 32 8 65 6 118 114 65 129 130 132 8 113 32 1 65
+      8 106 40 2 0 34 8 65 127 115 65 7 118 32 8 65
+      6 118 114 65 129 130 132 8 113 32 1 65 4 106 40 2
+      0 34 8 65 127 115 65 7 118 32 8 65 6 118 114 65
+      129 130 132 8 113 32 1 40 2 0 34 8 65 127 115 65
+      7 118 32 8 65 6 118 114 65 129 130 132 8 113 32 2
+      106 106 106 106 33 2 32 1 65 16 106 34 1 32 0 71
+      13 0 11 11 32 3 32 6 107 33 3 32 4 32 9 106
+      33 8 32 2 65 8 118 65 255 129 252 7 113 32 2 65
+      255 129 252 7 113 106 65 129 128 4 108 65 16 118 32 7
+      106 33 7 32 5 69 13 0 11 32 4 32 6 65 252 1
+      113 65 2 116 106 34 2 40 2 0 34 1 65 127 115 65
+      7 118 32 1 65 6 118 114 65 129 130 132 8 113 33 1
+      2 64 32 5 65 1 70 13 0 32 2 40 2 4 34 8
+      65 127 115 65 7 118 32 8 65 6 118 114 65 129 130 132
+      8 113 32 1 106 33 1 32 5 65 2 70 13 0 32 2
+      40 2 8 34 2 65 127 115 65 7 118 32 2 65 6 118
+      114 65 129 130 132 8 113 32 1 106 33 1 11 32 1 65
+      8 118 65 255 129 28 113 32 1 65 255 129 252 7 113 106
+      65 129 128 4 108 65 16 118 32 7 106 33 7 12 1 11
+      2 64 32 1 13 0 65 0 15 11 32 1 65 3 113 33
+      8 2 64 2 64 32 1 65 4 79 13 0 65 0 33 2
+      65 0 33 7 12 1 11 32 1 65 124 113 33 3 65 0
+      33 2 65 0 33 7 3 64 32 7 32 0 32 2 106 34
+      1 44 0 0 65 191 127 74 106 32 1 65 1 106 44 0
+      0 65 191 127 74 106 32 1 65 2 106 44 0 0 65 191
+      127 74 106 32 1 65 3 106 44 0 0 65 191 127 74 106
+      33 7 32 3 32 2 65 4 106 34 2 71 13 0 11 11
+      32 8 69 13 0 32 0 32 2 106 33 1 3 64 32 7
+      32 1 44 0 0 65 191 127 74 106 33 7 32 1 65 1
+      106 33 1 32 8 65 127 106 34 8 13 0 11 11 32 7
+      11 95 2 1 127 1 126 35 128 128 128 128 0 65 32 107
+      34 3 36 128 128 128 128 0 32 3 32 1 54 2 8 32
+      3 32 0 54 2 12 32 3 65 129 128 128 128 0 173 66
+      32 134 34 4 32 3 65 12 106 173 132 55 3 24 32 3
+      32 4 32 3 65 8 106 173 132 55 3 16 65 170 130 192
+      128 0 32 3 65 16 106 32 2 16 139 128 128 128 0 0
+      11 11 214 5 1 0 65 128 128 192 0 11 204 5 22 115
+      108 105 99 101 32 105 110 100 101 120 32 115 116 97 114 116
+      115 32 97 116 32 192 13 32 98 117 116 32 101 110 100 115
+      32 97 116 32 192 0 32 105 110 100 101 120 32 111 117 116
+      32 111 102 32 98 111 117 110 100 115 58 32 116 104 101 32
+      108 101 110 32 105 115 32 192 18 32 98 117 116 32 116 104
+      101 32 105 110 100 101 120 32 105 115 32 192 0 18 114 97
+      110 103 101 32 115 116 97 114 116 32 105 110 100 101 120 32
+      192 34 32 111 117 116 32 111 102 32 114 97 110 103 101 32
+      102 111 114 32 115 108 105 99 101 32 111 102 32 108 101 110
+      103 116 104 32 192 0 16 114 97 110 103 101 32 101 110 100
+      32 105 110 100 101 120 32 192 34 32 111 117 116 32 111 102
+      32 114 97 110 103 101 32 102 111 114 32 115 108 105 99 101
+      32 111 102 32 108 101 110 103 116 104 32 192 0 47 114 117
+      115 116 99 47 101 52 48 56 57 52 55 98 102 100 50 48
+      48 97 102 52 50 100 98 51 50 50 100 97 102 48 102 97
+      100 102 101 55 101 50 54 100 51 98 100 49 47 108 105 98
+      114 97 114 121 47 99 111 114 101 47 115 114 99 47 102 109
+      116 47 110 117 109 46 114 115 0 100 110 115 47 115 114 99
+      47 108 105 98 46 114 115 0 38 99 111 112 121 95 102 114
+      111 109 95 115 108 105 99 101 58 32 115 111 117 114 99 101
+      32 115 108 105 99 101 32 108 101 110 103 116 104 32 40 192
+      43 41 32 100 111 101 115 32 110 111 116 32 109 97 116 99
+      104 32 100 101 115 116 105 110 97 116 105 111 110 32 115 108
+      105 99 101 32 108 101 110 103 116 104 32 40 192 1 41 0
+      0 0 27 1 16 0 14 0 0 0 143 0 0 0 7 0
+      0 0 27 1 16 0 14 0 0 0 143 0 0 0 33 0
+      0 0 27 1 16 0 14 0 0 0 7 1 0 0 17 0
+      0 0 27 1 16 0 14 0 0 0 7 1 0 0 49 0
+      0 0 27 1 16 0 14 0 0 0 219 0 0 0 9 0
+      0 0 27 1 16 0 14 0 0 0 220 0 0 0 12 0
+      0 0 27 1 16 0 14 0 0 0 221 0 0 0 14 0
+      0 0 48 48 48 49 48 50 48 51 48 52 48 53 48 54
+      48 55 48 56 48 57 49 48 49 49 49 50 49 51 49 52
+      49 53 49 54 49 55 49 56 49 57 50 48 50 49 50 50
+      50 51 50 52 50 53 50 54 50 55 50 56 50 57 51 48
+      51 49 51 50 51 51 51 52 51 53 51 54 51 55 51 56
+      51 57 52 48 52 49 52 50 52 51 52 52 52 53 52 54
+      52 55 52 56 52 57 53 48 53 49 53 50 53 51 53 52
+      53 53 53 54 53 55 53 56 53 57 54 48 54 49 54 50
+      54 51 54 52 54 53 54 54 54 55 54 56 54 57 55 48
+      55 49 55 50 55 51 55 52 55 53 55 54 55 55 55 56
+      55 57 56 48 56 49 56 50 56 51 56 52 56 53 56 54
+      56 55 56 56 56 57 57 48 57 49 57 50 57 51 57 52
+      57 53 57 54 57 55 57 56 57 57 207 0 16 0 75 0
+      0 0 87 2 0 0 5 0 0 0
+))
+
+  (define dns-parser-wasm-sha256 "048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57")
+
+  ;; cdb_parser.wasm: 6475 bytes, sha256 b93cf8c6eef9ab3895065465a92a5f7e15f4726577b4adad630e7ba47eb7349c
+  (define cdb-parser-wasm-bytes
+    #vu8(      0 97 115 109 1 0 0 0 1 78 12 96 2 127 127 1
+      127 96 3 127 127 127 1 127 96 1 127 0 96 4 127 127
+      127 127 0 96 5 127 127 127 127 127 0 96 1 127 1 127
+      96 0 1 127 96 4 127 127 127 127 1 127 96 0 0 96
+      6 127 127 127 127 127 127 1 127 96 3 127 127 127 0 96
+      5 127 127 127 127 127 1 127 3 23 22 2 3 0 1 3
+      4 5 6 6 5 7 8 9 1 10 10 0 3 11 0 10
+      1 4 5 1 112 1 2 2 5 4 1 0 146 2 6 25
+      3 127 1 65 128 128 192 0 11 127 0 65 168 134 196 8
+      11 127 0 65 176 134 196 8 11 7 112 9 6 109 101 109
+      111 114 121 2 0 5 97 108 108 111 99 0 6 14 99 100
+      98 95 98 117 102 102 101 114 95 112 116 114 0 7 12 99
+      100 98 95 99 97 112 97 99 105 116 121 0 8 12 99 100
+      98 95 102 105 110 97 108 105 122 101 0 9 9 99 100 98
+      95 113 117 101 114 121 0 10 5 114 101 115 101 116 0 11
+      10 95 95 100 97 116 97 95 101 110 100 3 1 11 95 95
+      104 101 97 112 95 98 97 115 101 3 2 9 7 1 0 65
+      1 11 1 16 10 139 42 22 3 0 0 11 48 0 2 64
+      32 2 65 7 73 13 0 32 0 32 2 65 121 106 54 2
+      4 32 0 32 1 65 7 106 54 2 0 15 11 65 7 32
+      2 32 2 32 3 16 145 128 128 128 0 0 11 69 0 2
+      64 2 64 2 64 32 1 14 2 0 2 1 11 65 0 65
+      0 65 164 131 192 128 0 16 143 128 128 128 0 0 11 32
+      0 47 0 0 34 1 65 8 116 32 1 65 8 118 114 15
+      11 65 1 65 1 65 180 131 192 128 0 16 143 128 128 128
+      0 0 11 171 1 1 3 127 2 64 2 64 2 64 2 64
+      32 2 32 1 79 13 0 32 2 65 1 106 34 3 32 1
+      79 13 1 32 2 65 2 106 34 4 32 1 79 13 2 32
+      2 65 3 106 34 5 32 1 73 13 3 32 5 32 1 65
+      244 131 192 128 0 16 143 128 128 128 0 0 11 32 2 32
+      1 65 196 131 192 128 0 16 143 128 128 128 0 0 11 32
+      3 32 1 65 212 131 192 128 0 16 143 128 128 128 0 0
+      11 32 4 32 1 65 228 131 192 128 0 16 143 128 128 128
+      0 0 11 32 0 32 3 106 45 0 0 65 8 116 32 0
+      32 2 106 45 0 0 114 32 0 32 4 106 45 0 0 65
+      16 116 114 32 0 32 5 106 45 0 0 65 24 116 114 11
+      153 1 1 6 127 65 0 33 4 32 3 33 5 2 64 3
+      64 65 1 33 6 65 120 33 7 32 5 32 2 79 13 1
+      32 1 32 5 106 45 0 0 34 8 65 63 75 13 1 2
+      64 32 8 13 0 32 4 65 255 1 70 13 2 32 5 32
+      3 107 65 1 106 33 7 65 0 33 6 12 2 11 65 1
+      33 6 32 5 32 8 65 1 106 65 255 1 113 34 9 106
+      34 8 32 5 73 13 1 32 8 32 2 75 13 1 32 4
+      32 9 106 34 9 32 4 73 13 1 32 8 33 5 32 9
+      33 4 32 9 65 255 1 77 13 0 11 11 32 0 32 7
+      54 2 4 32 0 32 6 54 2 0 11 44 0 2 64 32
+      1 32 3 71 13 0 2 64 32 1 69 13 0 32 0 32
+      2 32 1 252 10 0 0 11 15 11 32 1 32 3 32 4
+      16 148 128 128 128 0 0 11 72 1 1 127 65 0 65 0
+      40 2 160 134 196 136 0 34 1 32 0 65 7 106 65 120
+      113 106 34 0 54 2 160 134 196 136 0 2 64 32 0 65
+      128 128 4 75 13 0 32 1 65 160 134 192 136 0 106 15
+      11 65 0 65 128 128 4 54 2 160 134 196 136 0 65 0
+      11 8 0 65 160 134 192 128 0 11 7 0 65 128 128 128
+      8 11 191 1 1 5 127 2 64 2 64 2 64 32 0 65
+      128 16 79 13 0 65 0 33 1 12 1 11 65 126 33 2
+      65 0 33 1 32 0 65 128 128 128 8 75 13 1 65 0
+      33 2 65 0 33 3 3 64 2 64 32 3 65 128 16 71
+      13 0 32 0 33 1 12 3 11 65 160 134 192 128 0 32
+      0 32 3 16 131 128 128 128 0 33 4 2 64 65 160 134
+      192 128 0 32 0 32 3 65 4 106 16 131 128 128 128 0
+      34 5 69 13 0 65 0 33 1 32 4 65 128 16 73 13
+      2 32 5 65 255 255 255 255 1 75 13 2 32 5 65 3
+      116 34 5 32 4 106 34 4 32 5 73 13 2 32 4 32
+      0 75 13 2 11 32 3 65 8 106 33 3 12 0 11 11
+      65 123 33 2 11 65 0 32 1 54 2 164 134 196 136 0
+      32 2 11 197 11 2 20 127 1 126 35 128 128 128 128 0
+      65 48 107 34 4 36 128 128 128 128 0 2 64 2 64 65
+      0 40 2 164 134 196 136 0 34 5 13 0 65 124 33 6
+      12 1 11 2 64 32 1 65 255 125 106 65 255 125 75 13
+      0 65 126 33 6 12 1 11 65 127 33 6 32 1 32 0
+      106 34 7 32 1 73 13 0 32 3 32 2 106 34 8 65
+      160 134 196 136 0 75 13 0 32 2 65 160 134 192 136 0
+      73 13 0 32 7 65 160 134 196 136 0 75 13 0 32 0
+      65 160 134 192 136 0 73 13 0 32 8 32 3 73 13 0
+      65 133 42 33 7 65 0 33 6 2 64 3 64 32 1 32
+      6 70 13 1 32 0 32 6 106 33 8 32 6 65 1 106
+      33 6 32 7 65 33 108 32 8 45 0 0 115 33 7 12
+      0 11 11 65 160 134 192 128 0 32 5 32 7 65 3 116
+      65 248 15 113 34 6 16 131 128 128 128 0 33 9 2 64
+      2 64 2 64 2 64 2 64 65 160 134 192 128 0 32 5
+      32 6 65 4 114 16 131 128 128 128 0 34 8 13 0 32
+      3 13 1 12 4 11 32 8 65 255 255 255 255 1 77 13
+      1 12 2 11 32 2 65 255 1 58 0 0 65 1 33 6
+      12 3 11 32 8 65 3 116 34 6 32 9 106 34 10 32
+      6 73 13 0 32 10 32 5 75 13 0 32 9 65 4 106
+      33 11 32 7 65 8 118 32 8 112 33 12 65 0 33 13
+      65 0 33 14 65 0 33 15 3 64 2 64 2 64 32 14
+      32 8 70 13 0 65 160 134 192 128 0 32 5 32 12 65
+      3 116 34 6 32 9 106 16 131 128 128 128 0 33 10 65
+      160 134 192 128 0 32 5 32 11 32 6 106 16 131 128 128
+      128 0 34 6 13 1 11 32 13 32 3 79 13 3 32 2
+      32 13 106 65 255 1 58 0 0 32 13 65 1 106 33 6
+      12 4 11 2 64 32 10 32 7 71 13 0 32 6 65 128
+      16 73 13 2 32 6 65 119 75 13 2 32 6 65 8 106
+      34 16 32 5 75 13 2 65 160 134 192 128 0 32 5 32
+      6 16 131 128 128 128 0 33 10 65 160 134 192 128 0 32
+      5 32 6 65 4 106 16 131 128 128 128 0 34 17 32 10
+      32 16 106 34 6 106 34 18 32 5 75 13 2 32 6 32
+      10 73 13 2 32 18 32 17 73 13 2 32 10 32 1 71
+      13 0 2 64 2 64 2 64 32 16 32 1 106 34 10 32
+      16 73 13 0 32 10 32 5 75 13 0 32 16 65 160 134
+      192 128 0 106 32 0 32 1 16 149 128 128 128 0 13 3
+      2 64 32 15 65 63 77 13 0 65 121 33 6 12 8 11
+      32 17 32 10 106 34 6 32 17 73 13 1 32 6 32 5
+      75 13 1 65 122 33 6 32 17 65 7 73 13 7 32 10
+      65 160 134 192 128 0 106 34 10 32 17 16 130 128 128 128
+      0 33 19 32 4 65 40 106 32 10 32 17 65 148 131 192
+      128 0 16 129 128 128 128 0 32 4 40 2 44 33 16 32
+      4 40 2 40 33 18 2 64 2 64 2 64 2 64 2 64
+      2 64 2 64 32 19 65 255 255 3 113 34 19 65 126 106
+      14 5 4 6 6 4 1 0 11 2 64 32 19 65 116 106
+      14 4 4 6 6 0 6 11 32 16 65 3 73 13 13 32
+      4 65 16 106 32 18 32 16 65 2 16 132 128 128 128 0
+      32 4 40 2 20 33 18 32 4 40 2 16 65 1 113 69
+      13 1 32 18 33 6 12 13 11 32 4 65 32 106 32 18
+      32 16 65 0 16 132 128 128 128 0 32 4 40 2 36 33
+      19 32 4 40 2 32 65 1 113 69 13 1 32 19 33 6
+      12 12 11 32 18 65 2 106 32 16 71 13 11 12 3 11
+      32 4 65 24 106 32 18 32 16 32 19 16 132 128 128 128
+      0 32 4 40 2 28 33 18 32 4 40 2 24 65 1 113
+      69 13 1 32 18 33 6 12 10 11 32 4 65 8 106 32
+      18 32 16 65 0 16 132 128 128 128 0 32 4 40 2 12
+      33 6 2 64 32 4 40 2 8 34 18 65 1 113 13 0
+      32 6 32 16 70 13 2 11 32 6 65 122 32 18 65 1
+      113 27 33 6 12 9 11 32 16 32 19 32 18 106 65 20
+      106 71 13 8 11 32 10 32 17 16 130 128 128 128 0 33
+      18 32 10 45 0 6 33 20 32 10 45 0 5 33 21 32
+      10 45 0 4 33 22 32 10 45 0 3 33 23 32 10 45
+      0 2 33 19 32 4 32 10 32 17 65 132 131 192 128 0
+      16 129 128 128 128 0 65 125 33 6 32 13 32 3 79 13
+      7 32 4 40 2 4 33 16 32 4 40 2 0 33 17 32
+      2 32 13 106 65 2 58 0 0 32 13 65 1 106 34 10
+      32 3 79 13 7 32 2 32 10 106 32 18 65 8 118 58
+      0 0 32 13 65 2 106 34 10 32 3 79 13 7 32 2
+      32 10 106 32 18 58 0 0 32 13 65 3 106 34 10 32
+      3 79 13 7 32 2 32 10 106 32 19 58 0 0 32 13
+      65 4 106 34 10 32 3 79 13 7 32 2 32 10 106 32
+      23 58 0 0 32 13 65 5 106 34 10 32 3 79 13 7
+      32 2 32 10 106 32 22 58 0 0 32 13 65 6 106 34
+      10 32 3 79 13 7 32 2 32 10 106 32 21 58 0 0
+      32 13 65 7 106 34 10 32 3 79 13 7 32 2 32 10
+      106 32 20 58 0 0 32 13 65 8 106 33 10 32 16 173
+      33 24 2 64 3 64 32 24 66 128 1 84 13 1 32 3
+      32 10 70 13 9 32 2 32 10 106 32 24 167 65 128 1
+      114 58 0 0 32 24 66 7 136 33 24 32 10 65 1 106
+      33 10 12 0 11 11 32 10 32 3 79 13 7 32 2 32
+      10 106 34 18 32 24 60 0 0 32 16 32 10 106 65 1
+      106 34 13 32 3 75 13 7 32 13 32 10 77 13 2 32
+      18 65 1 106 32 16 32 17 32 16 65 148 132 192 128 0
+      16 133 128 128 128 0 32 15 65 1 106 33 15 12 3 11
+      32 16 32 10 32 5 65 164 132 192 128 0 16 145 128 128
+      128 0 0 11 32 10 32 6 32 5 65 180 132 192 128 0
+      16 145 128 128 128 0 0 11 32 10 65 1 106 34 6 32
+      6 32 16 106 32 3 65 132 132 192 128 0 16 145 128 128
+      128 0 0 11 65 0 32 12 65 1 106 34 6 32 6 32
+      8 70 27 33 12 32 14 65 1 106 33 14 12 0 11 11
+      65 123 33 6 12 1 11 65 125 33 6 11 32 4 65 48
+      106 36 128 128 128 128 0 32 6 11 13 0 65 0 65 0
+      54 2 160 134 196 136 0 11 177 6 2 8 127 1 126 2
+      64 2 64 32 1 13 0 32 5 65 1 106 33 6 32 0
+      40 2 8 33 7 65 45 33 8 12 1 11 65 43 65 128
+      128 196 0 32 0 40 2 8 34 7 65 128 128 128 1 113
+      34 1 27 33 8 32 1 65 21 118 32 5 106 33 6 11
+      2 64 2 64 32 7 65 128 128 128 4 113 13 0 65 0
+      33 2 12 1 11 2 64 2 64 32 3 65 16 73 13 0
+      32 2 32 3 16 147 128 128 128 0 33 1 12 1 11 2
+      64 32 3 13 0 65 0 33 1 12 1 11 32 3 65 3
+      113 33 9 2 64 2 64 32 3 65 4 79 13 0 65 0
+      33 10 65 0 33 1 12 1 11 32 3 65 12 113 33 11
+      65 0 33 10 65 0 33 1 3 64 32 1 32 2 32 10
+      106 34 12 44 0 0 65 191 127 74 106 32 12 65 1 106
+      44 0 0 65 191 127 74 106 32 12 65 2 106 44 0 0
+      65 191 127 74 106 32 12 65 3 106 44 0 0 65 191 127
+      74 106 33 1 32 11 32 10 65 4 106 34 10 71 13 0
+      11 11 32 9 69 13 0 32 2 32 10 106 33 12 3 64
+      32 1 32 12 44 0 0 65 191 127 74 106 33 1 32 12
+      65 1 106 33 12 32 9 65 127 106 34 9 13 0 11 11
+      32 1 32 6 106 33 6 11 2 64 2 64 32 6 32 0
+      47 1 12 34 11 79 13 0 2 64 2 64 2 64 32 7
+      65 128 128 128 8 113 13 0 32 11 32 6 107 33 13 65
+      0 33 1 65 0 33 11 2 64 2 64 2 64 32 7 65
+      29 118 65 3 113 14 4 2 0 1 0 2 11 32 13 33
+      11 12 1 11 32 13 65 254 255 3 113 65 1 118 33 11
+      11 32 7 65 255 255 255 0 113 33 6 32 0 40 2 4
+      33 9 32 0 40 2 0 33 10 3 64 32 1 65 255 255
+      3 113 32 11 65 255 255 3 113 79 13 2 65 1 33 12
+      32 1 65 1 106 33 1 32 10 32 6 32 9 40 2 16
+      17 128 128 128 128 0 128 128 128 128 0 69 13 0 12 5
+      11 11 32 0 32 0 41 2 8 34 14 167 65 128 128 128
+      255 121 113 65 176 128 128 128 2 114 54 2 8 65 1 33