From 662139c0974d07f0dc02343b493462475d2af2db Mon Sep 17 00:00:00 2001 From: Jeremy Banks <_@jeremy.ca> Date: Thu, 29 Jul 2021 07:37:02 -0400 Subject: [PATCH] feat(crypto): add std/crypto wrapping and extending runtime WebCrypto (#1025) --- .github/workflows/ci.yml | 5 +- .gitignore | 3 +- _wasm_crypto/.rustfmt.toml | 4 + _wasm_crypto/Cargo.lock | 418 ++++++ _wasm_crypto/Cargo.toml | 35 + _wasm_crypto/README.md | 25 + _wasm_crypto/_build.ts | 150 +++ _wasm_crypto/crypto.js | 400 ++++++ _wasm_crypto/crypto.wasm.js | 2492 +++++++++++++++++++++++++++++++++++ _wasm_crypto/mod.ts | 40 + _wasm_crypto/rust-toolchain | 1 + _wasm_crypto/src/digest.rs | 325 +++++ _wasm_crypto/src/lib.rs | 164 +++ _wasm_crypto/test.ts | 27 + crypto/README.md | 13 + crypto/_benches/bench.ts | 81 ++ crypto/mod.ts | 282 ++++ crypto/test.ts | 1259 ++++++++++++++++++ node/_crypto/pbkdf2.ts | 16 +- node/_crypto/pbkdf2_test.ts | 2 +- node/crypto.ts | 109 +- ws/mod.ts | 11 +- 22 files changed, 5816 insertions(+), 46 deletions(-) create mode 100644 _wasm_crypto/.rustfmt.toml create mode 100644 _wasm_crypto/Cargo.lock create mode 100644 _wasm_crypto/Cargo.toml create mode 100644 _wasm_crypto/README.md create mode 100755 _wasm_crypto/_build.ts create mode 100644 _wasm_crypto/crypto.js create mode 100644 _wasm_crypto/crypto.wasm.js create mode 100644 _wasm_crypto/mod.ts create mode 100644 _wasm_crypto/rust-toolchain create mode 100644 _wasm_crypto/src/digest.rs create mode 100644 _wasm_crypto/src/lib.rs create mode 100644 _wasm_crypto/test.ts create mode 100644 crypto/README.md create mode 100644 crypto/_benches/bench.ts create mode 100644 crypto/mod.ts create mode 100644 crypto/test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82c301ae5..8e7d357b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,7 +96,7 @@ jobs: run: |- set -o errexit shopt -s inherit_errexit - declare modifications="$(git diff --name-only HEAD~ -- ./hash/_wasm/)" + declare modifications="$(git diff --name-only HEAD~ -- ./_wasm_crypto)" declare modified="$([[ "$modifications" ]] && echo true || echo false)" echo "::set-output name=modified::$modified" echo "Hash source modified in this commit? $modified" @@ -113,6 +113,7 @@ jobs: # This must match the version in hash/_wasm/rust-toolchain: rust-version: 1.53.0 targets: wasm32-unknown-unknown + components: rustfmt - name: Set up wasm-bindgen-cli run: |- @@ -124,7 +125,7 @@ jobs: id: build if: success() && steps.source.outputs.modified == 'true' run: |- - ./hash/_wasm/build.ts + ./_wasm_crypto/_build.ts set -o errexit shopt -s inherit_errexit diff --git a/.gitignore b/.gitignore index de35b0be0..5e46fc8d1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,4 @@ package.json package-lock.json .vscode/settings.json **/cov/ -/hash/_wasm/target -/hash/_wasm/out +/_wasm_crypto/target diff --git a/_wasm_crypto/.rustfmt.toml b/_wasm_crypto/.rustfmt.toml new file mode 100644 index 000000000..00157aef2 --- /dev/null +++ b/_wasm_crypto/.rustfmt.toml @@ -0,0 +1,4 @@ +# Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +max_width = 80 +tab_spaces = 2 +edition = "2018" diff --git a/_wasm_crypto/Cargo.lock b/_wasm_crypto/Cargo.lock new file mode 100644 index 000000000..873fffc67 --- /dev/null +++ b/_wasm_crypto/Cargo.lock @@ -0,0 +1,418 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4dc07131ffa69b8072d35f5007352af944213cde02545e2103680baed38fcd" + +[[package]] +name = "blake2" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a5720225ef5daecf08657f23791354e1685a8c91a4c60c7f3d3b2892f978f4" +dependencies = [ + "crypto-mac 0.8.0", + "digest", + "opaque-debug", +] + +[[package]] +name = "blake3" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcd555c66291d5f836dbb6883b48660ece810fe25a31f3bdfb911945dff2691f" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "crypto-mac 0.11.1", + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "bumpalo" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "cc" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "crypto-mac" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "deno_std_wasm_crypto" +version = "0.0.0" +dependencies = [ + "blake2", + "blake3", + "derive_more", + "digest", + "generic-array", + "js-sys", + "md-5", + "ripemd160", + "sha-1", + "sha2", + "sha3", + "typenum", + "wasm-bindgen", +] + +[[package]] +name = "derive_more" +version = "0.99.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40eebddd2156ce1bb37b20bbe5151340a31828b1f2d22ba4141f3531710e38df" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "md-5" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" +dependencies = [ + "block-buffer", + "digest", + "opaque-debug", +] + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "proc-macro2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ripemd160" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +dependencies = [ + "block-buffer", + "digest", + "opaque-debug", +] + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "sha-1" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer", + "digest", + "keccak", + "opaque-debug", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "typenum" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "wasm-bindgen" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" diff --git a/_wasm_crypto/Cargo.toml b/_wasm_crypto/Cargo.toml new file mode 100644 index 000000000..2e5d44610 --- /dev/null +++ b/_wasm_crypto/Cargo.toml @@ -0,0 +1,35 @@ +# Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +[package] +edition = "2018" +name = "deno_std_wasm_crypto" +repository = "https://github.com/denoland/deno_std" +authors = ["the Deno authors"] +license = "MIT" +publish = false +version = "0.0.0" + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 3 + +[dependencies] +blake2 = "0.9.1" +derive_more = "0.99.16" +digest = "0.9.0" +generic-array = "0.14.4" +js-sys = "0.3.51" +md-5 = "0.9.1" +ripemd160 = "0.9.1" +sha-1 = "0.9.7" +sha2 = "0.9.5" +sha3 = "0.9.1" +typenum = "1.13.0" +wasm-bindgen = "0.2.74" + +[dependencies.blake3] +version = "1.0.0" +features = ["std", "traits-preview"] diff --git a/_wasm_crypto/README.md b/_wasm_crypto/README.md new file mode 100644 index 000000000..f4459e909 --- /dev/null +++ b/_wasm_crypto/README.md @@ -0,0 +1,25 @@ +`std/_crypto_wasm` is only for internal use, such as by `std/crypto` and +`std/node/crypto`. Its interface may not be stable between releases and it +should not be imported directly. + +## How to Build + +### Prerequisite + +Requires Rust's WASM target and the wasm-bindgen CLI. + +```sh +cargo build --target wasm32-unknown-unknown +rustup target add wasm32-unknown-unknown + +# This must match the version in hash/_wasm/Cargo.lock: +cargo install -f wasm-bindgen-cli --version 0.2.74 +``` + +### Build + +```sh +deno run --allow-all ./_build.ts +``` + +This will regenerate `./crypto.js` and `./crypto.wasm.js` from the Rust source. diff --git a/_wasm_crypto/_build.ts b/_wasm_crypto/_build.ts new file mode 100755 index 000000000..ca9f48a09 --- /dev/null +++ b/_wasm_crypto/_build.ts @@ -0,0 +1,150 @@ +#!/usr/bin/env -S deno run --allow-run --allow-read --allow-write --allow-env +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +import * as base64 from "../encoding/base64.ts"; + +const home = Deno.env.get("HOME"); +const root = new URL(".", import.meta.url).pathname; + +// Run in the same directory as this script is located. +if (new URL(import.meta.url).protocol === "file:") { + Deno.chdir(root); +} else { + console.error("build.ts can only be run locally (from a file: URL)."); + Deno.exit(1); +} + +// Format the Rust code. +if ( + !((await Deno.run({ + cmd: [ + "cargo", + "fmt", + ], + }).status()).success) +) { + console.error(`Failed to format the Rust code.`); + Deno.exit(1); +} + +// Compile the Rust code to WASM. +if ( + !((await Deno.run({ + cmd: [ + "cargo", + "build", + "--release", + "--target", + "wasm32-unknown-unknown", + ], + env: { + // eliminate some potential sources of non-determinism + SOURCE_DATE_EPOCH: "1600000000", + TZ: "UTC", + LC_ALL: "C", + RUSTFLAGS: `--remap-path-prefix=${root}=. --remap-path-prefix=${home}=~`, + }, + }).status()).success) +) { + console.error(`Failed to compile the Rust code to WASM.`); + Deno.exit(1); +} + +const copyrightLine = `// Copyright 2018-${ + new Date().getFullYear() +} the Deno authors. All rights reserved. MIT license.`; + +// Generate JavaScript bindings from WASM. +if ( + !((await Deno.run({ + cmd: [ + "wasm-bindgen", + "./target/wasm32-unknown-unknown/release/deno_std_wasm_crypto.wasm", + "--target", + "deno", + "--weak-refs", + "--out-dir", + "./target/wasm32-bindgen-deno-js", + ], + }).status()).success) +) { + console.error(`Failed to generate JavaScript bindings from WASM.`); + Deno.exit(1); +} + +// Encode WASM binary as a TypeScript module. +const generatedWasm = await Deno.readFile( + "./target/wasm32-bindgen-deno-js/deno_std_wasm_crypto_bg.wasm", +); + +// Format WASM binary size with _ thousands separators for human readablity, +// so that any changes in size will be clear in diffs. +const formattedWasmSize = generatedWasm.length.toString().padStart( + Math.ceil(generatedWasm.length.toString().length / 3) * 3, +).replace(/...\B/g, "$&_").trim(); + +// Generate a hash of the WASM in the format required by subresource integrity. +const wasmIntegrity = `sha256-${ + base64.encode(await crypto.subtle!.digest("SHA-256", generatedWasm)) +}`; + +const wasmJs = `${copyrightLine} +// This file is automatically @generated by _build.ts +// It is not intended for manual editing. +import * as base64 from "../encoding/base64.ts"; + +export const size = ${formattedWasmSize}; +export const name = "crypto.wasm"; +export const type = "application/wasm"; +export const hash = ${JSON.stringify(wasmIntegrity)}; +export const data = base64.decode("\\\n${ + base64.encode(generatedWasm).replace(/.{78}/g, "$&\\\n") +}\\\n"); + +export default data; +`; + +// Modify the generated WASM bindings, replacing the runtime fetching of the +// WASM binary file with a static TypeScript import of the copy we encoded +// above. This eliminates the need for net or read permissions. +const generatedScript = await Deno.readTextFile( + "./target/wasm32-bindgen-deno-js/deno_std_wasm_crypto.js", +); +const bindingsJs = `${copyrightLine} +// This file is automatically @generated by _build.ts +// It is not intended for manual editing. +// deno-lint-ignore-file +import wasmBytes from "./crypto.wasm.js"; + +${ + generatedScript.replace( + /^const file =.*?;\nconst wasmFile =.*?;\nconst wasmModule =.*?;\n/sm, + `const wasmModule = new WebAssembly.Module(wasmBytes);`, + ) +} + +// for testing/debugging +export const _wasm = wasm; +export const _wasmModule = wasmModule; +export const _wasmInstance = wasmInstance; +export const _wasmBytes = wasmBytes; +`; + +await Deno.writeTextFile("./crypto.wasm.js", wasmJs); +await Deno.writeTextFile("./crypto.js", bindingsJs); + +// Format the generated files. +if ( + !(await Deno.run({ + cmd: [ + "deno", + "fmt", + "./crypto.wasm.js", + "./crypto.js", + ], + }).status()).success +) { + console.error( + `Failed to format generated code.`, + ); + Deno.exit(1); +} diff --git a/_wasm_crypto/crypto.js b/_wasm_crypto/crypto.js new file mode 100644 index 000000000..d19ab0df9 --- /dev/null +++ b/_wasm_crypto/crypto.js @@ -0,0 +1,400 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +// This file is automatically @generated by _build.ts +// It is not intended for manual editing. +// deno-lint-ignore-file +import wasmBytes from "./crypto.wasm.js"; + +const heap = new Array(32).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { + return heap[idx]; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 36) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +let cachedTextDecoder = new TextDecoder("utf-8", { + ignoreBOM: true, + fatal: true, +}); + +cachedTextDecoder.decode(); + +let cachegetUint8Memory0 = null; +function getUint8Memory0() { + if ( + cachegetUint8Memory0 === null || + cachegetUint8Memory0.buffer !== wasm.memory.buffer + ) { + cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachegetUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +let WASM_VECTOR_LEN = 0; + +let cachedTextEncoder = new TextEncoder("utf-8"); + +const encodeString = function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +}; + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length); + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len); + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3); + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachegetInt32Memory0 = null; +function getInt32Memory0() { + if ( + cachegetInt32Memory0 === null || + cachegetInt32Memory0.buffer !== wasm.memory.buffer + ) { + cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachegetInt32Memory0; +} + +function getArrayU8FromWasm0(ptr, len) { + return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); +} +/** +* Returns the digest of the given `data` using the given hash `algorithm`. +* +* `length` will usually be left `undefined` to use the default length for +* the algorithm. For algorithms with variable-length output, it can be used +* to specify a non-negative integer number of bytes. +* +* An error will be thrown if `algorithm` is not a supported hash algorithm or +* `length` is not a supported length for the algorithm. +* @param {string} algorithm +* @param {Uint8Array} data +* @param {number | undefined} length +* @returns {Uint8Array} +*/ +export function digest(algorithm, data, length) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + var ptr0 = passStringToWasm0( + algorithm, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + var len0 = WASM_VECTOR_LEN; + wasm.digest( + retptr, + ptr0, + len0, + addHeapObject(data), + !isLikeNone(length), + isLikeNone(length) ? 0 : length, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +const DigestContextFinalization = new FinalizationRegistry((ptr) => + wasm.__wbg_digestcontext_free(ptr) +); +/** +* A context for incrementally computing a digest using a given hash algorithm. +*/ +export class DigestContext { + static __wrap(ptr) { + const obj = Object.create(DigestContext.prototype); + obj.ptr = ptr; + DigestContextFinalization.register(obj, obj.ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.ptr; + this.ptr = 0; + DigestContextFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_digestcontext_free(ptr); + } + /** + * Creates a new context incrementally computing a digest using the given + * hash algorithm. + * + * An error will be thrown if `algorithm` is not a supported hash algorithm. + * @param {string} algorithm + */ + constructor(algorithm) { + var ptr0 = passStringToWasm0( + algorithm, + wasm.__wbindgen_malloc, + wasm.__wbindgen_realloc, + ); + var len0 = WASM_VECTOR_LEN; + var ret = wasm.digestcontext_new(ptr0, len0); + return DigestContext.__wrap(ret); + } + /** + * Update the digest's internal state with the additional input `data`. + * + * If the `data` array view is large, it will be split into subarrays (via + * JavaScript bindings) which will be processed sequentially in order to + * limit the amount of memory that needs to be allocated in the WASM heap. + * @param {Uint8Array} data + */ + update(data) { + wasm.digestcontext_update(this.ptr, addHeapObject(data)); + } + /** + * Returns the digest of the input data so far. This may be called repeatedly + * without side effects. + * + * `length` will usually be left `undefined` to use the default length for + * the algorithm. For algorithms with variable-length output, it can be used + * to specify a non-negative integer number of bytes. + * + * An error will be thrown if `algorithm` is not a supported hash algorithm or + * `length` is not a supported length for the algorithm. + * @param {number | undefined} length + * @returns {Uint8Array} + */ + digest(length) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.digestcontext_digest( + retptr, + this.ptr, + !isLikeNone(length), + isLikeNone(length) ? 0 : length, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v0 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1); + return v0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Returns the digest of the input data so far, and resets this context to + * its initial state, as though it has not yet been provided with any input + * data. (It will still use the same algorithm.) + * + * `length` will usually be left `undefined` to use the default length for + * the algorithm. For algorithms with variable-length output, it can be used + * to specify a non-negative integer number of bytes. + * + * An error will be thrown if `algorithm` is not a supported hash algorithm or + * `length` is not a supported length for the algorithm. + * @param {number | undefined} length + * @returns {Uint8Array} + */ + digestAndReset(length) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.digestcontext_digestAndReset( + retptr, + this.ptr, + !isLikeNone(length), + isLikeNone(length) ? 0 : length, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v0 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1); + return v0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Returns the digest of the input data so far, and then drops the context + * from memory on the WASM side. This context must no longer be used, and any + * further method calls will result in null pointer errors being thrown. + * https://github.com/rustwasm/wasm-bindgen/blob/bf39cfd8/crates/backend/src/codegen.rs#L186 + * + * `length` will usually be left `undefined` to use the default length for + * the algorithm. For algorithms with variable-length output, it can be used + * to specify a non-negative integer number of bytes. + * + * An error will be thrown if `algorithm` is not a supported hash algorithm or + * `length` is not a supported length for the algorithm. + * @param {number | undefined} length + * @returns {Uint8Array} + */ + digestAndDrop(length) { + try { + const ptr = this.__destroy_into_raw(); + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.digestcontext_digestAndDrop( + retptr, + ptr, + !isLikeNone(length), + isLikeNone(length) ? 0 : length, + ); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v0 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 1); + return v0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Resets this context to its initial state, as though it has not yet been + * provided with any input data. (It will still use the same algorithm.) + */ + reset() { + wasm.digestcontext_reset(this.ptr); + } + /** + * Returns a new `DigestContext` that is a copy of this one, i.e., using the + * same algorithm and with a copy of the same internal state. + * + * This may be a more efficient option for computing multiple digests that + * start with a common prefix. + * @returns {DigestContext} + */ + clone() { + var ret = wasm.digestcontext_clone(this.ptr); + return DigestContext.__wrap(ret); + } +} + +const imports = { + __wbindgen_placeholder__: { + __wbg_new_f85dbdfb9cdbe2ec: function (arg0, arg1) { + var ret = new TypeError(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, + __wbindgen_object_drop_ref: function (arg0) { + takeObject(arg0); + }, + __wbg_byteLength_e0515bc94cfc5dee: function (arg0) { + var ret = getObject(arg0).byteLength; + return ret; + }, + __wbg_byteOffset_77eec84716a2e737: function (arg0) { + var ret = getObject(arg0).byteOffset; + return ret; + }, + __wbg_buffer_1c5918a4ab656ff7: function (arg0) { + var ret = getObject(arg0).buffer; + return addHeapObject(ret); + }, + __wbg_newwithbyteoffsetandlength_e57ad1f2ce812c03: function ( + arg0, + arg1, + arg2, + ) { + var ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }, + __wbg_length_2d56cb37075fcfb1: function (arg0) { + var ret = getObject(arg0).length; + return ret; + }, + __wbindgen_memory: function () { + var ret = wasm.memory; + return addHeapObject(ret); + }, + __wbg_buffer_9e184d6f785de5ed: function (arg0) { + var ret = getObject(arg0).buffer; + return addHeapObject(ret); + }, + __wbg_new_e8101319e4cf95fc: function (arg0) { + var ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }, + __wbg_set_e8ae7b27314e8b98: function (arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }, + __wbindgen_throw: function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbindgen_rethrow: function (arg0) { + throw takeObject(arg0); + }, + }, +}; + +const wasmModule = new WebAssembly.Module(wasmBytes); +const wasmInstance = new WebAssembly.Instance(wasmModule, imports); +const wasm = wasmInstance.exports; + +// for testing/debugging +export const _wasm = wasm; +export const _wasmModule = wasmModule; +export const _wasmInstance = wasmInstance; +export const _wasmBytes = wasmBytes; diff --git a/_wasm_crypto/crypto.wasm.js b/_wasm_crypto/crypto.wasm.js new file mode 100644 index 000000000..d5551f6ff --- /dev/null +++ b/_wasm_crypto/crypto.wasm.js @@ -0,0 +1,2492 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +// This file is automatically @generated by _build.ts +// It is not intended for manual editing. +import * as base64 from "../encoding/base64.ts"; + +export const size = 144_886; +export const name = "crypto.wasm"; +export const type = "application/wasm"; +export const hash = "sha256-qvYrs+ONfBCEWdVhaUJBtMeTBfsN/3yLMNynhpa8Ofo="; +export const data = base64.decode( +"\ +AGFzbQEAAAABnYGAgAAXYAAAYAABf2ABfwBgAX8Bf2ABfwF+YAJ/fwBgAn9/AX9gA39/fwBgA39/fw\ +F/YAR/f39/AGAEf39/fwF/YAV/f39/fwBgBX9/f39/AX9gBn9/f39/fwBgBn9/f39/fwF/YAV/f39+\ +fwBgB39/f35/f38Bf2AFf399f38AYAV/f3x/fwBgAn9+AGAEf31/fwBgBH98f38AYAJ+fwF/AtKFgI\ +AADRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3X2Y4NWRiZGZiOWNkYmUyZWMABhhf\ +X3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmluZGdlbl9vYmplY3RfZHJvcF9yZWYAAhhfX3diaW\ +5kZ2VuX3BsYWNlaG9sZGVyX18hX193YmdfYnl0ZUxlbmd0aF9lMDUxNWJjOTRjZmM1ZGVlAAMYX193\ +YmluZGdlbl9wbGFjZWhvbGRlcl9fIV9fd2JnX2J5dGVPZmZzZXRfNzdlZWM4NDcxNmEyZTczNwADGF\ +9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfMWM1OTE4YTRhYjY1NmZmNwADGF9f\ +d2JpbmRnZW5fcGxhY2Vob2xkZXJfXzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNT\ +dhZDFmMmNlODEyYzAzAAgYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2xlbmd0aF8yZDU2\ +Y2IzNzA3NWZjZmIxAAMYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEV9fd2JpbmRnZW5fbWVtb3J5AA\ +EYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2J1ZmZlcl85ZTE4NGQ2Zjc4NWRlNWVkAAMY\ +X193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld19lODEwMTMxOWU0Y2Y5NWZjAAMYX193Ym\ +luZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX3NldF9lOGFlN2IyNzMxNGU4Yjk4AAcYX193YmluZGdl\ +bl9wbGFjZWhvbGRlcl9fEF9fd2JpbmRnZW5fdGhyb3cABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX1\ +8SX193YmluZGdlbl9yZXRocm93AAID/YCAgAB8BwkHCQcTBQUFBwMDBw8FEAICBQUCCAYFEwwIBQUO\ +AgUFAgUIBRYHBQUFBQcHBQUFBw0FBQUFBQUFBQUFBQUFCQUNCQYJCwYGBwcHBwcFAAUCCAoHCAIFBQ\ +IIAw4MCwwLCxESCAkCCAYDBgYHBQUFAAAGAwYAAAUCBAAFAgSFgICAAAFwARYWBYOAgIAAAQARBomA\ +gIAAAX8BQYCAwAALB7aCgIAADgZtZW1vcnkCAAZkaWdlc3QAPhhfX3diZ19kaWdlc3Rjb250ZXh0X2\ +ZyZWUAXRFkaWdlc3Rjb250ZXh0X25ldwBQFGRpZ2VzdGNvbnRleHRfdXBkYXRlAGMUZGlnZXN0Y29u\ +dGV4dF9kaWdlc3QATxxkaWdlc3Rjb250ZXh0X2RpZ2VzdEFuZFJlc2V0AFEbZGlnZXN0Y29udGV4dF\ +9kaWdlc3RBbmREcm9wAEwTZGlnZXN0Y29udGV4dF9yZXNldAAeE2RpZ2VzdGNvbnRleHRfY2xvbmUA\ +GB9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAH8RX193YmluZGdlbl9tYWxsb2MAZxJfX3\ +diaW5kZ2VuX3JlYWxsb2MAcA9fX3diaW5kZ2VuX2ZyZWUAewmfgICAAAEAQQELFYABd3aHAX5pTmpr\ +aHNxbG1ub4gBVFOFAXQKxoKIgAB8kFoCAX8ifiMAQYABayIDJAAgA0EAQYABEGYhAyAAKQM4IQQgAC\ +kDMCEFIAApAyghBiAAKQMgIQcgACkDGCEIIAApAxAhCSAAKQMIIQogACkDACELAkAgAkUNACABIAJB\ +B3RqIQIDQCADIAEpAAAiDEI4hiAMQiiGQoCAgICAgMD/AIOEIAxCGIZCgICAgIDgP4MgDEIIhkKAgI\ +CA8B+DhIQgDEIIiEKAgID4D4MgDEIYiEKAgPwHg4QgDEIoiEKA/gODIAxCOIiEhIQ3AwAgAyABQQhq\ +KQAAIgxCOIYgDEIohkKAgICAgIDA/wCDhCAMQhiGQoCAgICA4D+DIAxCCIZCgICAgPAfg4SEIAxCCI\ +hCgICA+A+DIAxCGIhCgID8B4OEIAxCKIhCgP4DgyAMQjiIhISENwMIIAMgAUEQaikAACIMQjiGIAxC\ +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\ +AgBEHoD2pByAFqIARBEGpBjAEQYRogASAEQegPakHYAhBhGkEVIQUMLQsgASgCBCEFQZgDEBciAUUN\ +FSAEQegPaiAFQYABEGEaIARB6A9qQbgBaiAFQbgBaikDADcDACAEQegPakGwAWogBUGwAWopAwA3Aw\ +AgBEHoD2pBqAFqIAVBqAFqKQMANwMAIARB6A9qQaABaiAFQaABaikDADcDACAEQegPakGYAWogBUGY\ +AWopAwA3AwAgBEHoD2pBkAFqIAVBkAFqKQMANwMAIARB6A9qQYgBaiAFQYgBaikDADcDACAEIAUpA4\ +ABNwPoECAFKQOIAyERIAUoApADIQYgBSkDwAEhEiAEQRBqIARB6A9qQcABEGEaIAEgBEEQakHAARBh\ +IgcgEjcDwAEgByAFKQPIATcDyAEgB0HQAWogBUHQAWopAwA3AwAgB0HYAWogBUHYAWopAwA3AwAgB0\ +HgAWogBUHgAWopAwA3AwAgB0HoAWogBUHoAWopAwA3AwAgB0HwAWogBUHwAWopAwA3AwAgB0H4AWog\ +BUH4AWopAwA3AwAgB0GAAmogBUGAAmopAwA3AwAgB0GIAmogBUGIAmpBgAEQYRogByAGNgKQAyAHIB\ +E3A4gDQQAhBQwsCyABKAIEIQVBmAMQFyIBRQ0VIARB6A9qIAVBgAEQYRogBEHoD2pBuAFqIAVBuAFq\ +KQMANwMAIARB6A9qQbABaiAFQbABaikDADcDACAEQegPakGoAWogBUGoAWopAwA3AwAgBEHoD2pBoA\ +FqIAVBoAFqKQMANwMAIARB6A9qQZgBaiAFQZgBaikDADcDACAEQegPakGQAWogBUGQAWopAwA3AwAg\ +BEHoD2pBiAFqIAVBiAFqKQMANwMAIAQgBSkDgAE3A+gQIAUpA4gDIREgBSgCkAMhBiAFKQPAASESIA\ +EgBEHoD2pBwAEQYSIHIBI3A8ABIAcgBSkDyAE3A8gBIAdB0AFqIAVB0AFqKQMANwMAIAdB2AFqIAVB\ +2AFqKQMANwMAIAdB4AFqIAVB4AFqKQMANwMAIAdB6AFqIAVB6AFqKQMANwMAIAdB8AFqIAVB8AFqKQ\ +MANwMAIAdB+AFqIAVB+AFqKQMANwMAIAdBgAJqIAVBgAJqKQMANwMAIAdBiAJqIAVBiAJqQYABEGEa\ +IAcgBjYCkAMgByARNwOIA0EBIQUMKwsgASgCBCEFQZgDEBciAUUNFSAEQegPaiAFQYABEGEaIARB6A\ +9qQbgBaiAFQbgBaikDADcDACAEQegPakGwAWogBUGwAWopAwA3AwAgBEHoD2pBqAFqIAVBqAFqKQMA\ +NwMAIARB6A9qQaABaiAFQaABaikDADcDACAEQegPakGYAWogBUGYAWopAwA3AwAgBEHoD2pBkAFqIA\ +VBkAFqKQMANwMAIARB6A9qQYgBaiAFQYgBaikDADcDACAEIAUpA4ABNwPoECAFKQOIAyERIAUoApAD\ +IQYgBSkDwAEhEiABIARB6A9qQcABEGEiByASNwPAASAHIAUpA8gBNwPIASAHQdABaiAFQdABaikDAD\ +cDACAHQdgBaiAFQdgBaikDADcDACAHQeABaiAFQeABaikDADcDACAHQegBaiAFQegBaikDADcDACAH\ +QfABaiAFQfABaikDADcDACAHQfgBaiAFQfgBaikDADcDACAHQYACaiAFQYACaikDADcDACAHQYgCai\ +AFQYgCakGAARBhGiAHIAY2ApADIAcgETcDiANBAiEFDCoLIAEoAgQhBUHYARAXIgFFDRUgASAFKQMI\ +NwMIIAEgBSkDADcDACAFKAJwIQcgAUHIAGogBUHIAGopAwA3AwAgAUHAAGogBUHAAGopAwA3AwAgAU\ +E4aiAFQThqKQMANwMAIAFBMGogBUEwaikDADcDACABQShqIAVBKGopAwA3AwAgAUEgaiAFQSBqKQMA\ +NwMAIAFBGGogBUEYaikDADcDACABIAUpAxA3AxAgASAFKQNQNwNQIAFB2ABqIAVB2ABqKQMANwMAIA\ +FB4ABqIAVB4ABqKQMANwMAIAFB6ABqIAVB6ABqKQMANwMAIAEgBzYCcCABQYwBaiAFQYwBaikCADcC\ +ACABQYQBaiAFQYQBaikCADcCACABQfwAaiAFQfwAaikCADcCACABIAUpAnQ3AnQgAUHMAWogBUHMAW\ +opAgA3AgAgAUHEAWogBUHEAWopAgA3AgAgAUG8AWogBUG8AWopAgA3AgAgAUG0AWogBUG0AWopAgA3\ +AgAgAUGsAWogBUGsAWopAgA3AgAgAUGkAWogBUGkAWopAgA3AgAgAUGcAWogBUGcAWopAgA3AgAgAS\ +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\ +IQFyIBRQ0WIARB6A9qIAVByAEQYRogBEEQakEEciAFQcwBahBGIAQgBSgCyAE2AhAgBEHoD2pByAFq\ +IARBEGpB7AAQYRogASAEQegPakG4AhBhGkEOIQUMHgsgASgCBCEFQZgCEBciAUUNFiAEQegPaiAFQc\ +gBEGEaIARBEGpBBHIgBUHMAWoQRyAEIAUoAsgBNgIQIARB6A9qQcgBaiAEQRBqQcwAEGEaIAEgBEHo\ +D2pBmAIQYRpBDyEFDB0LIAEoAgQhBUHwABAXIgFFDRYgBSkDACERIARB6A9qQQRyIAVBDGoQNiAEIA\ +UoAgg2AugPIARBEGogBEHoD2pBxAAQYRogASARNwMAIAFBCGogBEEQakHEABBhGiABQeQAaiAFQeQA\ +aikCADcCACABQdwAaiAFQdwAaikCADcCACABQdQAaiAFQdQAaikCADcCACABIAUpAkw3AkxBECEFDB\ +wLIAEoAgQhBUHwABAXIgFFDRYgBSkDACERIARB6A9qQQRyIAVBDGoQNiAEIAUoAgg2AugPIARBEGog\ +BEHoD2pBxAAQYRogASARNwMAIAFBCGogBEEQakHEABBhGiABQeQAaiAFQeQAaikCADcCACABQdwAai\ +AFQdwAaikCADcCACABQdQAaiAFQdQAaikCADcCACABIAUpAkw3AkxBESEFDBsLIAEoAgQhBUHYARAX\ +IgFFDRYgBUEIaikDACERIAUpAwAhEiAEQegPakEEciAFQdQAahBIIAQgBSgCUDYC6A8gBEEQaiAEQe\ +gPakGEARBhGiABIBE3AwggASASNwMAIAEgBSkDEDcDECABQRhqIAVBGGopAwA3AwAgAUEgaiAFQSBq\ +KQMANwMAIAFBKGogBUEoaikDADcDACABQTBqIAVBMGopAwA3AwAgAUE4aiAFQThqKQMANwMAIAFBwA\ +BqIAVBwABqKQMANwMAIAFByABqIAVByABqKQMANwMAIAFB0ABqIARBEGpBhAEQYRpBEiEFDBoLIAEo\ +AgQhBUHYARAXIgFFDRYgBUEIaikDACERIAUpAwAhEiAEQegPakEEciAFQdQAahBIIAQgBSgCUDYC6A\ +8gBEEQaiAEQegPakGEARBhGiABIBE3AwggASASNwMAIAEgBSkDEDcDECABQRhqIAVBGGopAwA3AwAg\ +AUEgaiAFQSBqKQMANwMAIAFBKGogBUEoaikDADcDACABQTBqIAVBMGopAwA3AwAgAUE4aiAFQThqKQ\ +MANwMAIAFBwABqIAVBwABqKQMANwMAIAFByABqIAVByABqKQMANwMAIAFB0ABqIARBEGpBhAEQYRpB\ +EyEFDBkLIAEoAgQhBUH4AhAXIgFFDRYgBEHoD2ogBUHIARBhGiAEQRBqQQRyIAVBzAFqEEkgBCAFKA\ +LIATYCECAEQegPakHIAWogBEEQakGsARBhGiABIARB6A9qQfgCEGEaQRQhBQwYC0HYAkEIQQAoArSe\ +QCIEQQQgBBsRBQAAC0GYA0EIQQAoArSeQCIEQQQgBBsRBQAAC0GYA0EIQQAoArSeQCIEQQQgBBsRBQ\ +AAC0GYA0EIQQAoArSeQCIEQQQgBBsRBQAAC0HYAUEIQQAoArSeQCIEQQQgBBsRBQAAC0H4DkEIQQAo\ +ArSeQCIEQQQgBBsRBQAACxB9AAtB4AJBCEEAKAK0nkAiBEEEIAQbEQUAAAtB2AJBCEEAKAK0nkAiBE\ +EEIAQbEQUAAAtBuAJBCEEAKAK0nkAiBEEEIAQbEQUAAAtBmAJBCEEAKAK0nkAiBEEEIAQbEQUAAAtB\ +4ABBCEEAKAK0nkAiBEEEIAQbEQUAAAtB4ABBCEEAKAK0nkAiBEEEIAQbEQUAAAtB4ABBCEEAKAK0nk\ +AiBEEEIAQbEQUAAAtB4AJBCEEAKAK0nkAiBEEEIAQbEQUAAAtB2AJBCEEAKAK0nkAiBEEEIAQbEQUA\ +AAtBuAJBCEEAKAK0nkAiBEEEIAQbEQUAAAtBmAJBCEEAKAK0nkAiBEEEIAQbEQUAAAtB8ABBCEEAKA\ +K0nkAiBEEEIAQbEQUAAAtB8ABBCEEAKAK0nkAiBEEEIAQbEQUAAAtB2AFBCEEAKAK0nkAiBEEEIAQb\ +EQUAAAtB2AFBCEEAKAK0nkAiBEEEIAQbEQUAAAtB+AJBCEEAKAK0nkAiBEEEIAQbEQUAAAsgBCAGNg\ +L4ECAEIAg6ANIQIAQgCToA0RAgBCAKOgDQECAEIBE3A+gPIAEgBEHoD2pB+A4QYRpBBCEFCwJAAkAC\ +QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAk\ +ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAg4CAAECC0HAACEDIAUO\ +FgECAwQGCQoLAQ0ODxAREgEUFRYBGQEBC0HAACEHAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUOFg\ +sAAAEMAgMKCwQFBQYHCgsICQoLDAwLCyABKAKQAyEHDAoLQSAhBwwJC0EcIQcMCAtBICEHDAcLQRAh\ +BwwGC0EUIQcMBQtBHCEHDAQLQSAhBwwDC0EcIQcMAgtBICEHDAELQTAhBwsgByADRg0AIABBlYHAAD\ +YCBCAAQQE2AgAgAEEIakE5NgIAAkACQAJAIAUOFQAAAAABAgICAgICAgICAgICAgICAgILIAEQHQwf\ +CyABKAKQAUUNACABQQA2ApABCyABEB0MHQsCQAJAIAUOFgECAwQFCQoLDA0ODxAREhMUFRYXGAABCy\ +AEQRBqIAFB2AIQYRogA0F/TA0eAkACQCADDQBBASEFDAELIAMQFyIFRQ0gIAVBfGotAABBA3FFDQAg\ +BUEAIAMQZhoLIARB6A9qIARBEGpB2AIQYRogBEGgH2ogBEHoD2oQSiAEQaAfaiAFIAMQOQwbCyAEQR\ +BqIAFBmAMQYRogBEGuH2pCADcBACAEQbYfakIANwEAIARBvh9qQgA3AQAgBEHGH2pCADcBACAEQc4f\ +akIANwEAIARB1h9qQgA3AQAgBEHeH2pBADYBACAEQeIfakEAOwEAIARBADsBpB8gBEIANwGmHyAEQc\ +AANgKgHyAEQegPaiAEQaAfakHEABBhGiAEQeAeakE4aiIHIARBpBBqKQIANwMAIARB4B5qQTBqIgMg\ +BEGcEGopAgA3AwAgBEHgHmpBKGoiBiAEQZQQaikCADcDACAEQeAeakEgaiIOIARBjBBqKQIANwMAIA\ +RB4B5qQRhqIgIgBEGEEGopAgA3AwAgBEHgHmpBEGoiCyAEQfwPaikCADcDACAEQeAeakEIaiIMIARB\ +9A9qKQIANwMAIAQgBCkC7A83A+AeIARB6A9qIARBEGpBmAMQYRoCQCAEKAKoEUH/AHEiBUUNACAFQY\ +ABRg0AIARB6A9qIAVqQQBBgAEgBWsQZhoLIARB6A9qQn8QEiAEQaAfakEIaiIFIARB8BBqKQMANwMA\ +IARBoB9qQRBqIg0gBEH4EGopAwA3AwAgBEGgH2pBGGoiCCAEQYARaikDADcDACAEQaAfakEgaiIJIA\ +RBiBFqKQMANwMAIARBoB9qQShqIgogBEGQEWopAwA3AwAgBEGgH2pBMGoiDyAEQZgRaikDADcDACAE\ +QaAfakE4aiIQIARBoBFqKQMANwMAIAQgBCkD6BA3A6AfIAwgBSkDADcDACALIA0pAwA3AwAgAiAIKQ\ +MANwMAIA4gCSkDADcDACAGIAopAwA3AwAgAyAPKQMANwMAIAcgECkDADcDACAEIAQpA6AfNwPgHkHA\ +ABAXIgVFDR8gBSAEKQPgHjcAACAFQThqIARB4B5qQThqKQMANwAAIAVBMGogBEHgHmpBMGopAwA3AA\ +AgBUEoaiAEQeAeakEoaikDADcAACAFQSBqIARB4B5qQSBqKQMANwAAIAVBGGogBEHgHmpBGGopAwA3\ +AAAgBUEQaiAEQeAeakEQaikDADcAACAFQQhqIARB4B5qQQhqKQMANwAAIAEQHUHAACEDDBsLIARB6A\ +9qIAFBmAMQYRogBCAEQegPahAvIAQoAgQhAyAEKAIAIQUMGQsgBEHoD2ogAUGYAxBhGiAEQQhqIARB\ +6A9qEC8gBCgCDCEDIAQoAgghBQwYCyAEQRBqIAFB2AEQYRogBEHoD2ogBEEQakHYARBhGgJAIAQoAu\ +gPQT9xIgVFDQAgBUHAAEYNACAEQegPaiAFakEQakEAQcAAIAVrEGYaCyAEQegPakF/EBQgBEGgH2pB\ +CGogBEHAEGopAwAiETcDACAEQeAeakEIaiIHIBE3AwAgBEHgHmpBEGoiBiAEQcgQaikDADcDACAEQe\ +AeakEYaiIOIARB0BBqKQMANwMAIAQgBCkDuBAiETcDoB8gBCARNwPgHkEgIQNBIBAXIgVFDR0gBSAE\ +KQPgHjcAACAFQRhqIA4pAwA3AAAgBUEQaiAGKQMANwAAIAVBCGogBykDADcAAAwXCyAEQRBqIAFB+A\ +4QYRogA0F/TA0ZIARBEGohByADDQFBASEFDAILIARBEGogAUH4DhBhGkEgIQMgBEEQaiEHCyADEBci\ +BUUNGyAFQXxqLQAAQQNxRQ0AIAVBACADEGYaCyAEQegPaiAHQfgOEGEaIARBoB9qIARB6A9qECAgBE\ +GgH2ogBSADEBkMEwsgBEEQaiABQeACEGEaIARBrh9qQgA3AQAgBEG2H2pCADcBACAEQb4fakEAOwEA\ +IARBADsBpB8gBEIANwGmH0EcIQMgBEEcNgKgHyAEQegPakEYaiAEQaAfakEYaikDADcDACAEQegPak\ +EQaiAEQaAfakEQaikDADcDACAEQegPakEIaiAEQaAfakEIaikDADcDACAEIAQpA6AfNwPoDyAEQeAe\ +akEYaiIHIARB6A9qQRxqKAIANgIAIARB4B5qQRBqIgYgBEH8D2opAgA3AwAgBEHgHmpBCGoiDiAEQf\ +QPaikCADcDACAEIAQpAuwPNwPgHiAEQegPaiAEQRBqQeACEGEaIARB6A9qIARB4B5qED9BHBAXIgVF\ +DRogBSAEKQPgHjcAACAFQRhqIAcoAgA2AAAgBUEQaiAGKQMANwAAIAVBCGogDikDADcAAAwSCyAEQR\ +BqIAFB2AIQYRogBEGuH2pCADcBACAEQbYfakIANwEAIARBvh9qQQA2AQAgBEHCH2pBADsBACAEQQA7\ +AaQfIARCADcBph9BICEDIARBIDYCoB8gBEHoD2pBIGogBEGgH2pBIGooAgA2AgAgBEHoD2pBGGogBE\ +GgH2pBGGopAwA3AwAgBEHoD2pBEGogBEGgH2pBEGopAwA3AwAgBEHoD2pBCGogBEGgH2pBCGopAwA3\ +AwAgBCAEKQOgHzcD6A8gBEHgHmpBGGoiByAEQYQQaikCADcDACAEQeAeakEQaiIGIARB/A9qKQIANw\ +MAIARB4B5qQQhqIg4gBEH0D2opAgA3AwAgBCAEKQLsDzcD4B4gBEHoD2ogBEEQakHYAhBhGiAEQegP\ +aiAEQeAeahBAQSAQFyIFRQ0aIAUgBCkD4B43AAAgBUEYaiAHKQMANwAAIAVBEGogBikDADcAACAFQQ\ +hqIA4pAwA3AAAMEQsgBEEQaiABQbgCEGEaIARBrh9qQgA3AQAgBEG2H2pCADcBACAEQb4fakIANwEA\ +IARBxh9qQgA3AQAgBEHOH2pBADYBACAEQdIfakEAOwEAIARBADsBpB8gBEIANwGmH0EwIQMgBEEwNg\ +KgHyAEQegPakEwaiAEQaAfakEwaigCADYCACAEQegPakEoaiAEQaAfakEoaikDADcDACAEQegPakEg\ +aiAEQaAfakEgaikDADcDACAEQegPakEYaiAEQaAfakEYaikDADcDACAEQegPakEQaiAEQaAfakEQai\ +kDADcDACAEQegPakEIaiAEQaAfakEIaikDADcDACAEIAQpA6AfNwPoDyAEQeAeakEoaiIHIARBlBBq\ +KQIANwMAIARB4B5qQSBqIgYgBEGMEGopAgA3AwAgBEHgHmpBGGoiDiAEQYQQaikCADcDACAEQeAeak\ +EQaiICIARB/A9qKQIANwMAIARB4B5qQQhqIgsgBEH0D2opAgA3AwAgBCAEKQLsDzcD4B4gBEHoD2og\ +BEEQakG4AhBhGiAEQegPaiAEQeAeahA7QTAQFyIFRQ0aIAUgBCkD4B43AAAgBUEoaiAHKQMANwAAIA\ +VBIGogBikDADcAACAFQRhqIA4pAwA3AAAgBUEQaiACKQMANwAAIAVBCGogCykDADcAAAwQCyAEQRBq\ +IAFBmAIQYRogBEGuH2pCADcBACAEQbYfakIANwEAIARBvh9qQgA3AQAgBEHGH2pCADcBACAEQc4fak\ +IANwEAIARB1h9qQgA3AQAgBEHeH2pBADYBACAEQeIfakEAOwEAIARBADsBpB8gBEIANwGmH0HAACED\ +IARBwAA2AqAfIARB6A9qIARBoB9qQcQAEGEaIARB4B5qQThqIgcgBEGkEGopAgA3AwAgBEHgHmpBMG\ +oiBiAEQZwQaikCADcDACAEQeAeakEoaiIOIARBlBBqKQIANwMAIARB4B5qQSBqIgIgBEGMEGopAgA3\ +AwAgBEHgHmpBGGoiCyAEQYQQaikCADcDACAEQeAeakEQaiIMIARB/A9qKQIANwMAIARB4B5qQQhqIg\ +0gBEH0D2opAgA3AwAgBCAEKQLsDzcD4B4gBEHoD2ogBEEQakGYAhBhGiAEQegPaiAEQeAeahA0QcAA\ +EBciBUUNGiAFIAQpA+AeNwAAIAVBOGogBykDADcAACAFQTBqIAYpAwA3AAAgBUEoaiAOKQMANwAAIA\ +VBIGogAikDADcAACAFQRhqIAspAwA3AAAgBUEQaiAMKQMANwAAIAVBCGogDSkDADcAAAwPCyAEQRBq\ +IAFB4AAQYRogBEGuH2pBADYBACAEQbIfakEAOwEAIARBADsBpB8gBEIANwGmH0EQIQMgBEEQNgKgHy\ +AEQegPakEQaiAEQaAfakEQaigCADYCACAEQegPakEIaiAEQaAfakEIaikDADcDACAEQeAeakEIaiIH\ +IARB9A9qKQIANwMAIAQgBCkDoB83A+gPIAQgBCkC7A83A+AeIARB6A9qIARBEGpB4AAQYRogBEHoD2\ +ogBEHgHmoQOkEQEBciBUUNGiAFIAQpA+AeNwAAIAVBCGogBykDADcAAAwOCyAEQRBqIAFB4AAQYRog\ +BEGuH2pBADsBACAEQaAfakEQaiIFQQA6AAAgBEGxH2pBADYAACAEQbUfakEAOwAAIARBtx9qQQA6AA\ +AgBEEAOwGkHyAEQgA3AaYfQRQhAyAEQRQ2AqAfIARB6A9qQRBqIAUpAwA3AwAgBEHoD2pBCGogBEGg\ +H2pBCGopAwA3AwAgBCAEKQOgHzcD6A8gBEHgHmpBEGoiByAEQegPakEUaigCADYCACAEQeAeakEIai\ +IGIARB9A9qKQIANwMAIAQgBCkC7A83A+AeIARB6A9qIARBEGpB4AAQYRogBEHoD2ogBEHgHmoQN0EU\ +EBciBUUNGiAFIAQpA+AeNwAAIAVBEGogBygCADYAACAFQQhqIAYpAwA3AAAMDQsgBEEQaiABQeAAEG\ +EaIARBrh9qQQA7AQAgBEGgH2pBEGoiBUEAOgAAIARBsR9qQQA2AAAgBEG1H2pBADsAACAEQbcfakEA\ +OgAAIARBADsBpB8gBEIANwGmH0EUIQMgBEEUNgKgHyAEQegPakEQaiAFKQMANwMAIARB6A9qQQhqIA\ +RBoB9qQQhqKQMANwMAIAQgBCkDoB83A+gPIARB4B5qQRBqIgcgBEHoD2pBFGooAgA2AgAgBEHgHmpB\ +CGoiBiAEQfQPaikCADcDACAEIAQpAuwPNwPgHiAEQegPaiAEQRBqQeAAEGEaIARB6A9qIARB4B5qEC\ +lBFBAXIgVFDRogBSAEKQPgHjcAACAFQRBqIAcoAgA2AAAgBUEIaiAGKQMANwAADAwLIARBEGogAUHg\ +AhBhGiAEQa4fakIANwEAIARBth9qQgA3AQAgBEG+H2pBADsBACAEQQA7AaQfIARCADcBph9BHCEDIA\ +RBHDYCoB8gBEHoD2pBGGogBEGgH2pBGGopAwA3AwAgBEHoD2pBEGogBEGgH2pBEGopAwA3AwAgBEHo\ +D2pBCGogBEGgH2pBCGopAwA3AwAgBCAEKQOgHzcD6A8gBEHgHmpBGGoiByAEQegPakEcaigCADYCAC\ +AEQeAeakEQaiIGIARB/A9qKQIANwMAIARB4B5qQQhqIg4gBEH0D2opAgA3AwAgBCAEKQLsDzcD4B4g\ +BEHoD2ogBEEQakHgAhBhGiAEQegPaiAEQeAeahBBQRwQFyIFRQ0aIAUgBCkD4B43AAAgBUEYaiAHKA\ +IANgAAIAVBEGogBikDADcAACAFQQhqIA4pAwA3AAAMCwsgBEEQaiABQdgCEGEaIARBrh9qQgA3AQAg\ +BEG2H2pCADcBACAEQb4fakEANgEAIARBwh9qQQA7AQAgBEEAOwGkHyAEQgA3AaYfQSAhAyAEQSA2Aq\ +AfIARB6A9qQSBqIARBoB9qQSBqKAIANgIAIARB6A9qQRhqIARBoB9qQRhqKQMANwMAIARB6A9qQRBq\ +IARBoB9qQRBqKQMANwMAIARB6A9qQQhqIARBoB9qQQhqKQMANwMAIAQgBCkDoB83A+gPIARB4B5qQR\ +hqIgcgBEGEEGopAgA3AwAgBEHgHmpBEGoiBiAEQfwPaikCADcDACAEQeAeakEIaiIOIARB9A9qKQIA\ +NwMAIAQgBCkC7A83A+AeIARB6A9qIARBEGpB2AIQYRogBEHoD2ogBEHgHmoQQkEgEBciBUUNGiAFIA\ +QpA+AeNwAAIAVBGGogBykDADcAACAFQRBqIAYpAwA3AAAgBUEIaiAOKQMANwAADAoLIARBEGogAUG4\ +AhBhGiAEQa4fakIANwEAIARBth9qQgA3AQAgBEG+H2pCADcBACAEQcYfakIANwEAIARBzh9qQQA2AQ\ +AgBEHSH2pBADsBACAEQQA7AaQfIARCADcBph9BMCEDIARBMDYCoB8gBEHoD2pBMGogBEGgH2pBMGoo\ +AgA2AgAgBEHoD2pBKGogBEGgH2pBKGopAwA3AwAgBEHoD2pBIGogBEGgH2pBIGopAwA3AwAgBEHoD2\ +pBGGogBEGgH2pBGGopAwA3AwAgBEHoD2pBEGogBEGgH2pBEGopAwA3AwAgBEHoD2pBCGogBEGgH2pB\ +CGopAwA3AwAgBCAEKQOgHzcD6A8gBEHgHmpBKGoiByAEQZQQaikCADcDACAEQeAeakEgaiIGIARBjB\ +BqKQIANwMAIARB4B5qQRhqIg4gBEGEEGopAgA3AwAgBEHgHmpBEGoiAiAEQfwPaikCADcDACAEQeAe\ +akEIaiILIARB9A9qKQIANwMAIAQgBCkC7A83A+AeIARB6A9qIARBEGpBuAIQYRogBEHoD2ogBEHgHm\ +oQPEEwEBciBUUNGiAFIAQpA+AeNwAAIAVBKGogBykDADcAACAFQSBqIAYpAwA3AAAgBUEYaiAOKQMA\ +NwAAIAVBEGogAikDADcAACAFQQhqIAspAwA3AAAMCQsgBEEQaiABQZgCEGEaIARBrh9qQgA3AQAgBE\ +G2H2pCADcBACAEQb4fakIANwEAIARBxh9qQgA3AQAgBEHOH2pCADcBACAEQdYfakIANwEAIARB3h9q\ +QQA2AQAgBEHiH2pBADsBACAEQQA7AaQfIARCADcBph9BwAAhAyAEQcAANgKgHyAEQegPaiAEQaAfak\ +HEABBhGiAEQeAeakE4aiIHIARBpBBqKQIANwMAIARB4B5qQTBqIgYgBEGcEGopAgA3AwAgBEHgHmpB\ +KGoiDiAEQZQQaikCADcDACAEQeAeakEgaiICIARBjBBqKQIANwMAIARB4B5qQRhqIgsgBEGEEGopAg\ +A3AwAgBEHgHmpBEGoiDCAEQfwPaikCADcDACAEQeAeakEIaiINIARB9A9qKQIANwMAIAQgBCkC7A83\ +A+AeIARB6A9qIARBEGpBmAIQYRogBEHoD2ogBEHgHmoQNUHAABAXIgVFDRogBSAEKQPgHjcAACAFQT\ +hqIAcpAwA3AAAgBUEwaiAGKQMANwAAIAVBKGogDikDADcAACAFQSBqIAIpAwA3AAAgBUEYaiALKQMA\ +NwAAIAVBEGogDCkDADcAACAFQQhqIA0pAwA3AAAMCAsgBEEQaiABQfAAEGEaIARBrh9qQgA3AQAgBE\ +G2H2pCADcBACAEQb4fakEAOwEAIARBADsBpB8gBEIANwGmH0EcIQMgBEEcNgKgHyAEQegPakEYaiAE\ +QaAfakEYaikDADcDACAEQegPakEQaiAEQaAfakEQaikDADcDACAEQegPakEIaiAEQaAfakEIaikDAD\ +cDACAEIAQpA6AfNwPoDyAEQeAeakEYaiIHIARB6A9qQRxqKAIANgIAIARB4B5qQRBqIgYgBEH8D2op\ +AgA3AwAgBEHgHmpBCGoiDiAEQfQPaikCADcDACAEIAQpAuwPNwPgHiAEQegPaiAEQRBqQfAAEGEaIA\ +RB6A9qIARB4B5qEDFBHBAXIgVFDRogBSAEKQPgHjcAACAFQRhqIAcoAgA2AAAgBUEQaiAGKQMANwAA\ +IAVBCGogDikDADcAAAwHCyAEQRBqIAFB8AAQYRogBEGuH2pCADcBACAEQbYfakIANwEAIARBvh9qQQ\ +A2AQAgBEHCH2pBADsBACAEQQA7AaQfIARCADcBph9BICEDIARBIDYCoB8gBEHoD2pBIGogBEGgH2pB\ +IGooAgA2AgAgBEHoD2pBGGogBEGgH2pBGGopAwA3AwAgBEHoD2pBEGogBEGgH2pBEGopAwA3AwAgBE\ +HoD2pBCGogBEGgH2pBCGopAwA3AwAgBCAEKQOgHzcD6A8gBEHgHmpBGGoiByAEQYQQaikCADcDACAE\ +QeAeakEQaiIGIARB/A9qKQIANwMAIARB4B5qQQhqIg4gBEH0D2opAgA3AwAgBCAEKQLsDzcD4B4gBE\ +HoD2ogBEEQakHwABBhGiAEQegPaiAEQeAeahAsQSAQFyIFRQ0aIAUgBCkD4B43AAAgBUEYaiAHKQMA\ +NwAAIAVBEGogBikDADcAACAFQQhqIA4pAwA3AAAMBgsgBEEQaiABQdgBEGEaIARBrh9qQgA3AQAgBE\ +G2H2pCADcBACAEQb4fakIANwEAIARBxh9qQgA3AQAgBEHOH2pBADYBACAEQdIfakEAOwEAIARBADsB\ +pB8gBEIANwGmH0EwIQMgBEEwNgKgHyAEQegPakEwaiAEQaAfakEwaigCADYCACAEQegPakEoaiAEQa\ +AfakEoaikDADcDACAEQegPakEgaiAEQaAfakEgaikDADcDACAEQegPakEYaiAEQaAfakEYaikDADcD\ +ACAEQegPakEQaiAEQaAfakEQaikDADcDACAEQegPakEIaiAEQaAfakEIaikDADcDACAEIAQpA6AfNw\ +PoDyAEQeAeakEoaiIHIARBlBBqKQIANwMAIARB4B5qQSBqIgYgBEGMEGopAgA3AwAgBEHgHmpBGGoi\ +DiAEQYQQaikCADcDACAEQeAeakEQaiICIARB/A9qKQIANwMAIARB4B5qQQhqIgsgBEH0D2opAgA3Aw\ +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\ +AIIAJB8AFqKQMANwMAIAcgAkHoAWopAwA3AwAgBiACQeABaikDADcDACAFIAJB2AFqKQMANwMAIAMg\ +AkHQAWopAwA3AwAgAiACKQPIATcDgAFBwAAhA0HAABAXIgFFDR0gASAEKQO4AzcAACABQThqIBApAw\ +A3AAAgAUEwaiAOKQMANwAAIAFBKGogDSkDADcAACABQSBqIAwpAwA3AAAgAUEYaiALKQMANwAAIAFB\ +EGogCikDADcAACABQQhqIAkpAwA3AAAgAiACKQOIAzcDwAEgAiASQYABEGEaIAJBgAFqIgVBOGogAk\ +HIAWoiAkE4aikDADcDACAFQTBqIAJBMGopAwA3AwAgBUEoaiACQShqKQMANwMAIAVBIGogAkEgaikD\ +ADcDACAFQRhqIAJBGGopAwA3AwAgBUEQaiACQRBqKQMANwMAIAVBCGogAkEIaikDADcDACAFIAIpAw\ +A3AwBBACECDBoLIAEoAgQiAigCkAMiA0F/TA0aAkACQCADDQBBASEBIAMhBQwBCyADEBciAUUNHgJA\ +IAFBfGotAABBA3FFDQAgAUEAIAMQZhoLIAIoApADIQULAkAgAigCwAFB/wBxIgZFDQAgBkGAAUYNAC\ +ACIAZqQQBBgAEgBmsQZhoLIAJCfxASIARBEGogAkGIAWopAwA3AwAgBEEYaiACQZABaikDADcDACAE\ +QSBqIAJBmAFqKQMANwMAIARBKGogAkGgAWopAwA3AwAgBEEwaiACQagBaikDADcDACAEQThqIAJBsA\ +FqKQMANwMAIARBwABqIAJBuAFqKQMANwMAIAQgAikDgAE3AwggBUHBAE8NHiADIAVHDR8gASAEQQhq\ +IAMQYRogAiACKQOIAzcDwAEgAkGAAWoiBUE4aiACIAJBiAJqQYABEGEiAkGAAmopAwA3AwAgBUEwai\ +ACQfgBaikDADcDACAFQShqIAJB8AFqKQMANwMAIAVBIGogAkHoAWopAwA3AwAgBUEYaiACQeABaikD\ +ADcDACAFQRBqIAJB2AFqKQMANwMAIAVBCGogAkHQAWopAwA3AwAgBSACKQPIATcDAEEAIQIMGQsgAS\ +gCBCICKAKQAyIDQX9MDRkCQAJAIAMNAEEBIQEgAyEFDAELIAMQFyIBRQ0gAkAgAUF8ai0AAEEDcUUN\ +ACABQQAgAxBmGgsgAigCkAMhBQsCQCACKALAAUH/AHEiBkUNACAGQYABRg0AIAIgBmpBAEGAASAGax\ +BmGgsgAkJ/EBIgBEEQaiACQYgBaikDADcDACAEQRhqIAJBkAFqKQMANwMAIARBIGogAkGYAWopAwA3\ +AwAgBEEoaiACQaABaikDADcDACAEQTBqIAJBqAFqKQMANwMAIARBOGogAkGwAWopAwA3AwAgBEHAAG\ +ogAkG4AWopAwA3AwAgBCACKQOAATcDCCAFQcEATw0gIAMgBUcNISABIARBCGogAxBhGiACIAIpA4gD\ +NwPAASACQYABaiIFQThqIAIgAkGIAmpBgAEQYSICQYACaikDADcDACAFQTBqIAJB+AFqKQMANwMAIA\ +VBKGogAkHwAWopAwA3AwAgBUEgaiACQegBaikDADcDACAFQRhqIAJB4AFqKQMANwMAIAVBEGogAkHY\ +AWopAwA3AwAgBUEIaiACQdABaikDADcDACAFIAIpA8gBNwMAQQAhAgwYCwJAIAEoAgQiAigCAEE/cS\ +IBRQ0AIAFBwABGDQAgAiABakEQakEAQcAAIAFrEGYaCyACQX8QFCAEQQhqQQhqIAJB2ABqIgEpAgAi\ +EzcDACAEQbgDakEIaiIHIBM3AwAgBEG4A2pBEGoiCCACQeAAaiIFKQIANwMAIARBuANqQRhqIg8gAk\ +HoAGoiBikCADcDACAEIAIpAlAiEzcDCCAEIBM3A7gDIAIgAikDCDcDACACIAIpApQBNwIQIAJBGGog\ +AkGcAWopAgA3AgBBICEDIAJBIGogAkGkAWopAgA3AgAgAkEoaiACQawBaikCADcCACACQTBqIAJBtA\ +FqKQIANwIAIAJBOGogAkG8AWopAgA3AgAgAkHAAGogAkHEAWopAgA3AgAgAkHIAGogAkHMAWopAgA3\ +AgAgAiACKQJ0NwJQIAEgAkH8AGopAgA3AgAgBSACQYQBaikCADcCACAGIAJBjAFqKQIANwIAQSAQFy\ +IBRQ0hIAEgBCkDuAM3AAAgAUEYaiAPKQMANwAAIAFBEGogCCkDADcAACABQQhqIAcpAwA3AAAgAiAC\ +KQMINwMAIAJBEGoiBSACQZQBaiIGKQIANwIAIAVBCGogBkEIaikCADcCACAFQRBqIAZBEGopAgA3Ag\ +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\ +AAALQRRBAUEAKAK0nkAiBEEEIAQbEQUAAAtBHEEBQQAoArSeQCIEQQQgBBsRBQAAC0EgQQFBACgCtJ\ +5AIgRBBCAEGxEFAAALQTBBAUEAKAK0nkAiBEEEIAQbEQUAAAtBwABBAUEAKAK0nkAiBEEEIAQbEQUA\ +AAtBHEEBQQAoArSeQCIEQQQgBBsRBQAAC0EgQQFBACgCtJ5AIgRBBCAEGxEFAAALQTBBAUEAKAK0nk\ +AiBEEEIAQbEQUAAAtBwABBAUEAKAK0nkAiBEEEIAQbEQUAAAsgA0EBQQAoArSeQCIEQQQgBBsRBQAA\ +C4BBAhp/An4jAEGwAmsiAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQA\ +JAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC\ +QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhYVAQ\ +IDBAUGBwgJCgsMDQ4PEBESExQAFQsCQEGIASAAKAIEIgQoAsgBIgBrIgUgAk0NACAAIAJqIgUgAEkN\ +FyAFQYkBTw0YIARByAFqIABqQQRqIAEgAhBhGiAEIAQoAsgBIAJqNgLIAQwWCwJAAkAgAA0AIAEhBg\ +wBCyAAQYkBTw0ZIAIgBWshAiABIAVqIQYgBCAAakHMAWogASAFEGEaQQAhAANAIAQgAGoiBSAFLQAA\ +IAVBzAFqLQAAczoAACAAQQFqIgBBiAFHDQALIAQQIQsgBiACIAJBiAFwIgdrIgFqIQgCQCABQYgBSQ\ +0AA0AgBkGIAWohAiABQfh+aiEBQQAhAANAIAQgAGoiBSAFLQAAIAYgAGotAABzOgAAIABBAWoiAEGI\ +AUcNAAsgBBAhIAIhBiABQYgBTw0ACwsgBEHMAWogCCAHEGEaIAQgBzYCyAEMFQsgACgCBCABIAIQPQ\ +wUCyAAKAIEIAEgAhA9DBMLIAAoAgQiBSkDACIdp0E/cSEAAkACQCAdUA0AIABFDQELIAUgAGpBEGog\ +ASACQcAAIABrIgAgACACSxsiABBhGiAdIACtfCIeIB1UDRcgBSAeNwMAIAIgAGshAiABIABqIQELAk\ +AgAkHAAEkNACAFQRBqIQADQCAFQQAQFCAAQThqIAFBOGopAAA3AAAgAEEwaiABQTBqKQAANwAAIABB\ +KGogAUEoaikAADcAACAAQSBqIAFBIGopAAA3AAAgAEEYaiABQRhqKQAANwAAIABBEGogAUEQaikAAD\ +cAACAAQQhqIAFBCGopAAA3AAAgACABKQAANwAAIAUpAwAiHULAAHwiHiAdVA0ZIAUgHjcDACABQcAA\ +aiEBIAJBQGoiAkHAAE8NAAsLIAJFDRIgBUEAEBQgBUEQaiABIAIQYRogBSkDACIdIAKtfCIeIB1UDR\ +ggBSAeNwMADBILAkAgACgCBCIHQekAai0AAEEGdCAHLQBoaiIARQ0AIAcgASACQYAIIABrIgAgACAC\ +SxsiBRAwGiACIAVrIgJFDRIgA0H4AGpBEGogB0EQaiIAKQMANwMAIANB+ABqQRhqIAdBGGoiBCkDAD\ +cDACADQfgAakEgaiAHQSBqIgYpAwA3AwAgA0H4AGpBMGogB0EwaikDADcDACADQfgAakE4aiAHQThq\ +KQMANwMAIANB+ABqQcAAaiAHQcAAaikDADcDACADQfgAakHIAGogB0HIAGopAwA3AwAgA0H4AGpB0A\ +BqIAdB0ABqKQMANwMAIANB+ABqQdgAaiAHQdgAaikDADcDACADQfgAakHgAGogB0HgAGopAwA3AwAg\ +AyAHKQMINwOAASADIAcpAyg3A6ABIAdB6QBqLQAAIQggBy0AaiEJIAMgBy0AaCIKOgDgASADIAcpAw\ +AiHTcDeCADIAkgCEVyQQJyIgg6AOEBIANB6AFqQRhqIgkgBikCADcDACADQegBakEQaiIGIAQpAgA3\ +AwAgA0HoAWpBCGoiBCAAKQIANwMAIAMgBykCCDcD6AEgA0HoAWogA0H4AGpBKGogCiAdIAgQGiAJKA\ +IAIQggBigCACEGIAQoAgAhCSADKAKEAiEKIAMoAvwBIQsgAygC9AEhDCADKALsASENIAMoAugBIQ4g\ +ByAHKQMAECUgBygCkAEiBEE3Tw0ZIAdBkAFqIARBBXRqIgBBIGogCjYCACAAQRxqIAg2AgAgAEEYai\ +ALNgIAIABBFGogBjYCACAAQRBqIAw2AgAgAEEMaiAJNgIAIABBCGogDTYCACAAQQRqIA42AgAgByAE\ +QQFqNgKQASAHQShqIgBCADcDACAAQQhqQgA3AwAgAEEQakIANwMAIABBGGpCADcDACAAQSBqQgA3Aw\ +AgAEEoakIANwMAIABBMGpCADcDACAAQThqQgA3AwAgB0EAOwFoIAdBCGoiACAHKQNwNwMAIABBCGog\ +B0H4AGopAwA3AwAgAEEQaiAHQYABaikDADcDACAAQRhqIAdBiAFqKQMANwMAIAcgBykDAEIBfDcDAC\ +ABIAVqIQELAkAgAkGBCEkNACAHQZQBaiENIAdB8ABqIQYgBykDACEeIANBCGpBKGohCiADQQhqQQhq\ +IQwgA0H4AGpBKGohCSADQfgAakEIaiELA0AgHkIKhiEdQX8gAkEBdmd2QQFqIQUDQCAFIgBBAXYhBS\ +AdIABBf2qtg0IAUg0ACyAAQQp2rSEdAkACQCAAQYAISw0AIAlCADcDACAJQQhqIg5CADcDACAJQRBq\ +Ig9CADcDACAJQRhqIhBCADcDACAJQSBqIhFCADcDACAJQShqIhJCADcDACAJQTBqIhNCADcDACAJQT\ +hqIhRCADcDACALIAYpAwA3AwAgC0EIaiIFIAZBCGopAwA3AwAgC0EQaiIEIAZBEGopAwA3AwAgC0EY\ +aiIIIAZBGGopAwA3AwAgA0EAOwHgASADIB43A3ggAyAHLQBqOgDiASADQfgAaiABIAAQMBogDCALKQ\ +MANwMAIAxBCGogBSkDADcDACAMQRBqIAQpAwA3AwAgDEEYaiAIKQMANwMAIAogCSkDADcDACAKQQhq\ +IA4pAwA3AwAgCkEQaiAPKQMANwMAIApBGGogECkDADcDACAKQSBqIBEpAwA3AwAgCkEoaiASKQMANw\ +MAIApBMGogEykDADcDACAKQThqIBQpAwA3AwAgAy0A4gEhDiADLQDhASEPIAMgAy0A4AEiEDoAcCAD\ +IAMpA3giHjcDCCADIA4gD0VyQQJyIg46AHEgA0HoAWpBGGoiDyAIKQIANwMAIANB6AFqQRBqIhEgBC\ +kCADcDACADQegBakEIaiIEIAUpAgA3AwAgAyALKQIANwPoASADQegBaiAKIBAgHiAOEBogDygCACEI\ +IBEoAgAhDiAEKAIAIQ8gAygChAIhECADKAL8ASERIAMoAvQBIRIgAygC7AEhEyADKALoASEUIAcgBy\ +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\ +IAEgBBBhGiAAQQA2AhwgBiAHQQEQFiACIARrIQIgASAEaiEBCyAGIAEgAkEGdhAWIABBIGogASACQU\ +BxaiACQT9xIgUQYRogACAFNgIcDAoLAkBBkAEgACgCBCIEKALIASIAayIFIAJNDQAgACACaiIFIABJ\ +DS8gBUGRAU8NMCAEQcgBaiAAakEEaiABIAIQYRogBCAEKALIASACajYCyAEMCgsCQAJAIAANACABIQ\ +YMAQsgAEGRAU8NMSACIAVrIQIgASAFaiEGIAQgAGpBzAFqIAEgBRBhGkEAIQADQCAEIABqIgUgBS0A\ +ACAFQcwBai0AAHM6AAAgAEEBaiIAQZABRw0ACyAEECELIAYgAiACQZABcCIHayIBaiEIAkAgAUGQAU\ +kNAANAIAZBkAFqIQIgAUHwfmohAUEAIQADQCAEIABqIgUgBS0AACAGIABqLQAAczoAACAAQQFqIgBB\ +kAFHDQALIAQQISACIQYgAUGQAU8NAAsLIARBzAFqIAggBxBhGiAEIAc2AsgBDAkLAkBBiAEgACgCBC\ +IEKALIASIAayIFIAJNDQAgACACaiIFIABJDTEgBUGJAU8NMiAEQcgBaiAAakEEaiABIAIQYRogBCAE\ +KALIASACajYCyAEMCQsCQAJAIAANACABIQYMAQsgAEGJAU8NMyACIAVrIQIgASAFaiEGIAQgAGpBzA\ +FqIAEgBRBhGkEAIQADQCAEIABqIgUgBS0AACAFQcwBai0AAHM6AAAgAEEBaiIAQYgBRw0ACyAEECEL\ +IAYgAiACQYgBcCIHayIBaiEIAkAgAUGIAUkNAANAIAZBiAFqIQIgAUH4fmohAUEAIQADQCAEIABqIg\ +UgBS0AACAGIABqLQAAczoAACAAQQFqIgBBiAFHDQALIAQQISACIQYgAUGIAU8NAAsLIARBzAFqIAgg\ +BxBhGiAEIAc2AsgBDAgLAkBB6AAgACgCBCIEKALIASIAayIFIAJNDQAgACACaiIFIABJDTMgBUHpAE\ +8NNCAEQcgBaiAAakEEaiABIAIQYRogBCAEKALIASACajYCyAEMCAsCQAJAIAANACABIQYMAQsgAEHp\ +AE8NNSACIAVrIQIgASAFaiEGIAQgAGpBzAFqIAEgBRBhGkEAIQADQCAEIABqIgUgBS0AACAFQcwBai\ +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\ +CSACQZgDakEcaikCADcDACACQcgGaiIKIAJBmANqQRRqKQIANwMAIAJBwAZqIgsgAkGkA2opAgA3Aw\ +AgAiACKQKcAzcDuAYgBEEANgIIIARCADcDACAEIAIpA7gGNwIMIARBFGogCykDADcCACAEQRxqIAop\ +AwA3AgAgBEEkaiAJKQMANwIAIARBLGogCCkDADcCACAEQTRqIAcpAwA3AgAgBEE8aiAGKQMANwIAIA\ +RBxABqIAUpAwA3AgAgBEEAKQLwkEA3AkwgBEHUAGpBACkC+JBANwIAQQkhBQwhCyADQd+AwABBBRBe\ +DQlB4AAQFyIERQ0UIAJBCmpCADcBACACQRJqQQA7AQAgAkEUakIANwIAIAJBHGpCADcCACACQSRqQg\ +A3AgAgAkEsakIANwIAIAJBNGpCADcCACACQTxqQQA6AAAgAkE9akEANgAAIAJBwQBqQQA7AAAgAkHD\ +AGpBADoAACACQQA7AQQgAkEANgEGIAJBwAA2AgAgAkGYA2ogAkHEABBhGiACQbgGakE4aiIFIAJBmA\ +NqQTxqKQIANwMAIAJBuAZqQTBqIgYgAkGYA2pBNGopAgA3AwAgAkG4BmpBKGoiByACQZgDakEsaikC\ +ADcDACACQdgGaiIIIAJBmANqQSRqKQIANwMAIAJBuAZqQRhqIgkgAkGYA2pBHGopAgA3AwAgAkG4Bm\ +pBEGoiCiACQZgDakEUaikCADcDACACQcAGaiILIAJBpANqKQIANwMAIAIgAikCnAM3A7gGIARBGGpB\ +ACgCkJFANgIAIARBEGpBACkCiJFANwIAIARBACkCgJFANwIIIARBADYCHCAEQgA3AwAgBCACKQO4Bj\ +cCICAEQShqIAspAwA3AgAgBEEwaiAKKQMANwIAIARBOGogCSkDADcCACAEQcAAaiAIKQMANwIAIARB\ +yABqIAcpAwA3AgAgBEHQAGogBikDADcCACAEQdgAaiAFKQMANwIAQQshBQwgC0HgAhAXIgRFDRQgBE\ +EAQcgBEGYhBiACQQA2AgBBBCEFA0AgAiAFakEAOgAAIAIgAigCAEEBajYCACAFQQFqIgVBlAFHDQAL\ +IAJBmANqIAJBlAEQYRogAkG4BmogAkGYA2pBBHJBkAEQYRogBkEANgLIASAGQcwBaiACQbgGakGQAR\ +BhGkEMIQUMHwtB2AIQFyIERQ0UIARBAEHIARBmIQYgAkEANgIAQQQhBQNAIAIgBWpBADoAACACIAIo\ +AgBBAWo2AgAgBUEBaiIFQYwBRw0ACyACQZgDaiACQYwBEGEaIAJBuAZqIAJBmANqQQRyQYgBEGEaIA\ +ZBADYCyAEgBkHMAWogAkG4BmpBiAEQYRpBDSEFDB4LQbgCEBciBEUNFCAEQQBByAEQZiEGIAJBADYC\ +AEEEIQUDQCACIAVqQQA6AAAgAiACKAIAQQFqNgIAIAVBAWoiBUHsAEcNAAsgAkGYA2ogAkHsABBhGi\ +ACQbgGaiACQZgDakEEckHoABBhGiAGQQA2AsgBIAZBzAFqIAJBuAZqQegAEGEaQQ4hBQwdC0GYAhAX\ +IgRFDRQgBEEAQcgBEGYhBSACQQ5qQgA3AQAgAkEWakIANwEAIAJBHmpCADcBACACQSZqQgA3AQAgAk\ +EuakIANwEAIAJBNmpCADcBACACQT5qQgA3AQAgAkHGAGpBADYBACACQcoAakEAOwEAIAJBADsBBCAC\ +QgA3AQYgAkHIADYCACACQZgDaiACQcwAEGEaIAJBuAZqIAJBmANqQQRyQcgAEGEaIAVBADYCyAEgBU\ +HMAWogAkG4BmpByAAQYRpBDyEFDBwLQfAAEBciBEUNFCACQQpqQgA3AQAgAkESakEAOwEAIAJBFGpC\ +ADcCACACQRxqQgA3AgAgAkEkakIANwIAIAJBLGpCADcCACACQTRqQgA3AgAgAkE8akEAOgAAIAJBPW\ +pBADYAACACQcEAakEAOwAAIAJBwwBqQQA6AAAgAkHAADYCACACQQA7AQQgAkEANgEGIAJBmANqIAJB\ +xAAQYRogAkHwBmoiBiACQZgDakE8aikCADcDACACQegGaiIHIAJBmANqQTRqKQIANwMAIAJB4AZqIg\ +ggAkGYA2pBLGopAgA3AwAgAkHYBmoiCSACQZgDakEkaikCADcDACACQdAGaiIKIAJBmANqQRxqKQIA\ +NwMAQRAhBSACQbgGakEQaiILIAJBmANqQRRqKQIANwMAIAJBwAZqIgwgAkGkA2opAgA3AwAgAiACKQ\ +KcAzcDuAYgBEEANgIIIARB5ABqQQApAqiSQDcCACAEQdwAakEAKQKgkkA3AgAgBEHUAGpBACkCmJJA\ +NwIAIARBACkCkJJANwJMIARBFGogDCkDADcCACAEIAIpA7gGNwIMIARBHGogCykDADcCACAEQSRqIA\ +opAwA3AgAgBEEsaiAJKQMANwIAIARBNGogCCkDADcCACAEQTxqIAcpAwA3AgAgBEHEAGogBikDADcC\ +ACAEQgA3AwAMGwtB8AAQFyIERQ0UIAJBCmpCADcBACACQRJqQQA7AQAgAkEUakIANwIAIAJBHGpCAD\ +cCACACQSRqQgA3AgAgAkEsakIANwIAIAJBNGpCADcCACACQTxqQQA6AAAgAkE9akEANgAAIAJBwQBq\ +QQA7AAAgAkHDAGpBADoAACACQcAANgIAIAJBADsBBCACQQA2AQYgAkGYA2ogAkHEABBhGiACQfAGai\ +IFIAJBmANqQTxqKQIANwMAIAJB6AZqIgYgAkGYA2pBNGopAgA3AwAgAkHgBmoiByACQZgDakEsaikC\ +ADcDACACQdgGaiIIIAJBmANqQSRqKQIANwMAIAJB0AZqIgkgAkGYA2pBHGopAgA3AwAgAkHIBmoiCi\ +ACQZgDakEUaikCADcDACACQcAGaiILIAJBpANqKQIANwMAIAIgAikCnAM3A7gGIARBADYCCCAEQeQA\ +akEAKQLIkkA3AgAgBEHcAGpBACkCwJJANwIAIARB1ABqQQApAriSQDcCACAEQQApArCSQDcCTCAEQR\ +RqIAspAwA3AgAgBCACKQO4BjcCDCAEQRxqIAopAwA3AgAgBEEkaiAJKQMANwIAIARBLGogCCkDADcC\ +ACAEQTRqIAcpAwA3AgAgBEE8aiAGKQMANwIAIARBxABqIAUpAwA3AgAgBEIANwMAQREhBQwaC0HYAR\ +AXIgRFDRQgAkEANgIAIAJBBHIhBkEAIQUDQCAGIAVqQQA6AAAgAiACKAIAQQFqNgIAIAVBAWoiBUGA\ +AUcNAAsgAkGYA2ogAkGEARBhGiACQbgGaiACQZgDakEEckGAARBhGiAEQcgAakEAKQOIk0A3AwAgBE\ +HAAGpBACkDgJNANwMAIARBOGpBACkD+JJANwMAIARBMGpBACkD8JJANwMAIARBKGpBACkD6JJANwMA\ +IARBIGpBACkD4JJANwMAIARBGGpBACkD2JJANwMAIARBACkD0JJANwMQIARBADYCUCAEQdQAaiACQb\ +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\ +EYdCACQQh0QYCA/AdxciACQQh2QYD+A3EgAkEYdnJyIgI2AjQgAyABQThqKAAAIhdBGHQgF0EIdEGA\ +gPwHcXIgF0EIdkGA/gNxIBdBGHZyciIXNgI4IAMgAUE8aigAACIYQRh0IBhBCHRBgID8B3FyIBhBCH\ +ZBgP4DcSAYQRh2cnIiGDYCPCAIIBMgCnMgGHMgDCAQcyAVcyARIA5zIBNzIBdzQQF3IhlzQQF3Ihpz\ +QQF3IhsgCiAScyACcyAQIA9zIBRzIBhzQQF3IhxzQQF3Ih1zIBggAnMgHXMgFSAUcyAccyAbc0EBdy\ +Iec0EBdyIfcyAaIBxzIB5zIBkgGHMgG3MgFyAVcyAacyAWIBNzIBlzIAsgDHMgF3MgEiARcyAWcyAP\ +IA1zIAtzIAJzQQF3IiBzQQF3IiFzQQF3IiJzQQF3IiNzQQF3IiRzQQF3IiVzQQF3IiZzQQF3IicgHS\ +AhcyACIBZzICFzIBQgC3MgIHMgHXNBAXciKHNBAXciKXMgHCAgcyAocyAfc0EBdyIqc0EBdyIrcyAf\ +IClzICtzIB4gKHMgKnMgJ3NBAXciLHNBAXciLXMgJiAqcyAscyAlIB9zICdzICQgHnMgJnMgIyAbcy\ +AlcyAiIBpzICRzICEgGXMgI3MgICAXcyAicyApc0EBdyIuc0EBdyIvc0EBdyIwc0EBdyIxc0EBdyIy\ +c0EBdyIzc0EBdyI0c0EBdyI1ICsgL3MgKSAjcyAvcyAoICJzIC5zICtzQQF3IjZzQQF3IjdzICogLn\ +MgNnMgLXNBAXciOHNBAXciOXMgLSA3cyA5cyAsIDZzIDhzIDVzQQF3IjpzQQF3IjtzIDQgOHMgOnMg\ +MyAtcyA1cyAyICxzIDRzIDEgJ3MgM3MgMCAmcyAycyAvICVzIDFzIC4gJHMgMHMgN3NBAXciPHNBAX\ +ciPXNBAXciPnNBAXciP3NBAXciQHNBAXciQXNBAXciQnNBAXciQyA5ID1zIDcgMXMgPXMgNiAwcyA8\ +cyA5c0EBdyJEc0EBdyJFcyA4IDxzIERzIDtzQQF3IkZzQQF3IkdzIDsgRXMgR3MgOiBEcyBGcyBDc0\ +EBdyJIc0EBdyJJcyBCIEZzIEhzIEEgO3MgQ3MgQCA6cyBCcyA/IDVzIEFzID4gNHMgQHMgPSAzcyA/\ +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\ +BBAEHkm8AANgLwm0BBAEHkm8AANgLsm0BBAEHsm8AANgL4m0BBAEH0m8AANgKAnEBBAEHsm8AANgL0\ +m0BBAEH8m8AANgKInEBBAEH0m8AANgL8m0BBAEGEnMAANgKQnEBBAEH8m8AANgKEnEBBAEGMnMAANg\ +KYnEBBAEGEnMAANgKMnEBBAEGUnMAANgKgnEBBAEGMnMAANgKUnEBBAEGcnMAANgKonEBBAEGUnMAA\ +NgKcnEBBAEGknMAANgKwnEBBAEGcnMAANgKknEBBAEGsnMAANgK4nEBBAEGknMAANgKsnEBBAEG0nM\ +AANgLAnEBBAEGsnMAANgK0nEBBAEG8nMAANgLInEBBAEG0nMAANgK8nEBBAEHEnMAANgLQnEBBAEG8\ +nMAANgLEnEBBAEHMnMAANgLYnEBBAEHEnMAANgLMnEBBAEHUnMAANgLgnEBBAEHMnMAANgLUnEBBAE\ +HcnMAANgLonEBBAEHUnMAANgLcnEBBAEHknMAANgLwnEBBAEHcnMAANgLknEBBACABNgKAnkBBAEHk\ +nMAANgLsnEBBACAGQVhqIgA2AvidQCABIABBAXI2AgQgASAAakEoNgIEQQBBgICAATYCnJ5ADAILIA\ +AoAgwiB0EBcQ0AIAdBAUsNACAEIANLDQAgASADTQ0AIAAgBSAGajYCBEEAQQAoAoCeQCIAQQ9qQXhx\ +IgNBeGo2AoCeQEEAIAAgA2tBACgC+J1AIAZqIgRqQQhqIgE2AvidQCADQXxqIAFBAXI2AgAgACAEak\ +EoNgIEQQBBgICAATYCnJ5ADAELQQBBACgCoJ5AIgAgASAAIAFJGzYCoJ5AIAEgBmohBEGMnsAAIQAC\ +QAJAA0AgACgCACAERg0BIAAoAggiAA0ADAILCyAAKAIMDQAgACABNgIAIAAgACgCBCAGajYCBCABIA\ +JBA3I2AgQgASACaiEAIAQgAWsgAmshAgJAAkBBACgCgJ5AIARHDQBBACAANgKAnkBBAEEAKAL4nUAg\ +AmoiAjYC+J1AIAAgAkEBcjYCBAwBCwJAQQAoAvydQCAERw0AQQAgADYC/J1AQQBBACgC9J1AIAJqIg\ +I2AvSdQCAAIAJBAXI2AgQgACACaiACNgIADAELAkAgBCgCBCIDQQNxQQFHDQACQAJAIANBeHEiCEH/\ +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\ +agumKgIMfwJ+IwBB0BBrIgEkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAk\ +ACQAJAAkACQAJAAkACQCAARQ0AIAAoAgAiAkF/Rg0BIAAgAkEBajYCACAAQQRqIQICQAJAAkACQAJA\ +AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIEDhYBAgMEBQYHCAkKCwwNDg8QER\ +ITFBUAAQsgAigCBCEDQdgCEBciAkUNFyABQcABaiADQcgBEGEaIAFBBHIgA0HMAWoQRCABIAMoAsgB\ +NgIAIAFBwAFqQcgBaiABQYwBEGEaIAIgAUHAAWpB2AIQYRpBFSEDDC8LIAIoAgQhA0GYAxAXIgJFDR\ +cgAUHAAWogA0GAARBhGiABQcABakG4AWogA0G4AWopAwA3AwAgAUHAAWpBsAFqIANBsAFqKQMANwMA\ +IAFBwAFqQagBaiADQagBaikDADcDACABQcABakGgAWogA0GgAWopAwA3AwAgAUHAAWpBmAFqIANBmA\ +FqKQMANwMAIAFBwAFqQZABaiADQZABaikDADcDACABQcABakGIAWogA0GIAWopAwA3AwAgASADKQOA\ +ATcDwAIgAykDiAMhDSADKAKQAyEEIAMpA8ABIQ4gAiABIAFBwAFqQcABEGFBwAEQYSIFIA43A8ABIA\ +UgAykDyAE3A8gBIAVB0AFqIANB0AFqKQMANwMAIAVB2AFqIANB2AFqKQMANwMAIAVB4AFqIANB4AFq\ +KQMANwMAIAVB6AFqIANB6AFqKQMANwMAIAVB8AFqIANB8AFqKQMANwMAIAVB+AFqIANB+AFqKQMANw\ +MAIAVBgAJqIANBgAJqKQMANwMAIAVBiAJqIANBiAJqQYABEGEaIAUgBDYCkAMgBSANNwOIA0EAIQMM\ +LgsgAigCBCEDQZgDEBciAkUNFyABQcABaiADQYABEGEaIAFBwAFqQbgBaiADQbgBaikDADcDACABQc\ +ABakGwAWogA0GwAWopAwA3AwAgAUHAAWpBqAFqIANBqAFqKQMANwMAIAFBwAFqQaABaiADQaABaikD\ +ADcDACABQcABakGYAWogA0GYAWopAwA3AwAgAUHAAWpBkAFqIANBkAFqKQMANwMAIAFBwAFqQYgBai\ +ADQYgBaikDADcDACABIAMpA4ABNwPAAiADKQOIAyENIAMoApADIQQgAykDwAEhDiACIAFBwAFqQcAB\ +EGEiBSAONwPAASAFIAMpA8gBNwPIASAFQdABaiADQdABaikDADcDACAFQdgBaiADQdgBaikDADcDAC\ +AFQeABaiADQeABaikDADcDACAFQegBaiADQegBaikDADcDACAFQfABaiADQfABaikDADcDACAFQfgB\ +aiADQfgBaikDADcDACAFQYACaiADQYACaikDADcDACAFQYgCaiADQYgCakGAARBhGiAFIAQ2ApADIA\ +UgDTcDiANBASEDDC0LIAIoAgQhA0GYAxAXIgJFDRcgAUHAAWogA0GAARBhGiABQcABakG4AWogA0G4\ +AWopAwA3AwAgAUHAAWpBsAFqIANBsAFqKQMANwMAIAFBwAFqQagBaiADQagBaikDADcDACABQcABak\ +GgAWogA0GgAWopAwA3AwAgAUHAAWpBmAFqIANBmAFqKQMANwMAIAFBwAFqQZABaiADQZABaikDADcD\ +ACABQcABakGIAWogA0GIAWopAwA3AwAgASADKQOAATcDwAIgAykDiAMhDSADKAKQAyEEIAMpA8ABIQ\ +4gAiABQcABakHAARBhIgUgDjcDwAEgBSADKQPIATcDyAEgBUHQAWogA0HQAWopAwA3AwAgBUHYAWog\ +A0HYAWopAwA3AwAgBUHgAWogA0HgAWopAwA3AwAgBUHoAWogA0HoAWopAwA3AwAgBUHwAWogA0HwAW\ +opAwA3AwAgBUH4AWogA0H4AWopAwA3AwAgBUGAAmogA0GAAmopAwA3AwAgBUGIAmogA0GIAmpBgAEQ\ +YRogBSAENgKQAyAFIA03A4gDQQIhAwwsCyACKAIEIQNB2AEQFyICRQ0XIAIgAykDCDcDCCACIAMpAw\ +A3AwAgAygCcCEFIAJByABqIANByABqKQMANwMAIAJBwABqIANBwABqKQMANwMAIAJBOGogA0E4aikD\ +ADcDACACQTBqIANBMGopAwA3AwAgAkEoaiADQShqKQMANwMAIAJBIGogA0EgaikDADcDACACQRhqIA\ +NBGGopAwA3AwAgAiADKQMQNwMQIAIgAykDUDcDUCACQdgAaiADQdgAaikDADcDACACQeAAaiADQeAA\ +aikDADcDACACQegAaiADQegAaikDADcDACACIAU2AnAgAkGMAWogA0GMAWopAgA3AgAgAkGEAWogA0\ +GEAWopAgA3AgAgAkH8AGogA0H8AGopAgA3AgAgAiADKQJ0NwJ0IAJBzAFqIANBzAFqKQIANwIAIAJB\ +xAFqIANBxAFqKQIANwIAIAJBvAFqIANBvAFqKQIANwIAIAJBtAFqIANBtAFqKQIANwIAIAJBrAFqIA\ +NBrAFqKQIANwIAIAJBpAFqIANBpAFqKQIANwIAIAJBnAFqIANBnAFqKQIANwIAIAIgAykClAE3ApQB\ +QQMhAwwrCyACKAIEIQNB+A4QFyICRQ0XIAFBwAFqQYgBaiADQYgBaikDADcDACABQcABakGAAWogA0\ +GAAWopAwA3AwAgAUHAAWpB+ABqIANB+ABqKQMANwMAIAFBwAFqQRBqIANBEGopAwA3AwAgAUHAAWpB\ +GGogA0EYaikDADcDACABQcABakEgaiADQSBqKQMANwMAIAFBwAFqQTBqIANBMGopAwA3AwAgAUHAAW\ +pBOGogA0E4aikDADcDACABQcABakHAAGogA0HAAGopAwA3AwAgAUHAAWpByABqIANByABqKQMANwMA\ +IAFBwAFqQdAAaiADQdAAaikDADcDACABQcABakHYAGogA0HYAGopAwA3AwAgAUHAAWpB4ABqIANB4A\ +BqKQMANwMAIAEgAykDcDcDsAIgASADKQMINwPIASABIAMpAyg3A+gBIAMpAwAhDSADLQBqIQYgAy0A\ +aSEHIAMtAGghCAJAIAMoApABQQV0IgQNAEEAIQQMKgsgAUEYaiIJIANBlAFqIgNBGGopAAA3AwAgAU\ +EQaiIKIANBEGopAAA3AwAgAUEIaiILIANBCGopAAA3AwAgASADKQAANwMAIANBIGohBSAEQWBqIQwg\ +AUHAAWpBlAFqIQNBASEEA0AgBEE4Rg0ZIAMgASkDADcAACADQRhqIAkpAwA3AAAgA0EQaiAKKQMANw\ +AAIANBCGogCykDADcAACAMRQ0qIAkgBUEYaikAADcDACAKIAVBEGopAAA3AwAgCyAFQQhqKQAANwMA\ +IAEgBSkAADcDACADQSBqIQMgBEEBaiEEIAxBYGohDCAFQSBqIQUMAAsLIAIoAgQhA0HgAhAXIgJFDR\ +ggAUHAAWogA0HIARBhGiABQQRyIANBzAFqEEUgASADKALIATYCACABQcABakHIAWogAUGUARBhGiAC\ +IAFBwAFqQeACEGEaQQUhAwwpCyACKAIEIQNB2AIQFyICRQ0YIAFBwAFqIANByAEQYRogAUEEciADQc\ +wBahBEIAEgAygCyAE2AgAgAUHAAWpByAFqIAFBjAEQYRogAiABQcABakHYAhBhGkEGIQMMKAsgAigC\ +BCEDQbgCEBciAkUNGCABQcABaiADQcgBEGEaIAFBBHIgA0HMAWoQRiABIAMoAsgBNgIAIAFBwAFqQc\ +gBaiABQewAEGEaIAIgAUHAAWpBuAIQYRpBByEDDCcLIAIoAgQhA0GYAhAXIgJFDRggAUHAAWogA0HI\ +ARBhGiABQQRyIANBzAFqEEcgASADKALIATYCACABQcABakHIAWogAUHMABBhGiACIAFBwAFqQZgCEG\ +EaQQghAwwmCyACKAIEIQNB4AAQFyICRQ0YIAMpAwAhDSABQcABakEEciADQQxqEDYgASADKAIINgLA\ +ASABIAFBwAFqQcQAEGEhBSACIA03AwAgAkEIaiAFQcQAEGEaIAJB1ABqIANB1ABqKQIANwIAIAIgAy\ +kCTDcCTEEJIQMMJQsgAigCBCEDQeAAEBciAkUNGCABQcAQaiIFIANBEGopAwA3AwAgAUG4EGpBEGoi\ +BCADQRhqKAIANgIAIAEgAykDCDcDuBAgAykDACENIAFBwAFqQQRyIANBIGoQNiABIAMoAhw2AsABIA\ +EgAUHAAWpBxAAQYSEDIAIgDTcDACACIAMpA7gQNwMIIAJBEGogBSkDADcDACACQRhqIAQoAgA2AgAg\ +AkEcaiADQcQAEGEaQQohAwwkCyACKAIEIQNB4AAQFyICRQ0YIAFBwBBqIgUgA0EQaikDADcDACABQb\ +gQakEQaiIEIANBGGooAgA2AgAgASADKQMINwO4ECADKQMAIQ0gAUHAAWpBBHIgA0EgahA2IAEgAygC\ +HDYCwAEgASABQcABakHEABBhIQMgAiANNwMAIAIgAykDuBA3AwggAkEQaiAFKQMANwMAIAJBGGogBC\ +gCADYCACACQRxqIANBxAAQYRpBCyEDDCMLIAIoAgQhA0HgAhAXIgJFDRggAUHAAWogA0HIARBhGiAB\ +QQRyIANBzAFqEEUgASADKALIATYCACABQcABakHIAWogAUGUARBhGiACIAFBwAFqQeACEGEaQQwhAw\ +wiCyACKAIEIQNB2AIQFyICRQ0YIAFBwAFqIANByAEQYRogAUEEciADQcwBahBEIAEgAygCyAE2AgAg\ +AUHAAWpByAFqIAFBjAEQYRogAiABQcABakHYAhBhGkENIQMMIQsgAigCBCEDQbgCEBciAkUNGCABQc\ +ABaiADQcgBEGEaIAFBBHIgA0HMAWoQRiABIAMoAsgBNgIAIAFBwAFqQcgBaiABQewAEGEaIAIgAUHA\ +AWpBuAIQYRpBDiEDDCALIAIoAgQhA0GYAhAXIgJFDRggAUHAAWogA0HIARBhGiABQQRyIANBzAFqEE\ +cgASADKALIATYCACABQcABakHIAWogAUHMABBhGiACIAFBwAFqQZgCEGEaQQ8hAwwfCyACKAIEIQNB\ +8AAQFyICRQ0YIAMpAwAhDSABQcABakEEciADQQxqEDYgASADKAIINgLAASABIAFBwAFqQcQAEGEhBS\ +ACIA03AwAgAkEIaiAFQcQAEGEaIAJB5ABqIANB5ABqKQIANwIAIAJB3ABqIANB3ABqKQIANwIAIAJB\ +1ABqIANB1ABqKQIANwIAIAIgAykCTDcCTEEQIQMMHgsgAigCBCEDQfAAEBciAkUNGCADKQMAIQ0gAU\ +HAAWpBBHIgA0EMahA2IAEgAygCCDYCwAEgASABQcABakHEABBhIQUgAiANNwMAIAJBCGogBUHEABBh\ +GiACQeQAaiADQeQAaikCADcCACACQdwAaiADQdwAaikCADcCACACQdQAaiADQdQAaikCADcCACACIA\ +MpAkw3AkxBESEDDB0LIAIoAgQhA0HYARAXIgJFDRggA0EIaikDACENIAMpAwAhDiABQcABakEEciAD\ +QdQAahBIIAEgAygCUDYCwAEgASABQcABakGEARBhIQUgAiANNwMIIAIgDjcDACACIAMpAxA3AxAgAk\ +EYaiADQRhqKQMANwMAIAJBIGogA0EgaikDADcDACACQShqIANBKGopAwA3AwAgAkEwaiADQTBqKQMA\ +NwMAIAJBOGogA0E4aikDADcDACACQcAAaiADQcAAaikDADcDACACQcgAaiADQcgAaikDADcDACACQd\ +AAaiAFQYQBEGEaQRIhAwwcCyACKAIEIQNB2AEQFyICRQ0YIANBCGopAwAhDSADKQMAIQ4gAUHAAWpB\ +BHIgA0HUAGoQSCABIAMoAlA2AsABIAEgAUHAAWpBhAEQYSEFIAIgDTcDCCACIA43AwAgAiADKQMQNw\ +MQIAJBGGogA0EYaikDADcDACACQSBqIANBIGopAwA3AwAgAkEoaiADQShqKQMANwMAIAJBMGogA0Ew\ +aikDADcDACACQThqIANBOGopAwA3AwAgAkHAAGogA0HAAGopAwA3AwAgAkHIAGogA0HIAGopAwA3Aw\ +AgAkHQAGogBUGEARBhGkETIQMMGwsgAigCBCEDQfgCEBciAkUNGCABQcABaiADQcgBEGEaIAFBBHIg\ +A0HMAWoQSSABIAMoAsgBNgIAIAFBwAFqQcgBaiABQawBEGEaIAIgAUHAAWpB+AIQYRpBFCEDDBoLEI\ +EBAAsQggEAC0HYAkEIQQAoArSeQCIBQQQgARsRBQAAC0GYA0EIQQAoArSeQCIBQQQgARsRBQAAC0GY\ +A0EIQQAoArSeQCIBQQQgARsRBQAAC0GYA0EIQQAoArSeQCIBQQQgARsRBQAAC0HYAUEIQQAoArSeQC\ +IBQQQgARsRBQAAC0H4DkEIQQAoArSeQCIBQQQgARsRBQAACxB9AAtB4AJBCEEAKAK0nkAiAUEEIAEb\ +EQUAAAtB2AJBCEEAKAK0nkAiAUEEIAEbEQUAAAtBuAJBCEEAKAK0nkAiAUEEIAEbEQUAAAtBmAJBCE\ +EAKAK0nkAiAUEEIAEbEQUAAAtB4ABBCEEAKAK0nkAiAUEEIAEbEQUAAAtB4ABBCEEAKAK0nkAiAUEE\ +IAEbEQUAAAtB4ABBCEEAKAK0nkAiAUEEIAEbEQUAAAtB4AJBCEEAKAK0nkAiAUEEIAEbEQUAAAtB2A\ +JBCEEAKAK0nkAiAUEEIAEbEQUAAAtBuAJBCEEAKAK0nkAiAUEEIAEbEQUAAAtBmAJBCEEAKAK0nkAi\ +AUEEIAEbEQUAAAtB8ABBCEEAKAK0nkAiAUEEIAEbEQUAAAtB8ABBCEEAKAK0nkAiAUEEIAEbEQUAAA\ +tB2AFBCEEAKAK0nkAiAUEEIAEbEQUAAAtB2AFBCEEAKAK0nkAiAUEEIAEbEQUAAAtB+AJBCEEAKAK0\ +nkAiAUEEIAEbEQUAAAsgASAENgLQAiABIAY6AKoCIAEgBzoAqQIgASAIOgCoAiABIA03A8ABIAIgAU\ +HAAWpB+A4QYRpBBCEDCyAAIAAoAgBBf2o2AgACQEEMEBciAEUNACAAIAI2AgggACADNgIEIABBADYC\ +ACABQdAQaiQAIAAPC0EMQQRBACgCtJ5AIgFBBCABGxEFAAALkR0CLH8BfiMAQcAAayIDJAACQAJAIA\ +JFDQADQCADIAAoAggiBCAAKAIoIgVqIAAoAhgiBmoiByAAKAIsIghqIAcgACkDACIvp3NBEHciCUHn\ +zKfQBmoiCiAGc0EUdyILaiIMIAAoAkgiB2ogACgCDCINIAAoAjAiDmogACgCHCIPaiIQIAAoAjQiEW\ +ogECAvQiCIp3NBEHciEEGF3Z7be2oiEiAPc0EUdyITaiIUIBBzQRh3IhUgEmoiFiATc0EZdyIXaiIY\ +IAAoAkwiEGogGCAAKAIUIhkgACgCQCISaiAAKAIkIhpqIhsgACgCRCITaiAbIAAtAGlBCHJzQRB0IB\ +tBEHZyIhtBuuq/qnpqIhwgGnNBFHciHWoiHiAbc0EYdyIfc0EQdyIgIAAoAhAiISAAKAI4IhtqIAAo\ +AiAiImoiIyAAKAI8IhhqICMgAC0AaHNBEHQgI0EQdnIiI0Hy5rvjA2oiJCAic0EUdyIlaiImICNzQR\ +h3IicgJGoiJGoiKCAXc0EUdyIXaiIpIA5qIB4gACgCYCIjaiAMIAlzQRh3IgwgCmoiHiALc0EZdyIK\ +aiILIAAoAmQiCWogCyAnc0EQdyILIBZqIhYgCnNBFHciCmoiJyALc0EYdyIqIBZqIhYgCnNBGXciK2\ +oiLCASaiAsIBQgACgCUCIKaiAkICVzQRl3IhRqIiQgACgCVCILaiAkIAxzQRB3IgwgHyAcaiIcaiIf\ +IBRzQRR3IiRqIiUgDHNBGHciLXNBEHciLCAmIAAoAlgiDGogHCAdc0EZdyIcaiIdIAAoAlwiFGogHS\ +AVc0EQdyIVIB5qIh0gHHNBFHciHGoiHiAVc0EYdyIVIB1qIh1qIiYgK3NBFHciK2oiLiAIaiAlIBFq\ +ICkgIHNBGHciICAoaiIlIBdzQRl3IhdqIiggCmogKCAVc0EQdyIVIBZqIhYgF3NBFHciF2oiKCAVc0\ +EYdyIVIBZqIhYgF3NBGXciF2oiKSALaiApICcgG2ogHSAcc0EZdyIcaiIdIBRqIB0gIHNBEHciHSAt\ +IB9qIh9qIiAgHHNBFHciHGoiJyAdc0EYdyIdc0EQdyIpIB4gE2ogHyAkc0EZdyIeaiIfIAVqIB8gKn\ +NBEHciHyAlaiIkIB5zQRR3Ih5qIiUgH3NBGHciHyAkaiIkaiIqIBdzQRR3IhdqIi0gEWogJyAJaiAu\ +ICxzQRh3IicgJmoiJiArc0EZdyIraiIsIAdqICwgH3NBEHciHyAWaiIWICtzQRR3IitqIiwgH3NBGH\ +ciHyAWaiIWICtzQRl3IitqIi4gG2ogLiAoIAxqICQgHnNBGXciHmoiJCAYaiAkICdzQRB3IiQgHSAg\ +aiIdaiIgIB5zQRR3Ih5qIicgJHNBGHciJHNBEHciKCAlIBBqIB0gHHNBGXciHGoiHSAjaiAdIBVzQR\ +B3IhUgJmoiHSAcc0EUdyIcaiIlIBVzQRh3IhUgHWoiHWoiJiArc0EUdyIraiIuIBJqICcgCmogLSAp\ +c0EYdyInICpqIikgF3NBGXciF2oiKiAMaiAqIBVzQRB3IhUgFmoiFiAXc0EUdyIXaiIqIBVzQRh3Ih\ +UgFmoiFiAXc0EZdyIXaiItIBhqIC0gLCATaiAdIBxzQRl3IhxqIh0gI2ogHSAnc0EQdyIdICQgIGoi\ +IGoiJCAcc0EUdyIcaiInIB1zQRh3Ih1zQRB3IiwgJSAUaiAgIB5zQRl3Ih5qIiAgDmogICAfc0EQdy\ +IfIClqIiAgHnNBFHciHmoiJSAfc0EYdyIfICBqIiBqIikgF3NBFHciF2oiLSAKaiAnIAdqIC4gKHNB\ +GHciJyAmaiImICtzQRl3IihqIisgCGogKyAfc0EQdyIfIBZqIhYgKHNBFHciKGoiKyAfc0EYdyIfIB\ +ZqIhYgKHNBGXciKGoiLiATaiAuICogEGogICAec0EZdyIeaiIgIAVqICAgJ3NBEHciICAdICRqIh1q\ +IiQgHnNBFHciHmoiJyAgc0EYdyIgc0EQdyIqICUgC2ogHSAcc0EZdyIcaiIdIAlqIB0gFXNBEHciFS\ +AmaiIdIBxzQRR3IhxqIiUgFXNBGHciFSAdaiIdaiImIChzQRR3IihqIi4gG2ogJyAMaiAtICxzQRh3\ +IicgKWoiKSAXc0EZdyIXaiIsIBBqICwgFXNBEHciFSAWaiIWIBdzQRR3IhdqIiwgFXNBGHciFSAWai\ +IWIBdzQRl3IhdqIi0gBWogLSArIBRqIB0gHHNBGXciHGoiHSAJaiAdICdzQRB3Ih0gICAkaiIgaiIk\ +IBxzQRR3IhxqIicgHXNBGHciHXNBEHciKyAlICNqICAgHnNBGXciHmoiICARaiAgIB9zQRB3Ih8gKW\ +oiICAec0EUdyIeaiIlIB9zQRh3Ih8gIGoiIGoiKSAXc0EUdyIXaiItIAxqICcgCGogLiAqc0EYdyIn\ +ICZqIiYgKHNBGXciKGoiKiASaiAqIB9zQRB3Ih8gFmoiFiAoc0EUdyIoaiIqIB9zQRh3Ih8gFmoiFi\ +Aoc0EZdyIoaiIuIBRqIC4gLCALaiAgIB5zQRl3Ih5qIiAgDmogICAnc0EQdyIgIB0gJGoiHWoiJCAe\ +c0EUdyIeaiInICBzQRh3IiBzQRB3IiwgJSAYaiAdIBxzQRl3IhxqIh0gB2ogHSAVc0EQdyIVICZqIh\ +0gHHNBFHciHGoiJSAVc0EYdyIVIB1qIh1qIiYgKHNBFHciKGoiLiATaiAnIBBqIC0gK3NBGHciJyAp\ +aiIpIBdzQRl3IhdqIisgC2ogKyAVc0EQdyIVIBZqIhYgF3NBFHciF2oiKyAVc0EYdyIVIBZqIhYgF3\ +NBGXciF2oiLSAOaiAtICogI2ogHSAcc0EZdyIcaiIdIAdqIB0gJ3NBEHciHSAgICRqIiBqIiQgHHNB\ +FHciHGoiJyAdc0EYdyIdc0EQdyIqICUgCWogICAec0EZdyIeaiIgIApqICAgH3NBEHciHyApaiIgIB\ +5zQRR3Ih5qIiUgH3NBGHciHyAgaiIgaiIpIBdzQRR3IhdqIi0gEGogJyASaiAuICxzQRh3IicgJmoi\ +JiAoc0EZdyIoaiIsIBtqICwgH3NBEHciHyAWaiIWIChzQRR3IihqIiwgH3NBGHciHyAWaiIWIChzQR\ +l3IihqIi4gI2ogLiArIBhqICAgHnNBGXciHmoiICARaiAgICdzQRB3IiAgHSAkaiIdaiIkIB5zQRR3\ +Ih5qIicgIHNBGHciIHNBEHciKyAlIAVqIB0gHHNBGXciHGoiHSAIaiAdIBVzQRB3IhUgJmoiHSAcc0\ +EUdyIcaiIlIBVzQRh3IhUgHWoiHWoiJiAoc0EUdyIoaiIuIBRqICcgC2ogLSAqc0EYdyInIClqIikg\ +F3NBGXciF2oiKiAYaiAqIBVzQRB3IhUgFmoiFiAXc0EUdyIXaiIqIBVzQRh3IhUgFmoiFiAXc0EZdy\ +IXaiItIBFqIC0gLCAJaiAdIBxzQRl3IhxqIh0gCGogHSAnc0EQdyIdICAgJGoiIGoiJCAcc0EUdyIc\ +aiInIB1zQRh3Ih1zQRB3IiwgJSAHaiAgIB5zQRl3Ih5qIiAgDGogICAfc0EQdyIfIClqIiAgHnNBFH\ +ciHmoiJSAfc0EYdyIfICBqIiBqIikgF3NBFHciF2oiLSALaiAnIBtqIC4gK3NBGHciCyAmaiImIChz\ +QRl3IidqIiggE2ogKCAfc0EQdyIfIBZqIhYgJ3NBFHciJ2oiKCAfc0EYdyIfIBZqIhYgJ3NBGXciJ2\ +oiKyAJaiArICogBWogICAec0EZdyIJaiIeIApqIB4gC3NBEHciCyAdICRqIh1qIh4gCXNBFHciCWoi\ +ICALc0EYdyILc0EQdyIkICUgDmogHSAcc0EZdyIcaiIdIBJqIB0gFXNBEHciFSAmaiIdIBxzQRR3Ih\ +xqIiUgFXNBGHciFSAdaiIdaiImICdzQRR3IidqIiogI2ogICAYaiAtICxzQRh3IhggKWoiIyAXc0EZ\ +dyIXaiIgIAVqICAgFXNBEHciBSAWaiIVIBdzQRR3IhZqIhcgBXNBGHciICAVaiIVIBZzQRl3IgVqIh\ +YgCmogFiAoIAdqIB0gHHNBGXciB2oiCiASaiAKIBhzQRB3IhIgCyAeaiIYaiIKIAdzQRR3IgdqIgsg\ +EnNBGHciEnNBEHciFiAlIAhqIBggCXNBGXciCGoiGCAQaiAYIB9zQRB3IhAgI2oiGCAIc0EUdyIjai\ +IJIBBzQRh3IgggGGoiEGoiGCAFc0EUdyIcaiIdIBZzQRh3IgUgGnM2AjwgAyAiIBQgCyATaiAqICRz\ +QRh3IhMgJmoiCyAnc0EZdyIaaiIWaiAWIAhzQRB3IgggFWoiFCAac0EUdyIaaiIVIAhzQRh3IghzNg\ +I4IAMgDyAbIAkgEWogEiAKaiIRIAdzQRl3IgdqIhJqIBIgIHNBEHciEiALaiIbIAdzQRR3IglqIgog\ +EnNBGHciB3M2AjQgAyAGIAwgFyAOaiAQICNzQRl3Ig5qIhBqIBAgE3NBEHciECARaiISIA5zQRR3Ii\ +NqIhMgEHNBGHciDnM2AjAgAyAhIAUgGGoiEXM2AiggAyANIAggFGoiEHM2AiQgAyARIApzNgIIIAMg\ +ECATczYCBCADIBkgDiASaiISczYCLCADIAQgByAbaiITczYCICADIBIgFXM2AgwgAyATIB1zNgIAIA\ +MgESAcc0EZdyAHczYCFCADIBAgGnNBGXcgDnM2AhAgAyATIAlzQRl3IAVzNgIcIAMgEiAjc0EZdyAI\ +czYCGCAALQBwIgVBwQBPDQIgASADIAVqQcAAIAVrIgUgAiACIAVLGyIFEGEhCCAAIAAtAHAgBWoiBz\ +oAcCACIAVrIQICQCAHQf8BcUHAAEcNACAAQQA6AHAgACAAKQMAQgF8NwMACyAIIAVqIQEgAg0ACwsg\ +A0HAAGokAA8LIAVBwABBuIfAABBXAAuVGwEgfyAAIAAoAgAgASgAACIFaiAAKAIQIgZqIgcgASgABC\ +IIaiAHIAOnc0EQdyIJQefMp9AGaiIKIAZzQRR3IgtqIgwgASgAICIGaiAAKAIEIAEoAAgiB2ogACgC\ +FCINaiIOIAEoAAwiD2ogDiADQiCIp3NBEHciDkGF3Z7be2oiECANc0EUdyINaiIRIA5zQRh3IhIgEG\ +oiEyANc0EZdyIUaiIVIAEoACQiDWogFSAAKAIMIAEoABgiDmogACgCHCIWaiIXIAEoABwiEGogFyAE\ +Qf8BcXNBEHQgF0EQdnIiF0G66r+qemoiGCAWc0EUdyIWaiIZIBdzQRh3IhpzQRB3IhsgACgCCCABKA\ +AQIhdqIAAoAhgiHGoiFSABKAAUIgRqIBUgAkH/AXFzQRB0IBVBEHZyIhVB8ua74wNqIgIgHHNBFHci\ +HGoiHSAVc0EYdyIeIAJqIh9qIiAgFHNBFHciFGoiISAHaiAZIAEoADgiFWogDCAJc0EYdyIMIApqIh\ +kgC3NBGXciCWoiCiABKAA8IgJqIAogHnNBEHciCiATaiILIAlzQRR3IglqIhMgCnNBGHciHiALaiIi\ +IAlzQRl3IiNqIgsgDmogCyARIAEoACgiCWogHyAcc0EZdyIRaiIcIAEoACwiCmogHCAMc0EQdyIMIB\ +ogGGoiGGoiGiARc0EUdyIRaiIcIAxzQRh3IgxzQRB3Ih8gHSABKAAwIgtqIBggFnNBGXciFmoiGCAB\ +KAA0IgFqIBggEnNBEHciEiAZaiIYIBZzQRR3IhZqIhkgEnNBGHciEiAYaiIYaiIdICNzQRR3IiNqIi\ +QgCGogHCAPaiAhIBtzQRh3IhsgIGoiHCAUc0EZdyIUaiIgIAlqICAgEnNBEHciEiAiaiIgIBRzQRR3\ +IhRqIiEgEnNBGHciEiAgaiIgIBRzQRl3IhRqIiIgCmogIiATIBdqIBggFnNBGXciE2oiFiABaiAWIB\ +tzQRB3IhYgDCAaaiIMaiIYIBNzQRR3IhNqIhogFnNBGHciFnNBEHciGyAZIBBqIAwgEXNBGXciDGoi\ +ESAFaiARIB5zQRB3IhEgHGoiGSAMc0EUdyIMaiIcIBFzQRh3IhEgGWoiGWoiHiAUc0EUdyIUaiIiIA\ +9qIBogAmogJCAfc0EYdyIaIB1qIh0gI3NBGXciH2oiIyAGaiAjIBFzQRB3IhEgIGoiICAfc0EUdyIf\ +aiIjIBFzQRh3IhEgIGoiICAfc0EZdyIfaiIkIBdqICQgISALaiAZIAxzQRl3IgxqIhkgBGogGSAac0\ +EQdyIZIBYgGGoiFmoiGCAMc0EUdyIMaiIaIBlzQRh3IhlzQRB3IiEgHCANaiAWIBNzQRl3IhNqIhYg\ +FWogFiASc0EQdyISIB1qIhYgE3NBFHciE2oiHCASc0EYdyISIBZqIhZqIh0gH3NBFHciH2oiJCAOai\ +AaIAlqICIgG3NBGHciGiAeaiIbIBRzQRl3IhRqIh4gC2ogHiASc0EQdyISICBqIh4gFHNBFHciFGoi\ +ICASc0EYdyISIB5qIh4gFHNBGXciFGoiIiAEaiAiICMgEGogFiATc0EZdyITaiIWIBVqIBYgGnNBEH\ +ciFiAZIBhqIhhqIhkgE3NBFHciE2oiGiAWc0EYdyIWc0EQdyIiIBwgAWogGCAMc0EZdyIMaiIYIAdq\ +IBggEXNBEHciESAbaiIYIAxzQRR3IgxqIhsgEXNBGHciESAYaiIYaiIcIBRzQRR3IhRqIiMgCWogGi\ +AGaiAkICFzQRh3IhogHWoiHSAfc0EZdyIfaiIhIAhqICEgEXNBEHciESAeaiIeIB9zQRR3Ih9qIiEg\ +EXNBGHciESAeaiIeIB9zQRl3Ih9qIiQgEGogJCAgIA1qIBggDHNBGXciDGoiGCAFaiAYIBpzQRB3Ih\ +ggFiAZaiIWaiIZIAxzQRR3IgxqIhogGHNBGHciGHNBEHciICAbIApqIBYgE3NBGXciE2oiFiACaiAW\ +IBJzQRB3IhIgHWoiFiATc0EUdyITaiIbIBJzQRh3IhIgFmoiFmoiHSAfc0EUdyIfaiIkIBdqIBogC2\ +ogIyAic0EYdyIaIBxqIhwgFHNBGXciFGoiIiANaiAiIBJzQRB3IhIgHmoiHiAUc0EUdyIUaiIiIBJz\ +QRh3IhIgHmoiHiAUc0EZdyIUaiIjIAVqICMgISABaiAWIBNzQRl3IhNqIhYgAmogFiAac0EQdyIWIB\ +ggGWoiGGoiGSATc0EUdyITaiIaIBZzQRh3IhZzQRB3IiEgGyAVaiAYIAxzQRl3IgxqIhggD2ogGCAR\ +c0EQdyIRIBxqIhggDHNBFHciDGoiGyARc0EYdyIRIBhqIhhqIhwgFHNBFHciFGoiIyALaiAaIAhqIC\ +QgIHNBGHciGiAdaiIdIB9zQRl3Ih9qIiAgDmogICARc0EQdyIRIB5qIh4gH3NBFHciH2oiICARc0EY\ +dyIRIB5qIh4gH3NBGXciH2oiJCABaiAkICIgCmogGCAMc0EZdyIMaiIYIAdqIBggGnNBEHciGCAWIB\ +lqIhZqIhkgDHNBFHciDGoiGiAYc0EYdyIYc0EQdyIiIBsgBGogFiATc0EZdyITaiIWIAZqIBYgEnNB\ +EHciEiAdaiIWIBNzQRR3IhNqIhsgEnNBGHciEiAWaiIWaiIdIB9zQRR3Ih9qIiQgEGogGiANaiAjIC\ +FzQRh3IhogHGoiHCAUc0EZdyIUaiIhIApqICEgEnNBEHciEiAeaiIeIBRzQRR3IhRqIiEgEnNBGHci\ +EiAeaiIeIBRzQRl3IhRqIiMgB2ogIyAgIBVqIBYgE3NBGXciE2oiFiAGaiAWIBpzQRB3IhYgGCAZai\ +IYaiIZIBNzQRR3IhNqIhogFnNBGHciFnNBEHciICAbIAJqIBggDHNBGXciDGoiGCAJaiAYIBFzQRB3\ +IhEgHGoiGCAMc0EUdyIMaiIbIBFzQRh3IhEgGGoiGGoiHCAUc0EUdyIUaiIjIA1qIBogDmogJCAic0\ +EYdyIaIB1qIh0gH3NBGXciH2oiIiAXaiAiIBFzQRB3IhEgHmoiHiAfc0EUdyIfaiIiIBFzQRh3IhEg\ +HmoiHiAfc0EZdyIfaiIkIBVqICQgISAEaiAYIAxzQRl3IgxqIhggD2ogGCAac0EQdyIYIBYgGWoiFm\ +oiGSAMc0EUdyIMaiIaIBhzQRh3IhhzQRB3IiEgGyAFaiAWIBNzQRl3IhNqIhYgCGogFiASc0EQdyIS\ +IB1qIhYgE3NBFHciE2oiGyASc0EYdyISIBZqIhZqIh0gH3NBFHciH2oiJCABaiAaIApqICMgIHNBGH\ +ciGiAcaiIcIBRzQRl3IhRqIiAgBGogICASc0EQdyISIB5qIh4gFHNBFHciFGoiICASc0EYdyISIB5q\ +Ih4gFHNBGXciFGoiIyAPaiAjICIgAmogFiATc0EZdyITaiIWIAhqIBYgGnNBEHciFiAYIBlqIhhqIh\ +kgE3NBFHciE2oiGiAWc0EYdyIWc0EQdyIiIBsgBmogGCAMc0EZdyIMaiIYIAtqIBggEXNBEHciESAc\ +aiIYIAxzQRR3IgxqIhsgEXNBGHciESAYaiIYaiIcIBRzQRR3IhRqIiMgCmogGiAXaiAkICFzQRh3Ig\ +ogHWoiGiAfc0EZdyIdaiIfIBBqIB8gEXNBEHciESAeaiIeIB1zQRR3Ih1qIh8gEXNBGHciESAeaiIe\ +IB1zQRl3Ih1qIiEgAmogISAgIAVqIBggDHNBGXciAmoiDCAJaiAMIApzQRB3IgogFiAZaiIMaiIWIA\ +JzQRR3IgJqIhggCnNBGHciCnNBEHciGSAbIAdqIAwgE3NBGXciDGoiEyAOaiATIBJzQRB3IhIgGmoi\ +EyAMc0EUdyIMaiIaIBJzQRh3IhIgE2oiE2oiGyAdc0EUdyIdaiIgIBVqIBggBGogIyAic0EYdyIEIB\ +xqIhUgFHNBGXciFGoiGCAFaiAYIBJzQRB3IgUgHmoiEiAUc0EUdyIUaiIYIAVzQRh3IgUgEmoiEiAU\ +c0EZdyIUaiIcIAlqIBwgHyAGaiATIAxzQRl3IgZqIgkgDmogCSAEc0EQdyIOIAogFmoiBGoiCSAGc0\ +EUdyIGaiIKIA5zQRh3Ig5zQRB3IgwgGiAIaiAEIAJzQRl3IghqIgQgDWogBCARc0EQdyINIBVqIgQg\ +CHNBFHciCGoiFSANc0EYdyINIARqIgRqIgIgFHNBFHciEWoiEyAMc0EYdyIMIAJqIgIgFSAPaiAOIA\ +lqIg8gBnNBGXciBmoiDiAXaiAOIAVzQRB3IgUgICAZc0EYdyIOIBtqIhdqIhUgBnNBFHciBmoiCXM2\ +AgggACABIAogEGogFyAdc0EZdyIQaiIXaiAXIA1zQRB3IgEgEmoiDSAQc0EUdyIQaiIXIAFzQRh3Ig\ +EgDWoiDSALIBggB2ogBCAIc0EZdyIIaiIHaiAHIA5zQRB3IgcgD2oiDyAIc0EUdyIIaiIOczYCBCAA\ +IA4gB3NBGHciByAPaiIPIBdzNgIMIAAgCSAFc0EYdyIFIBVqIg4gE3M2AgAgACACIBFzQRl3IAVzNg\ +IUIAAgDSAQc0EZdyAHczYCECAAIA4gBnNBGXcgDHM2AhwgACAPIAhzQRl3IAFzNgIYC/YRARR/IwAh\ +AiAAKAIAIQMgACgCCCEEIAAoAgwhBSAAKAIEIQYgAkHAAGsiAkEYaiIHQgA3AwAgAkEgaiIIQgA3Aw\ +AgAkE4aiIJQgA3AwAgAkEwaiIKQgA3AwAgAkEoaiILQgA3AwAgAkEIaiIMIAEpAAg3AwAgAkEQaiIN\ +IAEpABA3AwAgByABKAAYIg42AgAgCCABKAAgIgc2AgAgAiABKQAANwMAIAIgASgAHCIINgIcIAIgAS\ +gAJCIPNgIkIAsgASgAKCIQNgIAIAIgASgALCILNgIsIAogASgAMCIRNgIAIAIgASgANCIKNgI0IAkg\ +ASgAOCISNgIAIAIgASgAPCIJNgI8IAAgDSgCACINIAcgESACKAIAIhMgDyAKIAIoAgQiFCACKAIUIh\ +UgCiAPIBUgFCARIAcgDSAGIBMgAyAEIAZxaiAFIAZBf3NxampB+Miqu31qQQd3aiIBaiAGIAIoAgwi\ +A2ogBCAMKAIAIgxqIAUgFGogASAGcWogBCABQX9zcWpB1u6exn5qQQx3IAFqIgIgAXFqIAYgAkF/c3\ +FqQdvhgaECakERdyACaiIGIAJxaiABIAZBf3NxakHunfeNfGpBFncgBmoiASAGcWogAiABQX9zcWpB\ +r5/wq39qQQd3IAFqIgRqIAggAWogDiAGaiAVIAJqIAQgAXFqIAYgBEF/c3FqQaqMn7wEakEMdyAEai\ +ICIARxaiABIAJBf3NxakGTjMHBempBEXcgAmoiASACcWogBCABQX9zcWpBgaqaampBFncgAWoiBiAB\ +cWogAiAGQX9zcWpB2LGCzAZqQQd3IAZqIgRqIAsgBmogECABaiAPIAJqIAQgBnFqIAEgBEF/c3FqQa\ +/vk9p4akEMdyAEaiICIARxaiAGIAJBf3NxakGxt31qQRF3IAJqIgEgAnFqIAQgAUF/c3FqQb6v88p4\ +akEWdyABaiIGIAFxaiACIAZBf3NxakGiosDcBmpBB3cgBmoiBGogEiABaiAKIAJqIAQgBnFqIAEgBE\ +F/c3FqQZPj4WxqQQx3IARqIgIgBHFqIAYgAkF/cyIFcWpBjofls3pqQRF3IAJqIgEgBXFqIAkgBmog\ +ASACcWogBCABQX9zIgVxakGhkNDNBGpBFncgAWoiBiACcWpB4sr4sH9qQQV3IAZqIgRqIAsgAWogBC\ +AGQX9zcWogDiACaiAGIAVxaiAEIAFxakHA5oKCfGpBCXcgBGoiAiAGcWpB0bT5sgJqQQ53IAJqIgEg\ +AkF/c3FqIBMgBmogAiAEQX9zcWogASAEcWpBqo/bzX5qQRR3IAFqIgYgAnFqQd2gvLF9akEFdyAGai\ +IEaiAJIAFqIAQgBkF/c3FqIBAgAmogBiABQX9zcWogBCABcWpB06iQEmpBCXcgBGoiAiAGcWpBgc2H\ +xX1qQQ53IAJqIgEgAkF/c3FqIA0gBmogAiAEQX9zcWogASAEcWpByPfPvn5qQRR3IAFqIgYgAnFqQe\ +abh48CakEFdyAGaiIEaiADIAFqIAQgBkF/c3FqIBIgAmogBiABQX9zcWogBCABcWpB1o/cmXxqQQl3\ +IARqIgIgBnFqQYeb1KZ/akEOdyACaiIBIAJBf3NxaiAHIAZqIAIgBEF/c3FqIAEgBHFqQe2p6KoEak\ +EUdyABaiIGIAJxakGF0o/PempBBXcgBmoiBGogESAGaiAMIAJqIAYgAUF/c3FqIAQgAXFqQfjHvmdq\ +QQl3IARqIgIgBEF/c3FqIAggAWogBCAGQX9zcWogAiAGcWpB2YW8uwZqQQ53IAJqIgYgBHFqQYqZqe\ +l4akEUdyAGaiIEIAZzIgUgAnNqQcLyaGpBBHcgBGoiAWogCyAGaiABIARzIAcgAmogBSABc2pBge3H\ +u3hqQQt3IAFqIgJzakGiwvXsBmpBEHcgAmoiBiACcyASIARqIAIgAXMgBnNqQYzwlG9qQRd3IAZqIg\ +FzakHE1PulempBBHcgAWoiBGogCCAGaiAEIAFzIA0gAmogASAGcyAEc2pBqZ/73gRqQQt3IARqIgJz\ +akHglu21f2pBEHcgAmoiBiACcyAQIAFqIAIgBHMgBnNqQfD4/vV7akEXdyAGaiIBc2pBxv3txAJqQQ\ +R3IAFqIgRqIAMgBmogBCABcyATIAJqIAEgBnMgBHNqQfrPhNV+akELdyAEaiICc2pBheG8p31qQRB3\ +IAJqIgYgAnMgDiABaiACIARzIAZzakGFuqAkakEXdyAGaiIBc2pBuaDTzn1qQQR3IAFqIgRqIAwgAW\ +ogESACaiABIAZzIARzakHls+62fmpBC3cgBGoiAiAEcyAJIAZqIAQgAXMgAnNqQfj5if0BakEQdyAC\ +aiIBc2pB5ayxpXxqQRd3IAFqIgYgAkF/c3IgAXNqQcTEpKF/akEGdyAGaiIEaiAVIAZqIBIgAWogCC\ +ACaiAEIAFBf3NyIAZzakGX/6uZBGpBCncgBGoiAiAGQX9zciAEc2pBp8fQ3HpqQQ93IAJqIgEgBEF/\ +c3IgAnNqQbnAzmRqQRV3IAFqIgYgAkF/c3IgAXNqQcOz7aoGakEGdyAGaiIEaiAUIAZqIBAgAWogAy\ +ACaiAEIAFBf3NyIAZzakGSmbP4eGpBCncgBGoiAiAGQX9zciAEc2pB/ei/f2pBD3cgAmoiASAEQX9z\ +ciACc2pB0buRrHhqQRV3IAFqIgYgAkF/c3IgAXNqQc/8of0GakEGdyAGaiIEaiAKIAZqIA4gAWogCS\ +ACaiAEIAFBf3NyIAZzakHgzbNxakEKdyAEaiICIAZBf3NyIARzakGUhoWYempBD3cgAmoiASAEQX9z\ +ciACc2pBoaOg8ARqQRV3IAFqIgYgAkF/c3IgAXNqQYL9zbp/akEGdyAGaiIEIAAoAgBqNgIAIAAgCy\ +ACaiAEIAFBf3NyIAZzakG15Ovpe2pBCncgBGoiAiAAKAIMajYCDCAAIAwgAWogAiAGQX9zciAEc2pB\ +u6Xf1gJqQQ93IAJqIgEgACgCCGo2AgggACABIAAoAgRqIA8gBmogASAEQX9zciACc2pBkaeb3H5qQR\ +V3ajYCBAvHDgINfwF+IwBBoAJrIgckAAJAAkACQAJAAkACQAJAAkACQAJAIAFBgAhLDQAgB0IANwOI\ +AQJAIAFBgHhxIggNAEEAIQlBACEKDAcLQQAgCGshC0EBIQogACEJA0AgCkEBcUUNAiAHQQE2AowBIA\ +cgCTYCiAEgCUGACGohCUEAIQogC0GACGoiC0UNBgwACwtBfyABQX9qQQt2IglndkEKdEGACGpBgAgg\ +CRsiCSABSw0BIAdBCGpBAEGAARBmGiABIAlrIQogACAJaiELIAlBCnatIAN8IRQCQAJAIAlBgAhHDQ\ +AgB0EIakEgaiEBQeAAIQggAEGACCACIAMgBCAHQQhqQSAQHCEJDAELQcAAIQggB0EIakHAAGohASAA\ +IAkgAiADIAQgB0EIakHAABAcIQkLIAsgCiACIBQgBCABIAgQHCEKAkAgCUEBRw0AIAZBP00NAyAFIA\ +cpAAg3AAAgBUE4aiAHQQhqQThqKQAANwAAIAVBMGogB0EIakEwaikAADcAACAFQShqIAdBCGpBKGop\ +AAA3AAAgBUEgaiAHQQhqQSBqKQAANwAAIAVBGGogB0EIakEYaikAADcAACAFQRBqIAdBCGpBEGopAA\ +A3AAAgBUEIaiAHQQhqQQhqKQAANwAAQQIhCgwHCyAKIAlqQQV0IglBgQFPDQMgB0EIaiAJIAIgBCAF\ +IAYQKiEKDAYLIAcgCTYCCEGUkcAAQSsgB0EIakHQiMAAQdiHwAAQUgALQZSGwABBI0G4hsAAEGAAC0\ +HAACAGQciGwAAQVgALIAlBgAFB2IbAABBWAAsgCUGAeGohCUEBIQoLIAFB/wdxIQsCQCAGQQV2IgEg\ +CiAKIAFLG0UNACAHQQhqQRhqIgogAkEYaikCADcDACAHQQhqQRBqIgEgAkEQaikCADcDACAHQQhqQQ\ +hqIgwgAkEIaikCADcDACAHIAIpAgA3AwggB0EIaiAJQcAAIAMgBEEBchAaIAdBCGogCUHAAGpBwAAg\ +AyAEEBogB0EIaiAJQYABakHAACADIAQQGiAHQQhqIAlBwAFqQcAAIAMgBBAaIAdBCGogCUGAAmpBwA\ +AgAyAEEBogB0EIaiAJQcACakHAACADIAQQGiAHQQhqIAlBgANqQcAAIAMgBBAaIAdBCGogCUHAA2pB\ +wAAgAyAEEBogB0EIaiAJQYAEakHAACADIAQQGiAHQQhqIAlBwARqQcAAIAMgBBAaIAdBCGogCUGABW\ +pBwAAgAyAEEBogB0EIaiAJQcAFakHAACADIAQQGiAHQQhqIAlBgAZqQcAAIAMgBBAaIAdBCGogCUHA\ +BmpBwAAgAyAEEBogB0EIaiAJQYAHakHAACADIAQQGiAHQQhqIAlBwAdqQcAAIAMgBEECchAaIAUgCi\ +kDADcAGCAFIAEpAwA3ABAgBSAMKQMANwAIIAUgBykDCDcAACAHKAKMASEKCyALRQ0AIAdBkAFqQTBq\ +Ig1CADcDACAHQZABakE4aiIOQgA3AwAgB0GQAWpBwABqIg9CADcDACAHQZABakHIAGoiEEIANwMAIA\ +dBkAFqQdAAaiIRQgA3AwAgB0GQAWpB2ABqIhJCADcDACAHQZABakHgAGoiE0IANwMAIAdBkAFqQSBq\ +IgkgAkEYaikCADcDACAHQZABakEYaiIBIAJBEGopAgA3AwAgB0GQAWpBEGoiDCACQQhqKQIANwMAIA\ +dCADcDuAEgByAEOgD6ASAHQQA7AfgBIAcgAikCADcDmAEgByAKrSADfDcDkAEgB0GQAWogACAIaiAL\ +EDAaIAdBCGpBEGogDCkDADcDACAHQQhqQRhqIAEpAwA3AwAgB0EIakEgaiAJKQMANwMAIAdBCGpBMG\ +ogDSkDADcDACAHQQhqQThqIA4pAwA3AwAgB0EIakHAAGogDykDADcDACAHQQhqQcgAaiAQKQMANwMA\ +IAdBCGpB0ABqIBEpAwA3AwAgB0EIakHYAGogEikDADcDACAHQQhqQeAAaiATKQMANwMAIAcgBykDmA\ +E3AxAgByAHKQO4ATcDMCAHLQD6ASELIActAPkBIQQgByAHLQD4ASICOgBwIAcgBykDkAEiAzcDCCAH\ +IAsgBEVyQQJyIgs6AHEgB0GAAmpBGGoiBCAJKQMANwMAIAdBgAJqQRBqIgAgASkDADcDACAHQYACak\ +EIaiIBIAwpAwA3AwAgByAHKQOYATcDgAIgB0GAAmogB0EwaiACIAMgCxAaIApBBXQiCUEgaiELIAlB\ +YEYNASALIAZLDQIgBCgCACELIAAoAgAhBCABKAIAIQIgBygClAIhASAHKAKMAiEAIAcoAoQCIQYgBy\ +gCgAIhCCAFIAlqIgkgBygCnAI2ABwgCSALNgAYIAkgATYAFCAJIAQ2ABAgCSAANgAMIAkgAjYACCAJ\ +IAY2AAQgCSAINgAAIApBAWohCgsgB0GgAmokACAKDwtBYCALQYSGwAAQVQALIAsgBkGEhsAAEFYAC7\ +8OAQd/IABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAAkACQCACQQFxDQAgAkEDcUUNASABKAIAIgIg\ +AGohAAJAAkBBACgC/J1AIAEgAmsiAUYNAAJAIAJB/wFLDQAgAUEMaigCACIEIAFBCGooAgAiBUcNAk\ +EAQQAoAuSaQEF+IAJBA3Z3cTYC5JpADAMLIAEoAhghBgJAAkAgASgCDCIEIAFGDQAgASgCCCICIAQ2\ +AgwgBCACNgIIDAELAkAgAUEUQRAgASgCFCIEG2ooAgAiAg0AQQAhBAwBCyABQRRqIAFBEGogBBshBQ\ +NAIAUhBwJAIAIiBEEUaiIFKAIAIgINACAEQRBqIQUgBCgCECECCyACDQALIAdBADYCAAsgBkUNAgJA\ +AkAgASgCHEECdEH0nMAAaiICKAIAIAFHDQAgAiAENgIAIAQNAUEAQQAoAuiaQEF+IAEoAhx3cTYC6J\ +pADAQLIAZBEEEUIAYoAhAgAUYbaiAENgIAIARFDQMLIAQgBjYCGAJAIAEoAhAiAkUNACAEIAI2AhAg\ +AiAENgIYCyABKAIUIgJFDQIgBEEUaiACNgIAIAIgBDYCGAwCCyADKAIEQQNxQQNHDQFBACAANgL0nU\ +AgAyADKAIEQX5xNgIEIAEgAEEBcjYCBCABIABqIAA2AgAPCyAFIAQ2AgwgBCAFNgIICwJAAkAgAygC\ +BCICQQJxDQACQEEAKAKAnkAgA0cNAEEAIAE2AoCeQEEAQQAoAvidQCAAaiIANgL4nUAgASAAQQFyNg\ +IEAkAgAUEAKAL8nUBHDQBBAEEANgL0nUBBAEEANgL8nUALQQAoApyeQCICIABPDQNBACgCgJ5AIgBF\ +DQMCQEEAKAL4nUAiBEEpSQ0AQYyewAAhAQNAAkAgASgCACIDIABLDQAgAyABKAIEaiAASw0CCyABKA\ +IIIgENAAsLAkACQEEAKAKUnkAiAA0AQf8fIQEMAQtBACEBA0AgAUEBaiEBIAAoAggiAA0ACyABQf8f\ +IAFB/x9LGyEBC0EAIAE2AqSeQCAEIAJNDQNBAEF/NgKcnkAPC0EAKAL8nUAgA0YNAyACQXhxIgQgAG\ +ohAAJAAkAgBEH/AUsNAAJAIANBDGooAgAiBCADQQhqKAIAIgNHDQBBAEEAKALkmkBBfiACQQN2d3E2\ +AuSaQAwCCyADIAQ2AgwgBCADNgIIDAELIAMoAhghBgJAAkAgAygCDCIEIANGDQAgAygCCCICIAQ2Ag\ +wgBCACNgIIDAELAkAgA0EUQRAgAygCFCIEG2ooAgAiAg0AQQAhBAwBCyADQRRqIANBEGogBBshBQNA\ +IAUhBwJAIAIiBEEUaiIFKAIAIgINACAEQRBqIQUgBCgCECECCyACDQALIAdBADYCAAsgBkUNAAJAAk\ +AgAygCHEECdEH0nMAAaiICKAIAIANHDQAgAiAENgIAIAQNAUEAQQAoAuiaQEF+IAMoAhx3cTYC6JpA\ +DAILIAZBEEEUIAYoAhAgA0YbaiAENgIAIARFDQELIAQgBjYCGAJAIAMoAhAiAkUNACAEIAI2AhAgAi\ +AENgIYCyADKAIUIgNFDQAgBEEUaiADNgIAIAMgBDYCGAsgASAAQQFyNgIEIAEgAGogADYCACABQQAo\ +AvydQEcNAUEAIAA2AvSdQA8LIAMgAkF+cTYCBCABIABBAXI2AgQgASAAaiAANgIACwJAIABB/wFLDQ\ +AgAEEDdiIDQQN0QeyawABqIQACQAJAQQAoAuSaQCICQQEgA3QiA3ENAEEAIAIgA3I2AuSaQCAAIQMM\ +AQsgACgCCCEDCyAAIAE2AgggAyABNgIMIAEgADYCDCABIAM2AggPC0EfIQMCQCAAQf///wdLDQAgAE\ +EGIABBCHZnIgNrQR9xdkEBcSADQQF0a0E+aiEDCyABQgA3AhAgAUEcaiADNgIAIANBAnRB9JzAAGoh\ +AgJAAkACQAJAQQAoAuiaQCIEQQEgA0EfcXQiBXENAEEAIAQgBXI2AuiaQCACIAE2AgAgAUEYaiACNg\ +IADAELAkAgAigCACIEKAIEQXhxIABHDQAgBCEDDAILIABBAEEZIANBAXZrQR9xIANBH0YbdCECAkAD\ +QCAEIAJBHXZBBHFqQRBqIgUoAgAiA0UNASACQQF0IQIgAyEEIAMoAgRBeHEgAEYNAwwACwsgBSABNg\ +IAIAFBGGogBDYCAAsgASABNgIMIAEgATYCCAwBCyADKAIIIgAgATYCDCADIAE2AgggAUEYakEANgIA\ +IAEgAzYCDCABIAA2AggLQQBBACgCpJ5AQX9qIgE2AqSeQCABDQACQAJAQQAoApSeQCIADQBB/x8hAQ\ +wBC0EAIQEDQCABQQFqIQEgACgCCCIADQALIAFB/x8gAUH/H0sbIQELQQAgATYCpJ5ACw8LQQAgATYC\ +/J1AQQBBACgC9J1AIABqIgA2AvSdQCABIABBAXI2AgQgASAAaiAANgIAC5AOAQF/AkACQCAARQ0AIA\ +AoAgANASAAQX82AgAgAEEEaiEBAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC\ +QAJAAkACQCAAKAIEDhYBAgMEBQYHCAkKCwwNDg8QERITFBUAAQsgASgCBEEAQcgBEGZBADYCyAEMFQ\ +sgASgCBCIBIAEpA4gDNwPAASABIAFBiAJqQYABEGEiAUG4AWogAUGAAmopAwA3AwAgAUGwAWogAUH4\ +AWopAwA3AwAgAUGoAWogAUHwAWopAwA3AwAgAUGgAWogAUHoAWopAwA3AwAgAUGYAWogAUHgAWopAw\ +A3AwAgAUGQAWogAUHYAWopAwA3AwAgAUGIAWogAUHQAWopAwA3AwAgASABKQPIATcDgAEMFAsgASgC\ +BCIBIAEpA4gDNwPAASABIAFBiAJqQYABEGEiAUG4AWogAUGAAmopAwA3AwAgAUGwAWogAUH4AWopAw\ +A3AwAgAUGoAWogAUHwAWopAwA3AwAgAUGgAWogAUHoAWopAwA3AwAgAUGYAWogAUHgAWopAwA3AwAg\ +AUGQAWogAUHYAWopAwA3AwAgAUGIAWogAUHQAWopAwA3AwAgASABKQPIATcDgAEMEwsgASgCBCIBIA\ +EpA4gDNwPAASABIAFBiAJqQYABEGEiAUG4AWogAUGAAmopAwA3AwAgAUGwAWogAUH4AWopAwA3AwAg\ +AUGoAWogAUHwAWopAwA3AwAgAUGgAWogAUHoAWopAwA3AwAgAUGYAWogAUHgAWopAwA3AwAgAUGQAW\ +ogAUHYAWopAwA3AwAgAUGIAWogAUHQAWopAwA3AwAgASABKQPIATcDgAEMEgsgASgCBCIBIAEpAwg3\ +AwAgASABKQKUATcCECABQRhqIAFBnAFqKQIANwIAIAFBIGogAUGkAWopAgA3AgAgAUEoaiABQawBai\ +kCADcCACABQTBqIAFBtAFqKQIANwIAIAFBOGogAUG8AWopAgA3AgAgAUHAAGogAUHEAWopAgA3AgAg\ +AUHIAGogAUHMAWopAgA3AgAgAUHoAGogAUGMAWopAgA3AgAgAUHgAGogAUGEAWopAgA3AgAgAUHYAG\ +ogAUH8AGopAgA3AgAgASABKQJ0NwJQDBELIAEoAgQiAUIANwMAIAEgASkDcDcDCCABQSBqIAFBiAFq\ +KQMANwMAIAFBGGogAUGAAWopAwA3AwAgAUEQaiABQfgAaikDADcDACABQShqQQBBwgAQZhogASgCkA\ +FFDRAgAUEANgKQAQwQCyABKAIEQQBByAEQZkEANgLIAQwPCyABKAIEQQBByAEQZkEANgLIAQwOCyAB\ +KAIEQQBByAEQZkEANgLIAQwNCyABKAIEQQBByAEQZkEANgLIAQwMCyABKAIEIgFCADcDACABQQApAv\ +CQQDcCTCABQQA2AgggAUHUAGpBACkC+JBANwIADAsLIAEoAgQiAUIANwMAIAFBADYCHCABQQApAoCR\ +QDcCCCABQRBqQQApAoiRQDcCACABQRhqQQAoApCRQDYCAAwKCyABKAIEIgFBACkCgJFANwIIIAFBAD\ +YCHCABQgA3AwAgAUEYakEAKAKQkUA2AgAgAUEQakEAKQKIkUA3AgAMCQsgASgCBEEAQcgBEGZBADYC\ +yAEMCAsgASgCBEEAQcgBEGZBADYCyAEMBwsgASgCBEEAQcgBEGZBADYCyAEMBgsgASgCBEEAQcgBEG\ +ZBADYCyAEMBQsgASgCBCIBQgA3AwAgAUEANgIIIAFBACkCkJJANwJMIAFB1ABqQQApApiSQDcCACAB\ +QdwAakEAKQKgkkA3AgAgAUHkAGpBACkCqJJANwIADAQLIAEoAgQiAUIANwMAIAFBADYCCCABQQApAr\ +CSQDcCTCABQdQAakEAKQK4kkA3AgAgAUHcAGpBACkCwJJANwIAIAFB5ABqQQApAsiSQDcCAAwDCyAB\ +KAIEIgFCADcDCCABQgA3AwAgAUEANgJQIAFBACkD0JJANwMQIAFBGGpBACkD2JJANwMAIAFBIGpBAC\ +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\ +IMIAIgADYCCCAAQRhqQQA2AgAgACACNgIMIAAgATYCCA8LQQAgADYC/J1AQQBBACgC9J1AIAFqIgE2\ +AvSdQCAAIAFBAXI2AgQgACABaiABNgIAC/sJAhB/BH4jAEGQAWsiAiQAAkACQAJAAkAgASgCkAEiAw\ +0AIAAgASkDCDcDCCAAIAEpAyg3AyggAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDACAAQSBq\ +IAFBIGopAwA3AwAgAEEwaiABQTBqKQMANwMAIABBOGogAUE4aikDADcDACAAQcAAaiABQcAAaikDAD\ +cDACAAQcgAaiABQcgAaikDADcDACAAQdAAaiABQdAAaikDADcDACAAQdgAaiABQdgAaikDADcDACAA\ +QeAAaiABQeAAaikDADcDACABQekAai0AACEEIAEtAGohBSAAIAEtAGg6AGggACABKQMANwMAIAAgBS\ +AERXJBAnI6AGkMAQsCQAJAAkAgAUHpAGotAAAiBEEGdEEAIAEtAGgiBmtGDQAgAkEQaiABQRBqKQMA\ +NwMAIAJBGGogAUEYaikDADcDACACQSBqIAFBIGopAwA3AwAgAkEwaiABQTBqKQMANwMAIAJBOGogAU\ +E4aikDADcDACACQcAAaiABQcAAaikDADcDACACQcgAaiABQcgAaikDADcDACACQdAAaiABQdAAaikD\ +ADcDACACQdgAaiABQdgAaikDADcDACACQeAAaiABQeAAaikDADcDACACIAEpAwg3AwggAiABKQMoNw\ +MoIAIgAS0AaiIFIARFckECciIHOgBpIAIgBjoAaCACIAEpAwAiEjcDACAFQQRyIQggAkEIaiEEIAMh\ +CQwBCyADQX5qIQkgA0ECSQ0DIAJBEGogAUH4AGopAwA3AwAgAkEYaiABQYABaikDADcDACACQSBqIA\ +FBiAFqKQMANwMAIAJBMGogAUGUAWoiBSAJQQV0aiIEQQhqKQIANwMAIAJBOGogBEEQaikCADcDAEHA\ +ACEGIAJBwABqIARBGGopAgA3AwAgAiABKQNwNwMIIAIgBCkCADcDKCADQQV0IAVqQWBqIgQpAgAhEi\ +AEKQIIIRMgBCkCECEUIAEtAGohBSACQeAAaiAEKQIYNwMAIAJB2ABqIBQ3AwAgAkHQAGogEzcDACAC\ +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\ +aiECDAELIABBEGohBgJAIARFDQAgBEGBAU8NBCAAQdQAaiIHIARqIAEgBRBhGiAAQQA2AlAgA0EIai\ +AHEHogBiADKAIIIAMoAgwQDSACIAVrIQIgASAFaiEBCyAGIAEgAkEHdhANIABB1ABqIAEgAkGAf3Fq\ +IAJB/wBxIgIQYRoLIAAgAjYCUCADQRBqJAAPCyAEIAVBwJHAABBVAAsgBUGAAUHAkcAAEFYACyAEQY\ +ABQdCRwAAQVwALuAIBA38jAEEQayICJAACQCAAKALIASIDQccASw0AIAAgA2pBzAFqQQE6AAACQCAD\ +QQFqIgRByABGDQAgACAEakHMAWpBAEHHACADaxBmGgtBACEDIABBADYCyAEgAEGTAmoiBCAELQAAQY\ +ABcjoAAANAIAAgA2oiBCAELQAAIARBzAFqLQAAczoAACADQQFqIgNByABHDQALIAAQISABIAApAAA3\ +AAAgAUE4aiAAQThqKQAANwAAIAFBMGogAEEwaikAADcAACABQShqIABBKGopAAA3AAAgAUEgaiAAQS\ +BqKQAANwAAIAFBGGogAEEYaikAADcAACABQRBqIABBEGopAAA3AAAgAUEIaiAAQQhqKQAANwAAIAJB\ +EGokAA8LQbqVwABBFyACQQhqQdSVwABBzJfAABBSAAu4AgEDfyMAQRBrIgIkAAJAIAAoAsgBIgNBxw\ +BLDQAgACADakHMAWpBBjoAAAJAIANBAWoiBEHIAEYNACAAIARqQcwBakEAQccAIANrEGYaC0EAIQMg\ +AEEANgLIASAAQZMCaiIEIAQtAABBgAFyOgAAA0AgACADaiIEIAQtAAAgBEHMAWotAABzOgAAIANBAW\ +oiA0HIAEcNAAsgABAhIAEgACkAADcAACABQThqIABBOGopAAA3AAAgAUEwaiAAQTBqKQAANwAAIAFB\ +KGogAEEoaikAADcAACABQSBqIABBIGopAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAAD\ +cAACABQQhqIABBCGopAAA3AAAgAkEQaiQADwtBupXAAEEXIAJBCGpB1JXAAEGMmMAAEFIAC7YCAQR/\ +IwBBoAFrIgIkACACQQA2AhAgAkEIaiACQRBqQQRyIAJB1ABqEHgCQAJAIAIoAgwgAigCCCIDayIEQc\ +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\ +BEGQAUYNACAAIARqQcwBakEAQY8BIANrEGYaC0EAIQMgAEEANgLIASAAQdsCaiIEIAQtAABBgAFyOg\ +AAA0AgACADaiIEIAQtAAAgBEHMAWotAABzOgAAIANBAWoiA0GQAUcNAAsgABAhIAEgACkAADcAACAB\ +QRhqIABBGGooAAA2AAAgAUEQaiAAQRBqKQAANwAAIAFBCGogAEEIaikAADcAACACQRBqJAAPC0G6lc\ +AAQRcgAkEIakHUlcAAQeSVwAAQUgAL+AEBA38jAEEQayICJAACQCAAKALIASIDQYcBSw0AIAAgA2pB\ +zAFqQQE6AAACQCADQQFqIgRBiAFGDQAgACAEakHMAWpBAEGHASADaxBmGgtBACEDIABBADYCyAEgAE\ +HTAmoiBCAELQAAQYABcjoAAANAIAAgA2oiBCAELQAAIARBzAFqLQAAczoAACADQQFqIgNBiAFHDQAL\ +IAAQISABIAApAAA3AAAgAUEYaiAAQRhqKQAANwAAIAFBEGogAEEQaikAADcAACABQQhqIABBCGopAA\ +A3AAAgAkEQaiQADwtBupXAAEEXIAJBCGpB1JXAAEGsl8AAEFIAC/gBAQN/IwBBEGsiAiQAAkAgACgC\ +yAEiA0GPAUsNACAAIANqQcwBakEGOgAAAkAgA0EBaiIEQZABRg0AIAAgBGpBzAFqQQBBjwEgA2sQZh\ +oLQQAhAyAAQQA2AsgBIABB2wJqIgQgBC0AAEGAAXI6AAADQCAAIANqIgQgBC0AACAEQcwBai0AAHM6\ +AAAgA0EBaiIDQZABRw0ACyAAECEgASAAKQAANwAAIAFBGGogAEEYaigAADYAACABQRBqIABBEGopAA\ +A3AAAgAUEIaiAAQQhqKQAANwAAIAJBEGokAA8LQbqVwABBFyACQQhqQdSVwABB3JfAABBSAAv4AQED\ +fyMAQRBrIgIkAAJAIAAoAsgBIgNBhwFLDQAgACADakHMAWpBBjoAAAJAIANBAWoiBEGIAUYNACAAIA\ +RqQcwBakEAQYcBIANrEGYaC0EAIQMgAEEANgLIASAAQdMCaiIEIAQtAABBgAFyOgAAA0AgACADaiIE\ +IAQtAAAgBEHMAWotAABzOgAAIANBAWoiA0GIAUcNAAsgABAhIAEgACkAADcAACABQRhqIABBGGopAA\ +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\ +ALIAAgAiABKAIMEQYACxwAIAEoAhhBkonAAEEIIAFBHGooAgAoAgwRCAALGgACQCAADQBBkJnAAEEr\ +QbyZwAAQYAALIAALFAAgACgCACABIAAoAgQoAgwRBgALEAAgASAAKAIAIAAoAgQQIgsQACAAIAI2Ag\ +QgACABNgIACxAAIABBATYCBCAAIAE2AgALEAAgAEEBNgIEIAAgATYCAAsOAAJAIAFFDQAgABAdCwsR\ +AEHOgcAAQRFB4IHAABBgAAsRAEGMgsAAQS9BvILAABBgAAsNACAAKAIAGgN/DAALCwsAIAAjAGokAC\ +MACwsAIAA1AgAgARAyCw0AQfCZwABBGxCDAQALDgBBi5rAAEHPABCDAQALCQAgACABEAsACwcAIAAQ\ +DAALDQBC4ZX+6diu0MaofwsDAAALAgALAgALC+SagIAAAQBBgIDAAAvaGkJMQUtFMkJCTEFLRTJCLT\ +I1NkJMQUtFMkItMzg0QkxBS0UyU0JMQUtFM0tFQ0NBSy0yMjRLRUNDQUstMjU2S0VDQ0FLLTM4NEtF\ +Q0NBSy01MTJNRDVSSVBFTUQtMTYwU0hBLTFTSEEtMjI0U0hBLTI1NlNIQS0zODRTSEEtNTEydW5zdX\ +Bwb3J0ZWQgYWxnb3JpdGhtbm9uLWRlZmF1bHQgbGVuZ3RoIHNwZWNpZmllZCBmb3Igbm9uLWV4dGVu\ +ZGFibGUgYWxnb3JpdGhtY2FwYWNpdHkgb3ZlcmZsb3cA8AAQABwAAAAiAgAABQAAAGxpYnJhcnkvYW\ +xsb2Mvc3JjL3Jhd192ZWMucnNBcnJheVZlYzogY2FwYWNpdHkgZXhjZWVkZWQgaW4gZXh0ZW5kL2Zy\ +b21faXRlcgBMARAAUAAAAPADAAAFAAAAfi8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMW\ +VjYzYyOTlkYjllYzgyMy9hcnJheXZlYy0wLjcuMS9zcmMvYXJyYXl2ZWMucnOsARAATQAAAAQAAAAB\ +AAAAfi8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9ibGFrZT\ +ItMC45LjEvc3JjL2JsYWtlMnMucnNhc3NlcnRpb24gZmFpbGVkOiBrayA8PSBVNjQ6OnRvX3VzaXpl\ +KClhc3NlcnRpb24gZmFpbGVkOiBubiA+PSAxICYmIG5uIDw9IFU2NDo6dG9fdXNpemUoKWhhc2ggZG\ +F0YSBsZW5ndGggb3ZlcmZsb3d+Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5\ +OWRiOWVjODIzL2JsYWtlMy0xLjAuMC9zcmMvbGliLnJzawIQAEkAAAC7AQAACQAAAGsCEABJAAAAAw\ +MAABkAAABrAhAASQAAAAUDAAAJAAAAawIQAEkAAAAFAwAAOAAAAGsCEABJAAAAjwIAAAkAAABrAhAA\ +SQAAAGECAAAKAAAAYXNzZXJ0aW9uIGZhaWxlZDogbWlkIDw9IHNlbGYubGVuKCkA4AkQAE0AAADjBQ\ +AACQAAAGsCEABJAAAA2AIAAAkAAABrAhAASQAAAN8CAAAKAAAAawIQAEkAAACtBAAAFgAAAGsCEABJ\ +AAAAvwQAABYAAABrAhAASQAAAPsDAAAyAAAAawIQAEkAAADwBAAAEgAAAGsCEABJAAAA+gQAABIAAA\ +BrAhAASQAAAGcFAAAhAAAAEQAAAAQAAAAEAAAAEgAAAOgDEABVAAAAJwAAACAAAAB+Ly5jYXJnby9y\ +ZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2FycmF5dmVjLTAuNy4xL3NyYy\ +9hcnJheXZlY19pbXBsLnJzAAAAEQAAACAAAAABAAAAEwAAABEAAAAEAAAABAAAABIAAACFBBAADQAA\ +AHAEEAAVAAAAaW5zdWZmaWNpZW50IGNhcGFjaXR5Q2FwYWNpdHlFcnJvclBhZEVycm9yAAC8BBAAIA\ +AAANwEEAASAAAAEQAAAAAAAAABAAAAFAAAAGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMg\ +IGJ1dCB0aGUgaW5kZXggaXMgMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOT\ +IwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0\ +OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nz\ +g3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkAAMgFEAAQAAAA2AUQACIA\ +AAByYW5nZSBlbmQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAADAYQAB\ +IAAADYBRAAIgAAAHJhbmdlIHN0YXJ0IGluZGV4IAAAMAYQABYAAABGBhAADQAAAHNsaWNlIGluZGV4\ +IHN0YXJ0cyBhdCAgYnV0IGVuZHMgYXQgAJAMEAAAAAAAkAwQAAAAAABsBhAAAgAAADogKQCIBhAAFQ\ +AAAJ0GEAArAAAAbgYQAAEAAABzb3VyY2Ugc2xpY2UgbGVuZ3RoICgpIGRvZXMgbm90IG1hdGNoIGRl\ +c3RpbmF0aW9uIHNsaWNlIGxlbmd0aCAo2AYQAE0AAAAEAAAAAQAAAH4vLmNhcmdvL3JlZ2lzdHJ5L3\ +NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmxha2UyLTAuOS4xL3NyYy9ibGFrZTJiLnJz\ +AAAASAcQACEAAABpBxAAFwAAADwMEABRAAAAZwEAAAUAAABHZW5lcmljQXJyYXk6OmZyb21faXRlci\ +ByZWNlaXZlZCAgZWxlbWVudHMgYnV0IGV4cGVjdGVkIGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVs\ +eSBvciBkZXN0cm95ZWQgYWxyZWFkeQEAAAAAAAAAgoAAAAAAAACKgAAAAAAAgACAAIAAAACAi4AAAA\ +AAAAABAACAAAAAAIGAAIAAAACACYAAAAAAAICKAAAAAAAAAIgAAAAAAAAACYAAgAAAAAAKAACAAAAA\ +AIuAAIAAAAAAiwAAAAAAAICJgAAAAAAAgAOAAAAAAACAAoAAAAAAAICAAAAAAAAAgAqAAAAAAAAACg\ +AAgAAAAICBgACAAAAAgICAAAAAAACAAQAAgAAAAAAIgACAAAAAgAEjRWeJq83v/ty6mHZUMhABI0Vn\ +iavN7/7cuph2VDIQ8OHSw2NhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdW\ +UAXAsQAE8AAAA6AAAADQAAAFwLEABPAAAAQQAAAA0AAABcCxAATwAAAIcAAAAXAAAAXAsQAE8AAACL\ +AAAAGwAAAFwLEABPAAAAhAAAAAkAAADYngXBB9V8NhfdcDA5WQ73MQvA/xEVWGinj/lkpE/6vmfmCW\ +qFrme7cvNuPDr1T6V/Ug5RjGgFm6vZgx8ZzeBb2J4FwV2du8sH1Xw2KimaYhfdcDBaAVmROVkO99js\ +LxUxC8D/ZyYzZxEVWGiHSrSOp4/5ZA0uDNukT/q+HUi1RwjJvPNn5glqO6fKhIWuZ7sr+JT+cvNuPP\ +E2HV869U+l0YLmrX9SDlEfbD4rjGgFm2u9Qfur2YMfeSF+ExnN4FvgCRAATQAAAOsLAAANAAAAL3J1\ +c3RjLzUzY2I3YjA5YjAwY2JlYTg3NTRmZmI3OGU3ZTNjYjUyMWNiOGFmNGIvbGlicmFyeS9jb3JlL3\ +NyYy9zbGljZS9tb2QucnMAAABwChAASgAAAB8AAAAkAAAAcAoQAEoAAAAkAAAAKQAAAHAKEABKAAAA\ +NwAAACUAAABwChAASgAAAC8AAAAkAAAAfi8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMW\ +VjYzYyOTlkYjllYzgyMy9zaGEzLTAuOS4xL3NyYy9yZWFkZXIucnN3ZSBuZXZlciB1c2UgaW5wdXRf\ +bGF6eQAAABEAAAAAAAAAAQAAABUAAAD0ChAARwAAAEEAAAABAAAAfi8uY2FyZ28vcmVnaXN0cnkvc3\ +JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9zaGEzLTAuOS4xL3NyYy9saWIucnMAXAsQAE8A\ +AAAbAAAADQAAAFwLEABPAAAAIgAAAA0AAAB+Ly5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS\ +0xZWNjNjI5OWRiOWVjODIzL2Jsb2NrLWJ1ZmZlci0wLjkuMC9zcmMvbGliLnJzAPQKEABHAAAASAAA\ +AAEAAAD0ChAARwAAAE8AAAABAAAA9AoQAEcAAABWAAAAAQAAAPQKEABHAAAAZgAAAAEAAAD0ChAARw\ +AAAG0AAAABAAAA9AoQAEcAAAB0AAAAAQAAAPQKEABHAAAAewAAAAEAAAD0ChAARwAAAIMAAAABAAAA\ +9AoQAEcAAACJAAAAAQAAAH4vLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZG\ +I5ZWM4MjMvZ2VuZXJpYy1hcnJheS0wLjE0LjQvc3JjL2xpYi5ycwAAAGNhbGxlZCBgT3B0aW9uOjp1\ +bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWUAzAwQABwAAADsAQAAHgAAAGxpYnJhcnkvc3RkL3NyYy\ +9wYW5pY2tpbmcucnMEAAAAAAAAAG51bGwgcG9pbnRlciBwYXNzZWQgdG8gcnVzdHJlY3Vyc2l2ZSB1\ +c2Ugb2YgYW4gb2JqZWN0IGRldGVjdGVkIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5zYWZlIGFsaWFzaW\ +5nIGluIHJ1c3QAu8KAgAAEbmFtZQGwwoCAAIkBAEVqc19zeXM6OlR5cGVFcnJvcjo6bmV3OjpfX3di\ +Z19uZXdfZjg1ZGJkZmI5Y2RiZTJlYzo6aDMxZTQwZTFjODY4ZTRlYzIBO3dhc21fYmluZGdlbjo6X1\ +93YmluZGdlbl9vYmplY3RfZHJvcF9yZWY6OmgzOGEwYmUwMjBiNzAyMGVjAlVqc19zeXM6OlVpbnQ4\ +QXJyYXk6OmJ5dGVfbGVuZ3RoOjpfX3diZ19ieXRlTGVuZ3RoX2UwNTE1YmM5NGNmYzVkZWU6Omg3OT\ +Q5YzQ2ZDM4NWQwYTYxA1Vqc19zeXM6OlVpbnQ4QXJyYXk6OmJ5dGVfb2Zmc2V0OjpfX3diZ19ieXRl\ +T2Zmc2V0Xzc3ZWVjODQ3MTZhMmU3Mzc6OmgzZGMxZmE5YzkzMzczZTEzBExqc19zeXM6OlVpbnQ4QX\ +JyYXk6OmJ1ZmZlcjo6X193YmdfYnVmZmVyXzFjNTkxOGE0YWI2NTZmZjc6OmgzMDJiMDFjNzU0NGFh\ +MTVmBXlqc19zeXM6OlVpbnQ4QXJyYXk6Om5ld193aXRoX2J5dGVfb2Zmc2V0X2FuZF9sZW5ndGg6Ol\ +9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U1N2FkMWYyY2U4MTJjMDM6Omg0NWM0NTcx\ +MzlkZjEwMzczBkxqc19zeXM6OlVpbnQ4QXJyYXk6Omxlbmd0aDo6X193YmdfbGVuZ3RoXzJkNTZjYj\ +M3MDc1ZmNmYjE6OmhiMjljZDhlZDBlYzg0MDNlBzJ3YXNtX2JpbmRnZW46Ol9fd2JpbmRnZW5fbWVt\ +b3J5OjpoYzVkYTBmZGNmNzYzMDU1YghVanNfc3lzOjpXZWJBc3NlbWJseTo6TWVtb3J5OjpidWZmZX\ +I6Ol9fd2JnX2J1ZmZlcl85ZTE4NGQ2Zjc4NWRlNWVkOjpoZWM2MGIyNTg0ZThmMzY0YQlGanNfc3lz\ +OjpVaW50OEFycmF5OjpuZXc6Ol9fd2JnX25ld19lODEwMTMxOWU0Y2Y5NWZjOjpoMmIxYzFhMDRhMj\ +k1NDFiNwpGanNfc3lzOjpVaW50OEFycmF5OjpzZXQ6Ol9fd2JnX3NldF9lOGFlN2IyNzMxNGU4Yjk4\ +OjpoYzNkOTVkZTRkYzk5OTAzZQsxd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX3Rocm93OjpoZGU2Mz\ +cxZjJhNzJiNjMwYwwzd2FzbV9iaW5kZ2VuOjpfX3diaW5kZ2VuX3JldGhyb3c6Omg3MTk3ODExOWFm\ +OWVjZjZmDS9zaGEyOjpzaGE1MTI6OnNvZnQ6OmNvbXByZXNzOjpoYzQzZDFiMDg3OGVhZmI4OQ5AZG\ +Vub19zdGRfd2FzbV9jcnlwdG86OmRpZ2VzdDo6Q29udGV4dDo6ZGlnZXN0OjpoMmNlMmQ5MDA4YWIw\ +NzIxYQ8vc2hhMjo6c2hhMjU2Ojpzb2Z0Ojpjb21wcmVzczo6aDc0N2Y2YWQ4ZDZmM2M0OWIQSmRlbm\ +9fc3RkX3dhc21fY3J5cHRvOjpkaWdlc3Q6OkNvbnRleHQ6OmRpZ2VzdF9hbmRfcmVzZXQ6OmhlZWY1\ +NmI3ZWRkMGYwYTBmEUBkZW5vX3N0ZF93YXNtX2NyeXB0bzo6ZGlnZXN0OjpDb250ZXh0Ojp1cGRhdG\ +U6OmhiYTYzMTA1ZmFmZWE3NTM1EjhibGFrZTI6OmJsYWtlMmI6OlZhckJsYWtlMmI6OmNvbXByZXNz\ +OjpoYWM1NjE4YjQ4MDA2ZGNmMBM2cmlwZW1kMTYwOjpibG9jazo6cHJvY2Vzc19tc2dfYmxvY2s6Om\ +hjMmJiZGE5NzQ3ZTE5NWRkFDhibGFrZTI6OmJsYWtlMnM6OlZhckJsYWtlMnM6OmNvbXByZXNzOjpo\ +OWY5OWJhZWM2Zjk2YzcyZBU7ZGVub19zdGRfd2FzbV9jcnlwdG86OkRpZ2VzdENvbnRleHQ6Om5ldz\ +o6aGQ5ODM5NTdlMjJjZWU0NWIWK3NoYTE6OmNvbXByZXNzOjpjb21wcmVzczo6aDM5YmM5YTkzMzFk\ +OTI5MWMXOmRsbWFsbG9jOjpkbG1hbGxvYzo6RGxtYWxsb2M8QT46Om1hbGxvYzo6aGRhNDhiMThmMW\ +E5MzBiNzYYE2RpZ2VzdGNvbnRleHRfY2xvbmUZLWJsYWtlMzo6T3V0cHV0UmVhZGVyOjpmaWxsOjpo\ +MmVkODg0ODZlNGI1ZmUwMBo2Ymxha2UzOjpwb3J0YWJsZTo6Y29tcHJlc3NfaW5fcGxhY2U6OmhkZD\ +A1NDRkMGVlY2FhMzg4GydtZDU6OnV0aWxzOjpjb21wcmVzczo6aGM5YTkyZTVhZDhmZjE4YjIcMGJs\ +YWtlMzo6Y29tcHJlc3Nfc3VidHJlZV93aWRlOjpoZGFjYjAzMDRjMjJjNDBlMR04ZGxtYWxsb2M6Om\ +RsbWFsbG9jOjpEbG1hbGxvYzxBPjo6ZnJlZTo6aDBiMzY3OTNjOTcyMTIzM2YeE2RpZ2VzdGNvbnRl\ +eHRfcmVzZXQfQWRsbWFsbG9jOjpkbG1hbGxvYzo6RGxtYWxsb2M8QT46OmRpc3Bvc2VfY2h1bms6Om\ +hlYzVjMmFmM2Q0MjQ2NmJlIC9ibGFrZTM6Okhhc2hlcjo6ZmluYWxpemVfeG9mOjpoMjg5NmI4YzM2\ +MGUwZDhmMSEga2VjY2FrOjpmMTYwMDo6aGI4ZWY2ZDUzZWExMTM4NWQiLGNvcmU6OmZtdDo6Rm9ybW\ +F0dGVyOjpwYWQ6OmhjYzZkYjdiNTkzZjNiOTYzIw5fX3J1c3RfcmVhbGxvYyRhPHNoYTI6OnNoYTUx\ +Mjo6U2hhNTEyIGFzIGRpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGlydHk+OjpmaW5hbGl6ZV9pbn\ +RvX2RpcnR5OjpoMWFlNThjMTE4OTRmNjE1OCUxYmxha2UzOjpIYXNoZXI6Om1lcmdlX2N2X3N0YWNr\ +OjpoZGEzOGQ1OTZmMDBiYTI3ZCY1Y29yZTo6Zm10OjpGb3JtYXR0ZXI6OnBhZF9pbnRlZ3JhbDo6aD\ +hiZGViZjZhZmU0YzAxZWQnI2NvcmU6OmZtdDo6d3JpdGU6OmhlOWM0ZGM2YjA1ODA0MDk1KGE8c2hh\ +Mjo6c2hhNTEyOjpTaGEzODQgYXMgZGlnZXN0OjpmaXhlZDo6Rml4ZWRPdXRwdXREaXJ0eT46OmZpbm\ +FsaXplX2ludG9fZGlydHk6OmhhNjMxOGJjMmNiNGZmMjhiKVc8c2hhMTo6U2hhMSBhcyBkaWdlc3Q6\ +OmZpeGVkOjpGaXhlZE91dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0eTo6aGUzMTg1OGYwOT\ +cxY2IxYmYqNGJsYWtlMzo6Y29tcHJlc3NfcGFyZW50c19wYXJhbGxlbDo6aDlkMDczMDcwODYyMDRk\ +YTUrMnNoYTI6OnNoYTUxMjo6RW5naW5lNTEyOjpmaW5pc2g6Omg0N2M0YWIxNmI1ZWVlYzFlLGE8c2\ +hhMjo6c2hhMjU2OjpTaGEyNTYgYXMgZGlnZXN0OjpmaXhlZDo6Rml4ZWRPdXRwdXREaXJ0eT46OmZp\ +bmFsaXplX2ludG9fZGlydHk6OmhhNWZjNDdiZWViZmI4NDQ5LTtibGFrZTI6OmJsYWtlMmI6OlZhck\ +JsYWtlMmI6OndpdGhfcGFyYW1zOjpoMzA0Nzc0MzY1NWI0MTRjNS4yc2hhMjo6c2hhMjU2OjpFbmdp\ +bmUyNTY6OmZpbmlzaDo6aDA3NWU4YzkwYmQxMWZlZWYvQ2RpZ2VzdDo6dmFyaWFibGU6OlZhcmlhYm\ +xlT3V0cHV0OjpmaW5hbGl6ZV9ib3hlZDo6aDlmODE5MWUxZTE5ZWFlMjEwLWJsYWtlMzo6Q2h1bmtT\ +dGF0ZTo6dXBkYXRlOjpoNzYxMGFmYTg5ZmVmMjlhNDFhPHNoYTI6OnNoYTI1Njo6U2hhMjI0IGFzIG\ +RpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGlydHk+OjpmaW5hbGl6ZV9pbnRvX2RpcnR5OjpoOTE2\ +NTU3OTkyNTA4NjUyYzIvY29yZTo6Zm10OjpudW06OmltcDo6Zm10X3U2NDo6aDQ0MGVjNGI3YmY4NG\ +YzZTMzODxEIGFzIGRpZ2VzdDo6ZGlnZXN0OjpEaWdlc3Q+Ojp1cGRhdGU6Omg5YWUzOGNjZDMxZTQ5\ +MmI1NFw8c2hhMzo6S2VjY2FrNTEyIGFzIGRpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGlydHk+Oj\ +pmaW5hbGl6ZV9pbnRvX2RpcnR5OjpoYmY4YzJlNzdiYjM0ZGYyZTVbPHNoYTM6OlNoYTNfNTEyIGFz\ +IGRpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGlydHk+OjpmaW5hbGl6ZV9pbnRvX2RpcnR5OjpoOD\ +BhYjlhNWNlMDExNjBiMDZuZ2VuZXJpY19hcnJheTo6aW1wbHM6OjxpbXBsIGNvcmU6OmNsb25lOjpD\ +bG9uZSBmb3IgZ2VuZXJpY19hcnJheTo6R2VuZXJpY0FycmF5PFQsTj4+OjpjbG9uZTo6aGEyZDU2ZG\ +FhOTk3ZjBmODI3YTxyaXBlbWQxNjA6OlJpcGVtZDE2MCBhcyBkaWdlc3Q6OmZpeGVkOjpGaXhlZE91\ +dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0eTo6aGJmNTMyY2VlMDkyYmQzMTk4ODxEIGFzIG\ +RpZ2VzdDo6ZGlnZXN0OjpEaWdlc3Q+Ojp1cGRhdGU6Omg0MTQyMjY4ODcyOGNjODQzOVA8c2hhMzo6\ +cmVhZGVyOjpTaGEzWG9mUmVhZGVyIGFzIGRpZ2VzdDo6eG9mOjpYb2ZSZWFkZXI+OjpyZWFkOjpoYz\ +E4YjFiZTgxMzIyZTM2NzpVPG1kNTo6TWQ1IGFzIGRpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGly\ +dHk+OjpmaW5hbGl6ZV9pbnRvX2RpcnR5OjpoZmNjYTE3MjVkNjBkNDI2MTtcPHNoYTM6OktlY2Nhaz\ +M4NCBhcyBkaWdlc3Q6OmZpeGVkOjpGaXhlZE91dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0\ +eTo6aDE5MDU0ZWQ3YzdjYWQ2NzI8WzxzaGEzOjpTaGEzXzM4NCBhcyBkaWdlc3Q6OmZpeGVkOjpGaX\ +hlZE91dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0eTo6aDA5NDAyZjgzMzY4ZDk3OGQ9NmJs\ +YWtlMjo6Ymxha2UyYjo6VmFyQmxha2UyYjo6dXBkYXRlOjpoMWI5NzMyMDUyZDhmNTMyNz4GZGlnZX\ +N0P1w8c2hhMzo6S2VjY2FrMjI0IGFzIGRpZ2VzdDo6Zml4ZWQ6OkZpeGVkT3V0cHV0RGlydHk+Ojpm\ +aW5hbGl6ZV9pbnRvX2RpcnR5OjpoOTU1MjQ5YTJlYWFmM2U3Y0BcPHNoYTM6OktlY2NhazI1NiBhcy\ +BkaWdlc3Q6OmZpeGVkOjpGaXhlZE91dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0eTo6aDM1\ +ZjY2MGUzYmY2ZmZmZTFBWzxzaGEzOjpTaGEzXzIyNCBhcyBkaWdlc3Q6OmZpeGVkOjpGaXhlZE91dH\ +B1dERpcnR5Pjo6ZmluYWxpemVfaW50b19kaXJ0eTo6aDc5OTQxYzA0MDZhMzQyN2NCWzxzaGEzOjpT\ +aGEzXzI1NiBhcyBkaWdlc3Q6OmZpeGVkOjpGaXhlZE91dHB1dERpcnR5Pjo6ZmluYWxpemVfaW50b1\ +9kaXJ0eTo6aDk5NDAxMmVhMjQyYjk5MTdDPmRlbm9fc3RkX3dhc21fY3J5cHRvOjpEaWdlc3RDb250\ +ZXh0Ojp1cGRhdGU6Omg3OWI2ZTg3MzFhM2JmYWRhRG5nZW5lcmljX2FycmF5OjppbXBsczo6PGltcG\ +wgY29yZTo6Y2xvbmU6OkNsb25lIGZvciBnZW5lcmljX2FycmF5OjpHZW5lcmljQXJyYXk8VCxOPj46\ +OmNsb25lOjpoZDY5N2EwMjkzY2VkYTAxOEVuZ2VuZXJpY19hcnJheTo6aW1wbHM6OjxpbXBsIGNvcm\ +U6OmNsb25lOjpDbG9uZSBmb3IgZ2VuZXJpY19hcnJheTo6R2VuZXJpY0FycmF5PFQsTj4+OjpjbG9u\ +ZTo6aDU4MzFjN2E3M2MyNTZkNDZGbmdlbmVyaWNfYXJyYXk6OmltcGxzOjo8aW1wbCBjb3JlOjpjbG\ +9uZTo6Q2xvbmUgZm9yIGdlbmVyaWNfYXJyYXk6OkdlbmVyaWNBcnJheTxULE4+Pjo6Y2xvbmU6Omg3\ +MWZjMWJlOWJkM2YzOGI5R25nZW5lcmljX2FycmF5OjppbXBsczo6PGltcGwgY29yZTo6Y2xvbmU6Ok\ +Nsb25lIGZvciBnZW5lcmljX2FycmF5OjpHZW5lcmljQXJyYXk8VCxOPj46OmNsb25lOjpoOTZjNzBl\ +MDE3MmM1ZGZlN0huZ2VuZXJpY19hcnJheTo6aW1wbHM6OjxpbXBsIGNvcmU6OmNsb25lOjpDbG9uZS\ +Bmb3IgZ2VuZXJpY19hcnJheTo6R2VuZXJpY0FycmF5PFQsTj4+OjpjbG9uZTo6aDg2NzE4Y2RkNDM0\ +MWFhZWVJbmdlbmVyaWNfYXJyYXk6OmltcGxzOjo8aW1wbCBjb3JlOjpjbG9uZTo6Q2xvbmUgZm9yIG\ +dlbmVyaWNfYXJyYXk6OkdlbmVyaWNBcnJheTxULE4+Pjo6Y2xvbmU6Omg5MDk5MzRmZGQ5MDFjZWIy\ +Sl08c2hhMzo6U2hha2UyNTYgYXMgZGlnZXN0Ojp4b2Y6OkV4dGVuZGFibGVPdXRwdXREaXJ0eT46Om\ +ZpbmFsaXplX3hvZl9kaXJ0eTo6aDUxMjViNjEwNWIzMzE4ODRLXTxzaGEzOjpTaGFrZTEyOCBhcyBk\ +aWdlc3Q6OnhvZjo6RXh0ZW5kYWJsZU91dHB1dERpcnR5Pjo6ZmluYWxpemVfeG9mX2RpcnR5OjpoMT\ +QwMzBiMDU3N2JhYjEzNkwbZGlnZXN0Y29udGV4dF9kaWdlc3RBbmREcm9wTS1qc19zeXM6OlVpbnQ4\ +QXJyYXk6OnRvX3ZlYzo6aDRlNjFiMjVhY2Q4MTZmMzROP3dhc21fYmluZGdlbjo6Y29udmVydDo6Y2\ +xvc3VyZXM6Omludm9rZTNfbXV0OjpoNmM1YjcyZTQwZTE1NWEzZk8UZGlnZXN0Y29udGV4dF9kaWdl\ +c3RQEWRpZ2VzdGNvbnRleHRfbmV3URxkaWdlc3Rjb250ZXh0X2RpZ2VzdEFuZFJlc2V0Ui5jb3JlOj\ +pyZXN1bHQ6OnVud3JhcF9mYWlsZWQ6Omg5YmY5OWJjYTg4YmEwNWRjU1A8YXJyYXl2ZWM6OmVycm9y\ +czo6Q2FwYWNpdHlFcnJvcjxUPiBhcyBjb3JlOjpmbXQ6OkRlYnVnPjo6Zm10OjpoNWIzMTFhMjM0Nj\ +ZjYzc1ZFRQPGFycmF5dmVjOjplcnJvcnM6OkNhcGFjaXR5RXJyb3I8VD4gYXMgY29yZTo6Zm10OjpE\ +ZWJ1Zz46OmZtdDo6aDhkYTA5MzEyZWNlNTM3NjZVPWNvcmU6OnNsaWNlOjppbmRleDo6c2xpY2VfaW\ +5kZXhfb3JkZXJfZmFpbDo6aGU1M2ZmMzYxNjAwYzhiZTFWP2NvcmU6OnNsaWNlOjppbmRleDo6c2xp\ +Y2VfZW5kX2luZGV4X2xlbl9mYWlsOjpoZDgxM2NkY2EwMGVkNTkwZFdBY29yZTo6c2xpY2U6OmluZG\ +V4OjpzbGljZV9zdGFydF9pbmRleF9sZW5fZmFpbDo6aGY4NjRkYjJmNzBjZmUxMmRYTmNvcmU6OnNs\ +aWNlOjo8aW1wbCBbVF0+Ojpjb3B5X2Zyb21fc2xpY2U6Omxlbl9taXNtYXRjaF9mYWlsOjpoODU3Mj\ +c3ZGYwMzg3N2ZmOFk2Y29yZTo6cGFuaWNraW5nOjpwYW5pY19ib3VuZHNfY2hlY2s6OmhiMTUxNzdl\ +MDY3OTIzMjE1WjdnZW5lcmljX2FycmF5Ojpmcm9tX2l0ZXJfbGVuZ3RoX2ZhaWw6OmhjZTQ1MWY0ZT\ +FiMTBiMzk2WzdzdGQ6OnBhbmlja2luZzo6cnVzdF9wYW5pY193aXRoX2hvb2s6OmhiZGJjZWI1Y2Qx\ +NThiZjE5XC5jb3JlOjpvcHRpb246OmV4cGVjdF9mYWlsZWQ6Omg5NjM4Y2RjNjQ1Y2YzODUzXRhfX3\ +diZ19kaWdlc3Rjb250ZXh0X2ZyZWVeBGJjbXBfQ2NvcmU6OmZtdDo6Rm9ybWF0dGVyOjpwYWRfaW50\ +ZWdyYWw6OndyaXRlX3ByZWZpeDo6aGJmNDYzNDdjZWNjY2Y1M2VgKWNvcmU6OnBhbmlja2luZzo6cG\ +FuaWM6Omg1YmZkZmFhM2RiOWE0YjRhYQZtZW1jcHliEXJ1c3RfYmVnaW5fdW53aW5kYxRkaWdlc3Rj\ +b250ZXh0X3VwZGF0ZWQtY29yZTo6cGFuaWNraW5nOjpwYW5pY19mbXQ6OmgzYWI1NDE3MTU1YjdiYT\ +NiZUlzdGQ6OnN5c19jb21tb246OmJhY2t0cmFjZTo6X19ydXN0X2VuZF9zaG9ydF9iYWNrdHJhY2U6\ +OmhjNzYwODE2MWE0NjdjMDAyZgZtZW1zZXRnEV9fd2JpbmRnZW5fbWFsbG9jaD93YXNtX2JpbmRnZW\ +46OmNvbnZlcnQ6OmNsb3N1cmVzOjppbnZva2U0X211dDo6aDE4YzBmN2IzMDVlY2NkZWJpP3dhc21f\ +YmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Omludm9rZTNfbXV0OjpoNzIyODhmM2E4ODk4Nzk0Y2\ +o/d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6aW52b2tlM19tdXQ6OmgzNDNiOTUxODg5\ +ZTVhOGQxaz93YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjppbnZva2UzX211dDo6aDMwMG\ +UxNmNmM2I2MTdhNzNsP3dhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Omludm9rZTNfbXV0\ +OjpoMWIzNWVjYWU1OGY0NGU5ZW0/d2FzbV9iaW5kZ2VuOjpjb252ZXJ0OjpjbG9zdXJlczo6aW52b2\ +tlM19tdXQ6Omg0YTE1MWFhNjkwOTk2YjFmbj93YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVz\ +OjppbnZva2UzX211dDo6aDI4ODhjNTQ3ODI1NTZmOTZvP3dhc21fYmluZGdlbjo6Y29udmVydDo6Y2\ +xvc3VyZXM6Omludm9rZTNfbXV0OjpoZDcyMmM2ZjMxYmZhOTVmYXASX193YmluZGdlbl9yZWFsbG9j\ +cT93YXNtX2JpbmRnZW46OmNvbnZlcnQ6OmNsb3N1cmVzOjppbnZva2UyX211dDo6aDZkYzYwYTM2MW\ +UzMzhmMDNyQ3N0ZDo6cGFuaWNraW5nOjpiZWdpbl9wYW5pY19oYW5kbGVyOjp7e2Nsb3N1cmV9fTo6\ +aDk5OTViYjJmMGRlNGJiMzhzP3dhc21fYmluZGdlbjo6Y29udmVydDo6Y2xvc3VyZXM6Omludm9rZT\ +FfbXV0OjpoNzQ2NzM4ODc0MzJiYzk5YXRFPGJsb2NrX3BhZGRpbmc6OlBhZEVycm9yIGFzIGNvcmU6\ +OmZtdDo6RGVidWc+OjpmbXQ6Omg4MmNjZjVjZDVlZjEyMzYxdTJjb3JlOjpvcHRpb246Ok9wdGlvbj\ +xUPjo6dW53cmFwOjpoN2I1NTE4MzMyMTZjODg2NnYwPCZUIGFzIGNvcmU6OmZtdDo6RGVidWc+Ojpm\ +bXQ6Omg3YjQwZGQ3ZTE4OTYzYTI5dzI8JlQgYXMgY29yZTo6Zm10OjpEaXNwbGF5Pjo6Zm10OjpoMz\ +ZjMTY4MTliNWRlNjMwM3hOPEkgYXMgY29yZTo6aXRlcjo6dHJhaXRzOjpjb2xsZWN0OjpJbnRvSXRl\ +cmF0b3I+OjppbnRvX2l0ZXI6OmhjMzM1ZGVmZWRlMDM4NTdheS1jb3JlOjpzbGljZTo6cmF3Ojpmcm\ +9tX3JlZjo6aDYwYzI4M2M2OGQyMDMyYTJ6LWNvcmU6OnNsaWNlOjpyYXc6OmZyb21fcmVmOjpoMTU1\ +OTZkYTRhOTQ4ZjI2MHsPX193YmluZGdlbl9mcmVlfDRhbGxvYzo6cmF3X3ZlYzo6Y2FwYWNpdHlfb3\ +ZlcmZsb3c6Omg0MDdlNmNkMTdlMmRhNWI1fTNhcnJheXZlYzo6YXJyYXl2ZWM6OmV4dGVuZF9wYW5p\ +Yzo6aDM2ODRhZmY1NWU0YjBhNzh+OWNvcmU6Om9wczo6ZnVuY3Rpb246OkZuT25jZTo6Y2FsbF9vbm\ +NlOjpoYjVlN2Y4Y2Y1Nzk5OWFkN38fX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcoABTmNv\ +cmU6OmZtdDo6bnVtOjppbXA6OjxpbXBsIGNvcmU6OmZtdDo6RGlzcGxheSBmb3IgdTMyPjo6Zm10Oj\ +poNjQ1ZjQ1YTkxZTcxNWM4NYEBMXdhc21fYmluZGdlbjo6X19ydDo6dGhyb3dfbnVsbDo6aGVlNzlk\ +OThkYjg5ZGIyMmWCATJ3YXNtX2JpbmRnZW46Ol9fcnQ6OmJvcnJvd19mYWlsOjpoYzZmY2U3MTdjYz\ +lkZDM5MIMBKndhc21fYmluZGdlbjo6dGhyb3dfc3RyOjpoNGQ4MWYxZmY5OTJhMmJjNYQBKndhc21f\ +YmluZGdlbjo6dGhyb3dfdmFsOjpoYTkyOWM2ZjM4ODI4YTBiOIUBMTxUIGFzIGNvcmU6OmFueTo6QW\ +55Pjo6dHlwZV9pZDo6aDI5ZGVjODEzODJkM2Q2YTSGAQpydXN0X3BhbmljhwE3c3RkOjphbGxvYzo6\ +ZGVmYXVsdF9hbGxvY19lcnJvcl9ob29rOjpoMDZmYjkxMTY3MjYwOWRkN4gBb2NvcmU6OnB0cjo6ZH\ +JvcF9pbl9wbGFjZTwmY29yZTo6aXRlcjo6YWRhcHRlcnM6OmNvcGllZDo6Q29waWVkPGNvcmU6OnNs\ +aWNlOjppdGVyOjpJdGVyPHU4Pj4+OjpoNTRmNjAzZDg5NDA0ZWEyMgDvgICAAAlwcm9kdWNlcnMCCG\ +xhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuNTMuMCAoNTNjYjdiMDliIDIwMjEt\ +MDYtMTcpBndhbHJ1cwYwLjE5LjAMd2FzbS1iaW5kZ2VuBjAuMi43NA==\ +", +); + +export default data; diff --git a/_wasm_crypto/mod.ts b/_wasm_crypto/mod.ts new file mode 100644 index 000000000..1a2725f0b --- /dev/null +++ b/_wasm_crypto/mod.ts @@ -0,0 +1,40 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +export * as crypto from "./crypto.js"; + +/** + * All cryptographic hash/digest algorithms supported by std/_wasm_crypto. + * + * For algorithms that are supported by WebCrypto, the name here must match the + * one used by WebCrypto. Otherwise we should prefer the formatting used in the + * official specification. All names are uppercase to faciliate case-insensitive + * comparisons required by the WebCrypto spec. + */ +export const digestAlgorithms = [ + "BLAKE2B-256", + "BLAKE2B-384", + "BLAKE2B", + "BLAKE2S", + "BLAKE3", + "KECCAK-224", + "KECCAK-256", + "KECCAK-384", + "KECCAK-512", + "SHA-384", + "SHA3-224", + "SHA3-256", + "SHA3-384", + "SHA3-512", + "SHAKE128", + "SHAKE256", + // insecure (length-extendable): + "RIPEMD-160", + "SHA-224", + "SHA-256", + "SHA-512", + // insecure (collidable and length-extendable): + "MD5", + "SHA-1", +] as const; + +/** An algorithm name supported by std/_wasm_crypto. */ +export type DigestAlgorithm = typeof digestAlgorithms[number]; diff --git a/_wasm_crypto/rust-toolchain b/_wasm_crypto/rust-toolchain new file mode 100644 index 000000000..3f4830156 --- /dev/null +++ b/_wasm_crypto/rust-toolchain @@ -0,0 +1 @@ +1.53.0 diff --git a/_wasm_crypto/src/digest.rs b/_wasm_crypto/src/digest.rs new file mode 100644 index 000000000..cf04104d5 --- /dev/null +++ b/_wasm_crypto/src/digest.rs @@ -0,0 +1,325 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use digest::{ + BlockInput, Digest, DynDigest, ExtendableOutput, Reset, Update, + VariableOutput, +}; + +/// Enum wrapper over all supported digest implementations. +#[derive(Clone)] +pub enum Context { + Blake2b(Box), + Blake2b256(Box), + Blake2b384(Box), + Blake2s(Box), + Blake3(Box), + Keccak224(Box), + Keccak256(Box), + Keccak384(Box), + Keccak512(Box), + Md5(Box), + Ripemd160(Box), + Sha1(Box), + Sha3_224(Box), + Sha3_256(Box), + Sha3_384(Box), + Sha3_512(Box), + Sha224(Box), + Sha256(Box), + Sha384(Box), + Sha512(Box), + Shake128(Box), + Shake256(Box), +} + +use Context::*; + +impl Context { + pub fn new(algorithm_name: &str) -> Result { + Ok(match algorithm_name { + "BLAKE2B" => Blake2b(Default::default()), + "BLAKE2B-256" => { + Blake2b256(Box::new(blake2::VarBlake2b::new(256 / 8).unwrap())) + } + "BLAKE2B-384" => { + Blake2b384(Box::new(blake2::VarBlake2b::new(384 / 8).unwrap())) + } + "BLAKE2S" => Blake2s(Default::default()), + "BLAKE3" => Blake3(Default::default()), + "KECCAK-224" => Keccak224(Default::default()), + "KECCAK-256" => Keccak256(Default::default()), + "KECCAK-384" => Keccak384(Default::default()), + "KECCAK-512" => Keccak512(Default::default()), + "MD5" => Md5(Default::default()), + "RIPEMD-160" => Ripemd160(Default::default()), + "SHA-1" => Sha1(Default::default()), + "SHA3-224" => Sha3_224(Default::default()), + "SHA3-256" => Sha3_256(Default::default()), + "SHA3-384" => Sha3_384(Default::default()), + "SHA3-512" => Sha3_512(Default::default()), + "SHA-224" => Sha224(Default::default()), + "SHA-256" => Sha256(Default::default()), + "SHA-384" => Sha384(Default::default()), + "SHA-512" => Sha512(Default::default()), + "SHAKE128" => Shake128(Default::default()), + "SHAKE256" => Shake256(Default::default()), + _ => return Err("unsupported algorithm"), + }) + } + + /// The input block length for the algorithm, in bytes. + pub fn input_block_length(&self) -> usize { + // For algorithm types that implement BlockInput and have a statically + // available BlockSize as part of their type definition, we use that value. + fn static_block_length(_: &T) -> usize { + ::to_usize() + } + + match self { + Blake2b(context) => static_block_length(&**context), + Blake2b256(context) => static_block_length(&**context), + Blake2b384(context) => static_block_length(&**context), + Blake2s(context) => static_block_length(&**context), + Blake3(context) => static_block_length(&**context), + Keccak224(context) => static_block_length(&**context), + Keccak256(context) => static_block_length(&**context), + Keccak384(context) => static_block_length(&**context), + Keccak512(context) => static_block_length(&**context), + Md5(context) => static_block_length(&**context), + Ripemd160(context) => static_block_length(&**context), + Sha1(context) => static_block_length(&**context), + Sha3_224(context) => static_block_length(&**context), + Sha3_256(context) => static_block_length(&**context), + Sha3_384(context) => static_block_length(&**context), + Sha3_512(context) => static_block_length(&**context), + Sha224(context) => static_block_length(&**context), + Sha256(context) => static_block_length(&**context), + Sha384(context) => static_block_length(&**context), + Sha512(context) => static_block_length(&**context), + + // https://doi.org/10.6028/NIST.FIPS.202 specifies that: + // - In general, the input block size (in bits) of a sponge function is + // its rate. + // - SPONGE[f, pad, r] = The sponge function in which the underlying + // function is f, the padding rule is pad, and the rate is r. + // - KECCAK[c] = SPONGE[KECCAK-p[1600, 24], pad10*1, 1600–c] + // - SHAKE128(M, d) = KECCAK[256] (M || 1111, d) + Shake128(_) => 168, // implying a rate of (1600 - 256) bits = 168 bytes + // - SHAKE256(M, d) = KECCAK[512] (M || 1111, d). + Shake256(_) => 136, // implying a rate of (1600 - 512) bits = 136 bytes + } + } + + /// The output digest length for the algorithm, in bytes. + /// + /// If the algorithm is variable-length, this returns its default length. + pub fn output_length(&self) -> usize { + match self { + Blake2b(context) => context.output_size(), + Blake2b256(context) => context.output_size(), + Blake2b384(context) => context.output_size(), + Blake2s(context) => context.output_size(), + Blake3(context) => context.output_size(), + Keccak224(context) => context.output_size(), + Keccak256(context) => context.output_size(), + Keccak384(context) => context.output_size(), + Keccak512(context) => context.output_size(), + Md5(context) => context.output_size(), + Ripemd160(context) => context.output_size(), + Sha1(context) => context.output_size(), + Sha3_224(context) => context.output_size(), + Sha3_256(context) => context.output_size(), + Sha3_384(context) => context.output_size(), + Sha3_512(context) => context.output_size(), + Sha224(context) => context.output_size(), + Sha256(context) => context.output_size(), + Sha384(context) => context.output_size(), + Sha512(context) => context.output_size(), + + // https://doi.org/10.6028/NIST.FIPS.202's Table 4 indicates that in order + // to reach the target security strength for these algorithms, the output + // size (in bits) needs to be (at least) two times larger than that + // security strength (in bits). + Shake128(_) => 32, // implying a length of (2 * 128) bits = 32 bytes + Shake256(_) => 64, // implying a length of (2 * 256) bits = 64 bytes + } + } + + /// Whether the algorithm has an extendable variable-length digest output + /// (whether it is an "XOF"). + pub const fn extendable(&self) -> bool { + matches!(self, Blake3(_) | Shake128(_) | Shake256(_)) + } + + /// The name of the algorithm used by this context. + /// + /// Names are all uppercase (for ease of case-insensitive comparisons) and + /// will match the name formatting used in WebCrypto if the algorithm is + /// supported by WebCrypto, and otherwise match the formatting used in the + /// official specification for the algorithm. + pub const fn algorithm_name(&self) -> &'static str { + match self { + Blake2b(_) => "BLAKE2B", + Blake2b256(_) => "BLAKE2B-256", + Blake2b384(_) => "BLAKE2B-384", + Blake2s(_) => "BLAKE2S", + Blake3(_) => "BLAKE3", + Keccak224(_) => "KECCAK-224", + Keccak256(_) => "KECCAK-256", + Keccak384(_) => "KECCAK-384", + Keccak512(_) => "KECCAK-512", + Md5(_) => "MD5", + Ripemd160(_) => "RIPEMD-160", + Sha1(_) => "SHA-1", + Sha3_224(_) => "SHA3-224", + Sha3_256(_) => "SHA3-256", + Sha3_384(_) => "SHA3-384", + Sha3_512(_) => "SHA3-512", + Sha224(_) => "SHA-224", + Sha256(_) => "SHA-256", + Sha384(_) => "SHA-384", + Sha512(_) => "SHA-512", + Shake128(_) => "SHAKE128", + Shake256(_) => "SHAKE256", + } + } + + pub fn reset(&mut self) { + match self { + Blake2b(context) => Reset::reset(&mut **context), + Blake2b256(context) => Reset::reset(&mut **context), + Blake2b384(context) => Reset::reset(&mut **context), + Blake2s(context) => Reset::reset(&mut **context), + Blake3(context) => Reset::reset(&mut **context), + Keccak224(context) => Reset::reset(&mut **context), + Keccak256(context) => Reset::reset(&mut **context), + Keccak384(context) => Reset::reset(&mut **context), + Keccak512(context) => Reset::reset(&mut **context), + Md5(context) => Reset::reset(&mut **context), + Ripemd160(context) => Reset::reset(&mut **context), + Sha1(context) => Reset::reset(&mut **context), + Sha3_224(context) => Reset::reset(&mut **context), + Sha3_256(context) => Reset::reset(&mut **context), + Sha3_384(context) => Reset::reset(&mut **context), + Sha3_512(context) => Reset::reset(&mut **context), + Sha224(context) => Reset::reset(&mut **context), + Sha256(context) => Reset::reset(&mut **context), + Sha384(context) => Reset::reset(&mut **context), + Sha512(context) => Reset::reset(&mut **context), + Shake128(context) => Reset::reset(&mut **context), + Shake256(context) => Reset::reset(&mut **context), + }; + } + + pub fn update(&mut self, data: &[u8]) { + match self { + Blake2b(context) => Digest::update(&mut **context, data), + Blake2b256(context) => (&mut **context).update(data), + Blake2b384(context) => (&mut **context).update(data), + Blake2s(context) => Digest::update(&mut **context, data), + Blake3(context) => Digest::update(&mut **context, data), + Keccak224(context) => Digest::update(&mut **context, data), + Keccak256(context) => Digest::update(&mut **context, data), + Keccak384(context) => Digest::update(&mut **context, data), + Keccak512(context) => Digest::update(&mut **context, data), + Md5(context) => Digest::update(&mut **context, data), + Ripemd160(context) => Digest::update(&mut **context, data), + Sha1(context) => Digest::update(&mut **context, data), + Sha3_224(context) => Digest::update(&mut **context, data), + Sha3_256(context) => Digest::update(&mut **context, data), + Sha3_384(context) => Digest::update(&mut **context, data), + Sha3_512(context) => Digest::update(&mut **context, data), + Sha224(context) => Digest::update(&mut **context, data), + Sha256(context) => Digest::update(&mut **context, data), + Sha384(context) => Digest::update(&mut **context, data), + Sha512(context) => Digest::update(&mut **context, data), + Shake128(context) => (&mut **context).update(data), + Shake256(context) => (&mut **context).update(data), + }; + } + + pub fn digest_and_drop( + self, + length: Option, + ) -> Result, &'static str> { + if let Some(length) = length { + if !self.extendable() && length != self.output_length() { + return Err( + "non-default length specified for non-extendable algorithm", + ); + } + } + + let length = length.unwrap_or_else(|| self.output_length()); + + Ok(match self { + Blake2b(context) => context.finalize(), + Blake2b256(context) => context.finalize_boxed(), + Blake2b384(context) => context.finalize_boxed(), + Blake2s(context) => context.finalize(), + Blake3(context) => context.finalize_boxed(length), + Keccak224(context) => context.finalize(), + Keccak256(context) => context.finalize(), + Keccak384(context) => context.finalize(), + Keccak512(context) => context.finalize(), + Md5(context) => context.finalize(), + Ripemd160(context) => context.finalize(), + Sha1(context) => context.finalize(), + Sha3_224(context) => context.finalize(), + Sha3_256(context) => context.finalize(), + Sha3_384(context) => context.finalize(), + Sha3_512(context) => context.finalize(), + Sha224(context) => context.finalize(), + Sha256(context) => context.finalize(), + Sha384(context) => context.finalize(), + Sha512(context) => context.finalize(), + Shake128(context) => context.finalize_boxed(length), + Shake256(context) => context.finalize_boxed(length), + }) + } + + pub fn digest_and_reset( + &mut self, + length: Option, + ) -> Result, &'static str> { + if let Some(length) = length { + if !self.extendable() && length != self.output_length() { + return Err( + "non-default length specified for non-extendable algorithm", + ); + } + } + + let length = length.unwrap_or_else(|| self.output_length()); + Ok(match self { + Blake2b(context) => DynDigest::finalize_reset(context.as_mut()), + Blake2b256(context) => context.finalize_boxed_reset(), + Blake2b384(context) => context.finalize_boxed_reset(), + Blake2s(context) => DynDigest::finalize_reset(context.as_mut()), + Blake3(context) => context.finalize_boxed_reset(length), + Keccak224(context) => DynDigest::finalize_reset(context.as_mut()), + Keccak256(context) => DynDigest::finalize_reset(context.as_mut()), + Keccak384(context) => DynDigest::finalize_reset(context.as_mut()), + Keccak512(context) => DynDigest::finalize_reset(context.as_mut()), + Md5(context) => DynDigest::finalize_reset(context.as_mut()), + Ripemd160(context) => DynDigest::finalize_reset(context.as_mut()), + Sha1(context) => DynDigest::finalize_reset(context.as_mut()), + Sha3_224(context) => DynDigest::finalize_reset(context.as_mut()), + Sha3_256(context) => DynDigest::finalize_reset(context.as_mut()), + Sha3_384(context) => DynDigest::finalize_reset(context.as_mut()), + Sha3_512(context) => DynDigest::finalize_reset(context.as_mut()), + Sha224(context) => DynDigest::finalize_reset(context.as_mut()), + Sha256(context) => DynDigest::finalize_reset(context.as_mut()), + Sha384(context) => DynDigest::finalize_reset(context.as_mut()), + Sha512(context) => DynDigest::finalize_reset(context.as_mut()), + Shake128(context) => context.finalize_boxed_reset(length), + Shake256(context) => context.finalize_boxed_reset(length), + }) + } + + pub fn digest( + &self, + length: Option, + ) -> Result, &'static str> { + self.clone().digest_and_drop(length) + } +} diff --git a/_wasm_crypto/src/lib.rs b/_wasm_crypto/src/lib.rs new file mode 100644 index 000000000..6a09f9b90 --- /dev/null +++ b/_wasm_crypto/src/lib.rs @@ -0,0 +1,164 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use derive_more::{From, Into}; +use js_sys::Uint8Array; +use wasm_bindgen::prelude::*; + +mod digest; + +/// Returns the digest of the given `data` using the given hash `algorithm`. +/// +/// `length` will usually be left `undefined` to use the default length for +/// the algorithm. For algorithms with variable-length output, it can be used +/// to specify a non-negative integer number of bytes. +/// +/// An error will be thrown if `algorithm` is not a supported hash algorithm or +/// `length` is not a supported length for the algorithm. +#[wasm_bindgen] +pub fn digest( + algorithm: String, + data: js_sys::Uint8Array, + length: Option, +) -> Result, JsValue> { + let mut context = DigestContext::new(algorithm)?; + context.update(data)?; + context.digest_and_drop(length) +} + +/// A context for incrementally computing a digest using a given hash algorithm. +#[wasm_bindgen] +#[derive(Clone, Into, From)] +pub struct DigestContext(digest::Context); + +#[wasm_bindgen] +impl DigestContext { + /// Creates a new context incrementally computing a digest using the given + /// hash algorithm. + /// + /// An error will be thrown if `algorithm` is not a supported hash algorithm. + #[wasm_bindgen(constructor)] + pub fn new(algorithm: String) -> Result { + Ok( + digest::Context::new(&algorithm) + .map_err(|message| JsValue::from(js_sys::TypeError::new(message)))? + .into(), + ) + } + + /// Update the digest's internal state with the additional input `data`. + /// + /// If the `data` array view is large, it will be split into subarrays (via + /// JavaScript bindings) which will be processed sequentially in order to + /// limit the amount of memory that needs to be allocated in the WASM heap. + #[wasm_bindgen] + pub fn update(&mut self, data: js_sys::Uint8Array) -> Result<(), JsValue> { + // Every method call on `data` has to go through the JavaScript bindings, so + // try to minimize them. Splitting on the JavaScript side could be more + // efficient, but this is called from multiple places in JavaScript so it + // seems simpler to keep it here for now. + + let length = data.byte_length(); + let base_offset = data.byte_offset(); + let buffer = data.buffer(); + + let chunk_size: u32 = 65_536; + + if length <= chunk_size { + let chunk = data.to_vec(); + self.0.update(&chunk); + } else { + let mut offset = 0; + while offset < length { + let chunk = Uint8Array::new_with_byte_offset_and_length( + &buffer, + base_offset + offset, + chunk_size.min(length - offset), + ) + .to_vec(); + self.0.update(&chunk); + offset += chunk_size; + } + } + + Ok(()) + } + + /// Returns the digest of the input data so far. This may be called repeatedly + /// without side effects. + /// + /// `length` will usually be left `undefined` to use the default length for + /// the algorithm. For algorithms with variable-length output, it can be used + /// to specify a non-negative integer number of bytes. + /// + /// An error will be thrown if `algorithm` is not a supported hash algorithm or + /// `length` is not a supported length for the algorithm. + #[wasm_bindgen] + pub fn digest(&self, length: Option) -> Result, JsValue> { + self + .0 + .digest(length) + .map_err(|message| JsValue::from(js_sys::TypeError::new(message))) + } + + /// Returns the digest of the input data so far, and resets this context to + /// its initial state, as though it has not yet been provided with any input + /// data. (It will still use the same algorithm.) + /// + /// `length` will usually be left `undefined` to use the default length for + /// the algorithm. For algorithms with variable-length output, it can be used + /// to specify a non-negative integer number of bytes. + /// + /// An error will be thrown if `algorithm` is not a supported hash algorithm or + /// `length` is not a supported length for the algorithm. + #[wasm_bindgen(js_name=digestAndReset)] + pub fn digest_and_reset( + &mut self, + length: Option, + ) -> Result, JsValue> { + self + .0 + .digest_and_reset(length) + .map_err(|message| JsValue::from(js_sys::TypeError::new(message))) + } + + /// Returns the digest of the input data so far, and then drops the context + /// from memory on the WASM side. This context must no longer be used, and any + /// further method calls will result in null pointer errors being thrown. + /// https://github.com/rustwasm/wasm-bindgen/blob/bf39cfd8/crates/backend/src/codegen.rs#L186 + /// + /// `length` will usually be left `undefined` to use the default length for + /// the algorithm. For algorithms with variable-length output, it can be used + /// to specify a non-negative integer number of bytes. + /// + /// An error will be thrown if `algorithm` is not a supported hash algorithm or + /// `length` is not a supported length for the algorithm. + #[wasm_bindgen(js_name=digestAndDrop)] + pub fn digest_and_drop( + mut self, + length: Option, + ) -> Result, JsValue> { + self + .0 + .digest_and_reset(length) + .map_err(|message| JsValue::from(js_sys::TypeError::new(message))) + } + + /// Resets this context to its initial state, as though it has not yet been + /// provided with any input data. (It will still use the same algorithm.) + #[wasm_bindgen] + pub fn reset(&mut self) -> Result<(), JsValue> { + self.0.reset(); + + Ok(()) + } + + /// Returns a new `DigestContext` that is a copy of this one, i.e., using the + /// same algorithm and with a copy of the same internal state. + /// + /// This may be a more efficient option for computing multiple digests that + /// start with a common prefix. + #[wasm_bindgen] + #[allow(clippy::should_implement_trait)] + pub fn clone(&self) -> DigestContext { + Clone::clone(self) + } +} diff --git a/_wasm_crypto/test.ts b/_wasm_crypto/test.ts new file mode 100644 index 000000000..7a38697e8 --- /dev/null +++ b/_wasm_crypto/test.ts @@ -0,0 +1,27 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +import { assertEquals } from "../testing/asserts.ts"; + +import { crypto as wasmCrypto } from "./mod.ts"; +import { _wasmBytes as wasmBytes } from "./crypto.js"; +import * as wasmFileModule from "./crypto.wasm.js"; + +const webCrypto = globalThis.crypto; + +Deno.test("test", async () => { + const input = new TextEncoder().encode("SHA-384"); + + const wasmDigest = wasmCrypto.digest("SHA-384", input, undefined); + + const webDigest = new Uint8Array( + await webCrypto.subtle!.digest("SHA-384", input), + ); + + assertEquals(wasmDigest, webDigest); +}); + +Deno.test("Inlined WASM file's metadata should match its content", () => { + assertEquals(wasmBytes.length, wasmFileModule.size); + assertEquals(wasmBytes.byteLength, wasmFileModule.size); + assertEquals(wasmFileModule.data.length, wasmFileModule.size); + assertEquals(wasmFileModule.data.buffer.byteLength, wasmFileModule.size); +}); diff --git a/crypto/README.md b/crypto/README.md new file mode 100644 index 000000000..759f1d9da --- /dev/null +++ b/crypto/README.md @@ -0,0 +1,13 @@ +# crypto + +## Usage + +```typescript +import { crypto } from "https://deno.land/std@$STD_VERSION/crypto/mod.ts"; + +// This will delegate to the runtime's WebCrypto implementation. +console.log(await crypto.subtle.digest("SHA-384", "hello world")); + +// This will use a bundled WASM/Rust implementation. +console.log(await crypto.subtle.digest("BLAKE3", "hello world")); +``` diff --git a/crypto/_benches/bench.ts b/crypto/_benches/bench.ts new file mode 100644 index 000000000..669025ba0 --- /dev/null +++ b/crypto/_benches/bench.ts @@ -0,0 +1,81 @@ +#!/usr/bin/env -S deno run +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +import { + bench, + runBenchmarks, +} from "https://deno.land/std@0.102.0/testing/bench.ts"; +import { createHash } from "https://deno.land/std@0.102.0/hash/mod.ts"; +import { assert, assertEquals } from "../../testing/asserts.ts"; + +import { crypto as stdCrypto } from "../mod.ts"; + +const webCrypto = globalThis.crypto; + +// WASM is limited to 32-bit operations, which SHA-256 is optimized for, while +// SHA-512 is optimized for 64-bit operations and may be slower. +for (const algorithm of ["SHA-256", "SHA-512"] as const) { + for ( + const length of [ + 64, + 262_144, + 4_194_304, + 67_108_864, + 524_291_328, + ] as const + ) { + // Create a test input buffer and do some operations to hopefully ensure + // it's fully initialized and not optimized away. + const buffer = new Uint8Array(length); + for (let i = 0; i < length; i++) { + buffer[i] = ((i + i % 13) + i % 31) % 255; + } + let sum = 0; + for (const byte of buffer) { + sum += byte; + } + assert(sum > 0); + + for ( + const implementation of [ + "runtime WebCrypto (target)", + "std@0.102.0/hash WASM (baseline)", + "std/crypto WASM (you are here)", + ] as const + ) { + let lastDigest: ArrayBuffer | undefined; + + bench({ + name: `${algorithm.padEnd(12)} ${ + length.toString().padStart(12) + }B ${implementation}`, + async func(timer) { + timer.start(); + + let digest; + if (implementation === "std/crypto WASM (you are here)") { + digest = stdCrypto.subtle.digestSync(algorithm, buffer); + } else if (implementation === "runtime WebCrypto (target)") { + digest = await webCrypto.subtle.digest(algorithm, buffer); + } else if (implementation === "std@0.102.0/hash WASM (baseline)") { + digest = createHash( + algorithm.toLowerCase().replace("-", "") as "sha256" | "sha512", + ).update(buffer).digest(); + } else { + throw new Error(`Unknown implementation ${implementation}`); + } + + timer.stop(); + + assert(digest.byteLength > 0); + if (lastDigest) { + assertEquals(lastDigest, digest); + } + lastDigest = digest; + }, + runs: 10, + }); + } + } +} + +await runBenchmarks(); diff --git a/crypto/mod.ts b/crypto/mod.ts new file mode 100644 index 000000000..23729ba90 --- /dev/null +++ b/crypto/mod.ts @@ -0,0 +1,282 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +import { + crypto as wasmCrypto, + DigestAlgorithm as WasmDigestAlgorithm, + digestAlgorithms as wasmDigestAlgorithms, +} from "../_wasm_crypto/mod.ts"; + +type WebCryptoAlgorithmIdentifier = string | { name: string }; + +// TODO(jeremyBanks): Remove this once the built-in `Crypto` interface is +// complete and stable. For now we use this incomplete-but-stable definition. +interface WebCrypto { + getRandomValues(buffer: T): T; + randomUUID?(): string; + subtle?: { + // see https://www.w3.org/TR/WebCryptoAPI/#subtlecrypto-interface + + /** + * Returns a new `Promise` object that will encrypt `data` using the + * specified `AlgorithmIdentifier` with the supplied `CryptoKey`. + */ + encrypt?( + algorithm: WebCryptoAlgorithmIdentifier, + key: unknown, + data: BufferSource, + ): Promise; + /** + * Returns a new `Promise` object that will decrypt `data` using the + * specified `AlgorithmIdentifier` with the supplied `CryptoKey`. + */ + decrypt?( + algorithm: WebCryptoAlgorithmIdentifier, + key: unknown, + data: BufferSource, + ): Promise; + + /** + * Returns a new `Promise` object that will sign `data` using the specified + * `AlgorithmIdentifier` with the supplied `CryptoKey`. + */ + sign?( + algorithm: WebCryptoAlgorithmIdentifier, + key: unknown, + data: BufferSource, + ): Promise; + /** + * Returns a new `Promise` object that will verify `data` using the + * specified `AlgorithmIdentifier` with the supplied `CryptoKey`. + */ + verify?( + algorithm: WebCryptoAlgorithmIdentifier, + key: unknown, + signature: BufferSource, + data: BufferSource, + ): Promise; + + /** + * Returns a new `Promise` object that will digest `data` using the + * specified `AlgorithmIdentifier`. + */ + digest?( + algorithm: WebCryptoAlgorithmIdentifier, + data: BufferSource, + ): Promise; + + generateKey?( + algorithm: WebCryptoAlgorithmIdentifier, + extractable: boolean, + keyUsages: string[], + ): Promise; + deriveKey?( + algorithm: WebCryptoAlgorithmIdentifier, + baseKey: unknown, + derivedKeyType: string, + extractable: boolean, + keyUsages: string[], + ): Promise; + deriveBits?( + algorithm: WebCryptoAlgorithmIdentifier, + baseKey: unknown, + length: number, + ): Promise; + + importKey?( + format: string, + keyData: BufferSource | unknown, + algorithm: WebCryptoAlgorithmIdentifier, + extractable: boolean, + keyUsages: string[], + ): Promise; + exportKey?(format: string, key: unknown): Promise; + + wrapKey?( + format: string, + key: unknown, + wrappingKey: unknown, + wrappingAlgorithm: WebCryptoAlgorithmIdentifier, + ): Promise; + unwrapKey?( + format: string, + wrappedKey: BufferSource, + unwrappingKey: unknown, + unwrapAlgorithm: WebCryptoAlgorithmIdentifier, + unwrappedKeyAlgorithm: WebCryptoAlgorithmIdentifier, + extractable: boolean, + keyUsages: string[], + ): Promise; + }; +} + +/** + * A copy of the global WebCrypto interface, with methods bound so they're + * safe to re-export. + */ +const webCrypto: WebCrypto = ((crypto) => ({ + getRandomValues: crypto.getRandomValues?.bind(crypto), + randomUUID: crypto.randomUUID?.bind(crypto), + subtle: { + decrypt: crypto.subtle?.decrypt?.bind(crypto.subtle), + deriveBits: crypto.subtle?.deriveBits?.bind(crypto.subtle), + deriveKey: crypto.subtle?.deriveKey?.bind(crypto.subtle), + digest: crypto.subtle?.digest?.bind(crypto.subtle), + encrypt: crypto.subtle?.encrypt?.bind(crypto.subtle), + exportKey: crypto.subtle?.exportKey?.bind(crypto.subtle), + generateKey: crypto.subtle?.generateKey?.bind(crypto.subtle), + importKey: crypto.subtle?.importKey?.bind(crypto.subtle), + sign: crypto.subtle?.sign?.bind(crypto.subtle), + unwrapKey: crypto.subtle?.unwrapKey?.bind(crypto.subtle), + verify: crypto.subtle?.verify?.bind(crypto.subtle), + wrapKey: crypto.subtle?.wrapKey?.bind(crypto.subtle), + }, +}))(globalThis.crypto as WebCrypto); + +const bufferSourceBytes = (data: BufferSource | unknown) => { + let bytes: Uint8Array | undefined; + if (data instanceof Uint8Array) { + bytes = data; + } else if (ArrayBuffer.isView(data)) { + bytes = new Uint8Array( + data.buffer, + data.byteOffset, + data.byteLength, + ); + } else if (data instanceof ArrayBuffer) { + bytes = new Uint8Array(data); + } + return bytes; +}; + +/** + * An wrapper for WebCrypto adding support for additional non-standard + * algorithms, but delegating to the runtime WebCrypto implementation whenever + * possible. + */ +const stdCrypto = ((x: T) => x)({ + ...webCrypto, + subtle: { + ...webCrypto.subtle, + + /** + * Returns a new `Promise` object that will digest `data` using the specified + * `AlgorithmIdentifier`. + */ + async digest( + algorithm: DigestAlgorithm, + data: BufferSource | AsyncIterable | Iterable, + ): Promise { + const { name, length } = normalizeAlgorithm(algorithm); + const bytes = bufferSourceBytes(data); + + // We delegate to WebCrypto whenever possible, + if ( + // if the SubtleCrypto interface is available, + webCrypto.subtle?.digest && + // if the algorithm is supported by the WebCrypto standard, + (webCryptoDigestAlgorithms as readonly string[]).includes(name) && + // and the data is a single buffer, + bytes + ) { + return webCrypto.subtle.digest( + algorithm, + bytes, + ); + } else if (wasmDigestAlgorithms.includes(name)) { + if (bytes) { + // Otherwise, we use our bundled WASM implementation via digestSync + // if it supports the algorithm. + return stdCrypto.subtle.digestSync(algorithm, bytes); + } else if ((data as Iterable)[Symbol.iterator]) { + return stdCrypto.subtle.digestSync( + algorithm, + data as Iterable, + ); + } else if ( + (data as AsyncIterable)[Symbol.asyncIterator] + ) { + const context = new wasmCrypto.DigestContext(name); + for await (const chunk of data as AsyncIterable) { + const chunkBytes = bufferSourceBytes(chunk); + if (!chunkBytes) { + throw new TypeError("data contained chunk of the wrong type"); + } + context.update(chunkBytes); + } + return context.digestAndDrop(length); + } else { + throw new TypeError( + "data must be a BufferSource or [Async]Iterable", + ); + } + } else if (webCrypto.subtle?.digest) { + // (TypeScript type definitions prohibit this case.) If they're trying + // to call an algorithm we don't recognize, pass it along to WebCrypto + // in case it's a non-standard algorithm supported by the the runtime + // they're using. + return await webCrypto.subtle.digest( + algorithm, + data as unknown as Uint8Array, + ); + } else { + throw new TypeError(`unsupported digest algorithm: ${algorithm}`); + } + }, + + /** + * Returns a ArrayBuffer with the result of digesting `data` using the + * specified `AlgorithmIdentifier`. + */ + digestSync( + algorithm: DigestAlgorithm, + data: BufferSource | Iterable, + ): ArrayBuffer { + algorithm = normalizeAlgorithm(algorithm); + + const bytes = bufferSourceBytes(data); + + if (bytes) { + return wasmCrypto.digest(algorithm.name, bytes, undefined); + } else if ((data as Iterable)[Symbol.iterator]) { + const context = new wasmCrypto.DigestContext(algorithm.name); + for (const chunk of data as Iterable) { + const chunkBytes = bufferSourceBytes(chunk); + if (!chunkBytes) { + throw new TypeError("data contained chunk of the wrong type"); + } + context.update(chunkBytes); + } + return context.digestAndDrop(algorithm.length); + } else { + throw new TypeError( + "data must be a BufferSource or Iterable", + ); + } + }, + }, +}); + +/** Digest algorithms supported by WebCrypto. */ +const webCryptoDigestAlgorithms = [ + "SHA-384", + "SHA-256", + "SHA-512", + // insecure (length-extendable and collidable): + "SHA-1", +] as const; + +type DigestAlgorithmName = WasmDigestAlgorithm; + +type DigestAlgorithmObject = { + name: DigestAlgorithmName; + length?: number; +}; + +type DigestAlgorithm = DigestAlgorithmName | DigestAlgorithmObject; + +const normalizeAlgorithm = (algorithm: DigestAlgorithm) => + ((typeof algorithm === "string") ? { name: algorithm.toUpperCase() } : { + ...algorithm, + name: algorithm.name.toUpperCase(), + }) as DigestAlgorithmObject; + +export { stdCrypto as crypto }; diff --git a/crypto/test.ts b/crypto/test.ts new file mode 100644 index 000000000..d964115aa --- /dev/null +++ b/crypto/test.ts @@ -0,0 +1,1259 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +import { assert, assertEquals } from "../testing/asserts.ts"; +import { crypto as stdCrypto } from "./mod.ts"; +import * as bytes from "../bytes/mod.ts"; +import { dirname, fromFileUrl } from "../path/mod.ts"; +import { DigestAlgorithm, digestAlgorithms } from "../_wasm_crypto/mod.ts"; +const moduleDir = dirname(fromFileUrl(import.meta.url)); + +const webCrypto = globalThis.crypto; + +Deno.test("[crypto/digest] Different ways to perform the same operation should produce the same result", async () => { + const inputString = "taking the hobbits to isengard"; + const inputBytes = new TextEncoder().encode(inputString); + const inputPieces = [inputBytes.slice(0, 8), inputBytes.slice(8)]; + + const emptyDigest = + "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"; + const expectedDigest = + "ae30c171b2b5a047b7986c185564407672441934a356686e6df3a8284f35214448c40738e65b8c308e38b068eed91676"; + + assertEquals( + toHexString(stdCrypto.subtle.digestSync("SHA-384", inputBytes)), + expectedDigest, + ); + + assertEquals( + toHexString( + await stdCrypto.subtle.digest("SHA-384", new Blob([inputBytes]).stream()), + ), + expectedDigest, + ); + + assertEquals( + toHexString(stdCrypto.subtle.digestSync("SHA-384", [inputBytes])), + expectedDigest, + ); + + assertEquals( + toHexString( + await stdCrypto.subtle.digest( + "SHA-384", + (async function* () { + yield new Uint16Array(); + yield inputPieces[0]; + yield new ArrayBuffer(0); + yield inputPieces[1]; + })(), + ), + ), + expectedDigest, + ); + + assertEquals( + toHexString( + stdCrypto.subtle.digestSync( + "SHA-384", + (function* () { + yield new ArrayBuffer(0); + yield* inputPieces; + yield new Int8Array(); + })(), + ), + ), + expectedDigest, + ); + + assertEquals( + toHexString( + await stdCrypto.subtle.digest( + "SHA-384", + (function* () { + yield inputBytes; + })(), + ), + ), + expectedDigest, + ); + + assertEquals( + toHexString(await webCrypto.subtle!.digest("SHA-384", inputBytes)), + expectedDigest, + ); + + assertEquals( + toHexString(stdCrypto.subtle.digestSync("SHA-384", new ArrayBuffer(0))), + emptyDigest, + ); + + assertEquals( + toHexString(await stdCrypto.subtle.digest("SHA-384", new ArrayBuffer(0))), + emptyDigest, + ); + + assertEquals( + toHexString(await webCrypto.subtle!.digest("SHA-384", new ArrayBuffer(0))), + emptyDigest, + ); +}); + +Deno.test("[crypto/digest] Memory use should remain reasonable even with large inputs", async () => { + const process = Deno.run({ + cmd: [Deno.execPath(), "--quiet", "run", "--no-check", "-"], + cwd: moduleDir, + stdout: "piped", + stdin: "piped", + }); + + await process.stdin.write( + new TextEncoder().encode(` + import { crypto as stdCrypto } from "./mod.ts"; + import { _wasm } from "../_wasm_crypto/crypto.js"; + + const { memory } = _wasm as { memory: WebAssembly.Memory }; + + const toHexString = (bytes: ArrayBuffer): string => + new Uint8Array(bytes).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); + + const heapBytesInitial = memory.buffer.byteLength; + + const smallData = new Uint8Array(64); + const smallDigest = toHexString(stdCrypto.subtle.digestSync("BLAKE3", smallData.buffer)); + const heapBytesAfterSmall = memory.buffer.byteLength; + + const largeData = new Uint8Array(64_000_000); + const largeDigest = toHexString(stdCrypto.subtle.digestSync("BLAKE3", largeData.buffer)); + const heapBytesAfterLarge = memory.buffer.byteLength; + + console.log(JSON.stringify( + { + heapBytesInitial, + smallDigest, + heapBytesAfterSmall, + largeDigest, + heapBytesAfterLarge, + }, + null, + 2, + )); + `), + ); + process.stdin.close(); + + const stdout = new TextDecoder().decode(await process.output()); + const status = await process.status(); + process.close(); + + assertEquals(status.success, true, "test subprocess failed"); + const { + heapBytesInitial, + smallDigest, + heapBytesAfterSmall, + largeDigest, + heapBytesAfterLarge, + }: { + heapBytesInitial: number; + smallDigest: string; + heapBytesAfterSmall: number; + largeDigest: string; + heapBytesAfterLarge: number; + } = JSON.parse(stdout); + + assertEquals( + smallDigest, + "4d006976636a8696d909a630a4081aad4d7c50f81afdee04020bf05086ab6a55", + `test subprocess returned wrong hash (${smallDigest})`, + ); + assertEquals( + largeDigest, + "64fee39c5a30a8af6287b4862eed4af93c2c3fde42d10c5350ac82237c2804b5", + `test subprocess returned wrong hash (${largeDigest})`, + ); + + // Heap should stay under 2MB even though we provided a 64MB input. + assert( + heapBytesInitial < 2_000_000, + `WASM heap was too large initially: ${ + (heapBytesInitial / 1_000_000).toFixed(1) + } MB`, + ); + assert( + heapBytesAfterSmall < 2_000_000, + `WASM heap was too large after small input: ${ + (heapBytesAfterSmall / 1_000_000).toFixed(1) + } MB`, + ); + assert( + heapBytesAfterLarge < 2_000_000, + `WASM heap was too large after large input: ${ + (heapBytesAfterLarge / 1_000_000).toFixed(1) + } MB`, + ); +}); + +Deno.test("[crypto/digest] Memory use should remain reasonable even with many calls", async () => { + const process = Deno.run({ + cmd: [Deno.execPath(), "--quiet", "run", "--no-check", "-"], + cwd: moduleDir, + stdout: "piped", + stdin: "piped", + }); + + await process.stdin.write( + new TextEncoder().encode(` + import { crypto as stdCrypto } from "./mod.ts"; + import { _wasm } from "../_wasm_crypto/crypto.js"; + + const { memory } = _wasm as { memory: WebAssembly.Memory }; + + const heapBytesInitial = memory.buffer.byteLength; + + let state = new ArrayBuffer(0); + + const toHexString = (bytes: ArrayBuffer): string => + new Uint8Array(bytes).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); + + for (let i = 0; i < 1_000_000; i++) { + state = stdCrypto.subtle.digestSync({ + name: "BLAKE3" + }, state); + } + + const heapBytesFinal = memory.buffer.byteLength; + + const stateFinal = toHexString(state); + + console.log(JSON.stringify( + { + heapBytesInitial, + heapBytesFinal, + stateFinal, + }, + null, + 2, + )); + `), + ); + process.stdin.close(); + + const stdout = new TextDecoder().decode(await process.output()); + const status = await process.status(); + process.close(); + + assertEquals(status.success, true, "test subprocess failed"); + const { + heapBytesInitial, + heapBytesFinal, + stateFinal, + }: { + heapBytesInitial: number; + heapBytesFinal: number; + stateFinal: string; + } = JSON.parse(stdout); + + assert( + heapBytesInitial < 2_000_000, + `WASM heap was too large initially: ${ + (heapBytesInitial / 1_000_000).toFixed(1) + } MB`, + ); + assert( + heapBytesFinal < 2_000_000, + `WASM heap was too large after many digests: ${ + (heapBytesFinal / 1_000_000).toFixed(1) + } MB`, + ); + assertEquals( + stateFinal, + "bad332864a0cd62866c18ac5623585b4b8e4fa029661e909c82ada8c06bc34d6", + `test subprocess returned wrong hash (${stateFinal})`, + ); +}); + +// Simple periodic data, but the periods shouldn't line up with any block +// or chunk sizes. +const aboutAMeg = bytes.repeat( + new Uint8Array(1237).fill(0).map((_, i) => i % 251), + 839, +); + +// The test input pattern used in BLAKE3's official test vectors. +const blake3TestInput = new Uint8Array(1_000_000).fill(0).map((_, i) => + i % 251 +); + +// These should all be equivalent views +const slicedView = new Int16Array(aboutAMeg.buffer, 226, 494443); +const dataView = new DataView(aboutAMeg.buffer, 226, 16 / 8 * 494443); +const slicedCopy = new Uint8Array( + aboutAMeg.subarray(226, 226 + 16 / 8 * 494443), +); +const bufferCopy = slicedCopy.buffer; + +// Test result when an error is expected for all algorithms. +const allErrors = { + BLAKE2B: Error, + "BLAKE2B-384": Error, + "BLAKE2B-256": Error, + BLAKE2S: Error, + BLAKE3: Error, + "KECCAK-224": Error, + "KECCAK-256": Error, + "KECCAK-384": Error, + "KECCAK-512": Error, + MD5: Error, + "RIPEMD-160": Error, + "SHA-1": Error, + "SHA-224": Error, + "SHA-256": Error, + "SHA3-224": Error, + "SHA3-256": Error, + "SHA3-384": Error, + "SHA3-512": Error, + "SHA-384": Error, + "SHA-512": Error, + SHAKE128: Error, + SHAKE256: Error, +} as const; + +// Test inputs and expected results for each algorithm. +const digestCases: [ + // Caption for test error messages. + string, + // The input messages pieces, all expected to produce the same hash + // (presumably the same value but in different representations). + (BufferSource | string)[][], + // The digest options being used (typically none, {}). + { length?: number }, + // The expected digest output for each hash algorithm, or an Error type if the + // algorithm isn't expected to this input. + Record, +][] = [ + ["Empty", [[], [""], [new ArrayBuffer(0), new BigInt64Array(0)]], {}, { + BLAKE2B: + "786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce", + "BLAKE2B-256": + "0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8", + "BLAKE2B-384": + "b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100", + BLAKE2S: "69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9", + BLAKE3: "af1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262", + "KECCAK-224": "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", + "KECCAK-256": + "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "KECCAK-384": + "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", + "KECCAK-512": + "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", + MD5: "d41d8cd98f00b204e9800998ecf8427e", + "RIPEMD-160": "9c1185a5c5e9fc54612808977ee8f548b2258d31", + "SHA-1": "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "SHA-224": "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", + "SHA-256": + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "SHA3-224": "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7", + "SHA3-256": + "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a", + "SHA3-384": + "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004", + "SHA3-512": + "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26", + "SHA-384": + "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", + "SHA-512": + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + SHAKE128: + "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26", + SHAKE256: + "46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be", + }], + + [ + "One zeroed byte", + [["\x00"], ["", "\x00", "", ""], [new ArrayBuffer(1)], [ + new Uint8ClampedArray(1), + ]], + {}, + { + BLAKE2B: + "2fa3f686df876995167e7c2e5d74c4c7b6e48f8068fe0e44208344d480f7904c36963e44115fe3eb2a3ac8694c28bcb4f5a0f3276f2e79487d8219057a506e4b", + "BLAKE2B-256": + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", + "BLAKE2B-384": + "cc01088536f784f0bb769e41c4957b6d0cde1fcc8cf1d91fc477d4dd6e3fbfcd43d1698d146f348b2c36a339682bec3f", + BLAKE2S: + "e34d74dbaf4ff4c6abd871cc220451d2ea2648846c7757fbaac82fe51ad64bea", + BLAKE3: + "2d3adedff11b61f14c886e35afa036736dcd87a74d27b5c1510225d0f592e213", + "KECCAK-224": "b7e52d015afb9bb56c19955720964f1a68b1aba96a7a9454472927be", + "KECCAK-256": + "bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + "KECCAK-384": + "9265ed0d889a1327114cffa6fa682dce051855e24f9393a3faa7e4791124c9db1abef28f95f677134edefc63b02066d9", + "KECCAK-512": + "40f0a44b4452c44baf401b49411f861caac716ba87be7d6894757f1114fcec44a4d4a9f44bcab569fabc676e761fe9d097dd191d5d9c71d66250b3e867071553", + MD5: "93b885adfe0da089cdf634904fd59f71", + "RIPEMD-160": "c81b94933420221a7ac004a90242d8b1d3e5070d", + "SHA-1": "5ba93c9db0cff93f52b521d7420e43f6eda2784f", + "SHA-224": "fff9292b4201617bdc4d3053fce02734166a683d7d858a7f5f59b073", + "SHA-256": + "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d", + "SHA3-224": "bdd5167212d2dc69665f5a8875ab87f23d5ce7849132f56371a19096", + "SHA3-256": + "5d53469f20fef4f8eab52b88044ede69c77a6a68a60728609fc4a65ff531e7d0", + "SHA3-384": + "127677f8b66725bbcb7c3eae9698351ca41e0eb6d66c784bd28dcdb3b5fb12d0c8e840342db03ad1ae180b92e3504933", + "SHA3-512": + "7127aab211f82a18d06cf7578ff49d5089017944139aa60d8bee057811a15fb55a53887600a3eceba004de51105139f32506fe5b53e1913bfa6b32e716fe97da", + "SHA-384": + "bec021b4f368e3069134e012c2b4307083d3a9bdd206e24e5f0d86e13d6636655933ec2b413465966817a9c208a11717", + "SHA-512": + "b8244d028981d693af7b456af8efa4cad63d282e19ff14942c246e50d9351d22704a802a71c3580b6370de4ceb293c324a8423342557d4e5c38438f0e36910ee", + SHAKE128: + "0b784469a0628e03861cd8a196dfafa0e9e8056d04cddcc49f0746b9ad43ccb2", + SHAKE256: + "b8d01df855f7075882c636f6ddeacf41e5de0bbf30042ef0a86e36f4b8600d546c516501a6a3c821678d3d9943fa9e74b9b99fccd47aecc91dd1f4946b8355b3", + }, + ], + + ["Output length: 20", [["", "hello world", ""], ["hello ", "world"]], { + length: 20, + }, { + BLAKE2B: Error, + "BLAKE2B-384": Error, + "BLAKE2B-256": Error, + BLAKE2S: Error, + BLAKE3: "d74981efa70a0c880b8d8c1985d075dbcbf679b9", + "KECCAK-224": Error, + "KECCAK-256": Error, + "KECCAK-384": Error, + "KECCAK-512": Error, + MD5: Error, + "RIPEMD-160": "98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f", + "SHA-1": "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed", + "SHA-224": Error, + "SHA-256": Error, + "SHA3-224": Error, + "SHA3-256": Error, + "SHA3-384": Error, + "SHA3-512": Error, + "SHA-384": Error, + "SHA-512": Error, + SHAKE128: "3a9159f071e4dd1c8c4f968607c30942e120d815", + SHAKE256: "369771bb2cb9d2b04c1d54cca487e372d9f187f7", + }], + + ["Output length: 3", [["hello world"], ["hell", "o w", "orld"]], { + length: 3, + }, { + BLAKE2B: Error, + "BLAKE2B-384": Error, + "BLAKE2B-256": Error, + BLAKE2S: Error, + BLAKE3: "d74981", + "KECCAK-224": Error, + "KECCAK-256": Error, + "KECCAK-384": Error, + "KECCAK-512": Error, + MD5: Error, + "RIPEMD-160": Error, + "SHA-1": Error, + "SHA-224": Error, + "SHA-256": Error, + "SHA3-224": Error, + "SHA3-256": Error, + "SHA3-384": Error, + "SHA3-512": Error, + "SHA-384": Error, + "SHA-512": Error, + SHAKE128: "3a9159", + SHAKE256: "369771", + }], + + ["Output length: 123", [["hello world"], ["hell", "o w", "orld"]], { + length: 123, + }, { + BLAKE2B: Error, + "BLAKE2B-384": Error, + "BLAKE2B-256": Error, + BLAKE2S: Error, + BLAKE3: + "d74981efa70a0c880b8d8c1985d075dbcbf679b99a5f9914e5aaf96b831a9e24a020ed55aed9a6ab2eaf3fd70d2c98c949e142d8f42a10250190b699e02cf9eb68612e1a556fee6cf726bcb0994f7d3e669eda394788f8c80a4f0ea056be3d4dffd8069d7ef9a714a47a4cdef62c5402a25d7994384b07bfcf8479", + "KECCAK-224": Error, + "KECCAK-256": Error, + "KECCAK-384": Error, + "KECCAK-512": Error, + MD5: Error, + "RIPEMD-160": Error, + "SHA-1": Error, + "SHA-224": Error, + "SHA-256": Error, + "SHA3-224": Error, + "SHA3-256": Error, + "SHA3-384": Error, + "SHA3-512": Error, + "SHA-384": Error, + "SHA-512": Error, + SHAKE128: + "3a9159f071e4dd1c8c4f968607c30942e120d8156b8b1e72e0d376e8871cb8b899072665674f26cc494a4bcf027c58267e8ee2da60e942759de86d2670bba1aa47bffd20b48b1d2aa7c3349f8215d1b99ca65bdb1770a220f67456f602436032afce7f24e534e7bfcdab9b35affa0ff891074302c19970d7359a8c", + SHAKE256: + "369771bb2cb9d2b04c1d54cca487e372d9f187f73f7ba3f65b95c8ee7798c527f4f3c2d55c2d46a29f2e945d469c3df27853a8735271f5cc2d9e889544357116bb60a24af659151563156eebbf68810dd95c6fcccac0650132ba30bef9bf75b0d483becb935be8688b26ffb294d8284edd64a97325d6be0a423f23", + }], + + ["Output length: 0", [[""]], { + length: 0, + }, { + BLAKE2B: Error, + "BLAKE2B-384": Error, + "BLAKE2B-256": Error, + BLAKE2S: Error, + BLAKE3: "", + "KECCAK-224": Error, + "KECCAK-256": Error, + "KECCAK-384": Error, + "KECCAK-512": Error, + MD5: Error, + "RIPEMD-160": Error, + "SHA-1": Error, + "SHA-224": Error, + "SHA-256": Error, + "SHA3-224": Error, + "SHA3-256": Error, + "SHA3-384": Error, + "SHA3-512": Error, + "SHA-384": Error, + "SHA-512": Error, + SHAKE128: "", + SHAKE256: "", + }], + + ["Negative length", [[""]], { length: -1 }, allErrors], + + ["Non-integer length", [[""]], { length: 1.5 }, allErrors], + + [ + "Invalid data type", + [[{} as BufferSource], [[] as unknown as BufferSource]], + {}, + allErrors, + ], + + ["Too-large length", [[""]], { + length: Number.MAX_SAFE_INTEGER * Number.MAX_SAFE_INTEGER, + }, allErrors], + + ["About a meg", [[aboutAMeg]], {}, { + BLAKE2B: + "81f197a4ced23ba7bfc9e5e84f417475371b22edb36089978734d1327c39ff75eeda6598ab1c63f0829aa437b68a526f04e622f714d9d7093150e6b2f9603b5c", + "BLAKE2B-256": + "84b033ca29abf242e3761b1657e14768cbfb4e7fc28b3d9f0f34905e5f2aa92b", + "BLAKE2B-384": + "0300b1c3d7deeca947263590d4777b0df0e7869ded64d63afafcfb3da4df5e542bfe309667436f534cd3b9cb9ee5f938", + BLAKE2S: "c1b9bffb9bb1fa42f26ce72ad457bef071a7713532c37b772a3a7e8b353551fc", + BLAKE3: "7fc79f34e187d62c474af7d57531a77f193ab6f2fae71c6de155b341cb592fe5", + "KECCAK-224": "8186d48ddde40e518b203db01cc105f0d4a1f46341322730f9c61b51", + "KECCAK-256": + "c1b36a3fdc9d8c4f337a8f9cf627e703718fd2d2559b366ec310d75cd03ddc94", + "KECCAK-384": + "6acf1af74a00ee20aa0b03647858ed749f7cef64fcf990da3b49e48232002b2ede1e50295755ca9a06f43157cfb36dd6", + "KECCAK-512": + "726580def2ce92c4345c0dfe768417b022a5fc9a9fec4f960b314bf078bdc93f05057d83a8334454977960e27afaf0d3b7500e5ee862ed91fff3817a93820f63", + MD5: "65ee3c415a2316553ebf2fdb2ccafd0b", + "RIPEMD-160": "a7188285d5c8560c44deadbdbb095e8fe6ac8dec", + "SHA-1": "74de0faec24034e7415e7a6ee379e509b29985b2", + "SHA-224": "cfb9e6dd8dc52cb0e843067467e58a03224fbe84004b955078c98a20", + "SHA-256": + "ce0ae911a08c37d8e25605bc209c13e870ab3c4a40a7610ea3af989d9b0a00dd", + "SHA3-224": "c7b818905ca367b591d17b31cac9b3c3f9158f65968725a6c65c4d82", + "SHA3-256": + "ff7934eb30afb91390adbd02ef2bf808eeac30bb4a7779f346a71962610874bd", + "SHA3-384": + "7f97aca31fa48466fdcf029396305c09ee98c0a547ff095a24af7ada72beb8448fe5d12b8c2d7e0a48822e1fe8db0387", + "SHA3-512": + "61bbdae5203bbf8a9effd083da83ebf18951668e658a810987ea2feb1fb810be5800fb03489a99e9f25979aa6c345477036afabcda612066b3c1213a72c05534", + "SHA-384": + "6f6b2d594fc88bcdfb574524e580b79c7dd74980392ad526c357860a761c8075f27c4960a38c4668c56d64520a5bebff", + "SHA-512": + "b3d3a7531e6bea36639bd9cf5a5c462f32d4f74a4b9878aad7405149d7962ad02e4cc1922133c43e9a2685f2927345a72c697144cbd69a895778126c1c59d455", + SHAKE128: + "1e99e4ac28efec6bc3af203f6a161b976389a2d036d0e42026141860d1e3a08a", + SHAKE256: + "e39016c524adfa6efd8019d6bc6584bbb912bed38ab896a546a2ef648e120838085103118d3409caab6ed847a67b27085bdce9ffaa6408410431a706625f07bf", + }], + + [ + "Different views of the same bytes", + [[slicedView], [slicedCopy], [bufferCopy], [dataView]], + {}, + { + BLAKE2B: + "dd3ce8111538e7de0842ce11835e38788b6c9436deb122dcfdf69a2fc51d0414e6e088e9ced8e275280eb945f135e5e9eb8000d0434427e67efeea8fc1f39cc5", + "BLAKE2B-256": + "ee079520d28e52bcf61dbc1919e90d9a6c3cb66290f5f41c5521dae9c365c4fe", + "BLAKE2B-384": + "fbedc985d108d0690e9121e8a11c23faf5fc22a164cf30b5448e8499a86e1acd750e00f096a1f44be484a74bc1a5d076", + BLAKE2S: + "ecf3769441e140f8c8e0a2176cb4ef57fa09befc90a845ce5be8c99ada200bd2", + BLAKE3: + "8549694280dea254adb1b856779d2d4f09256004e7536bbf544a1859e66b5f9c", + "KECCAK-224": "93ef86f74392e3a635c65df746b0f990bcb13b053301e52f51fab144", + "KECCAK-256": + "029a0c3cca4954e17606ac31dd3ac30492e36ecfcac3dc73e269a336782f2f1d", + "KECCAK-384": + "013efe9f790d52b7cd28d8763cc2c6f12583660298d02f5c151096496980d990be734074fd133a689533cc8046fc212f", + "KECCAK-512": + "c9cb0ac5c3be4861fc65ecd5a385b6fd10a4dd5ab7a57ffa13de7fd5df4fd12c7e39e0e96a065dae9958dcff76a86a8c3d1a156c54ce5e1096161be4601606a1", + MD5: "81f7e24f254ca2af692188d17b5103d8", + "RIPEMD-160": "e4d0ecd208850e00726c0c481b888f8de06fbfce", + "SHA-1": "b0161602fcdd324d2d0222b5c8d2873ff1f6452e", + "SHA-224": "926ed59d539deff483058be7c73bf38a5af127a6c9e7d4da36cb3c6e", + "SHA-256": + "38fa97da941ae64bc1ec0d28fa14023e8041fd31857053d387d97e0ea1498203", + "SHA3-224": "61450c57c4007d6ff219566740cf3dd3acc731bba4ec7a63bf91597b", + "SHA3-256": + "ec3e5fb22a6a7e2f404cb10fca361a3edc3a6f7eaaeb83a4142adf3f89e5b1d5", + "SHA3-384": + "b846b92db6cb89cbd848c0eac14a13ae33481fbcd33410ac5d870819edf8a89b6d661b2bdb9aac71661fc541d708348e", + "SHA3-512": + "8b43aec6757a768580ed9bb74e373040a25692054d5097cf0ab8f9b565c266ab6964aa02b1d54388b10bc80461f83dbc8cf9e59c8321124315b8058b1a057b2a", + "SHA-384": + "8eda90d308b4ef5265209e5c8477755ab09b371cd748c411a721dcd0255030b7947a7fe5c79a39fd48e135be670b7855", + "SHA-512": + "b7e29c5e61c67f5332740e01a1932be71aee0baf8e6d3156027585948cd58abbcf302de41978b0de26a0fb768708351963c6c01c1198e0dae7deaee448632445", + SHAKE128: + "ab4c60827e1521de623d8b41227d6b4a7406875f44db2356091c10f9d78e55d7", + SHAKE256: + "ad4ffc105a791884afd92917a64af4d9d25b1c9d41a8e06683ad03a62ee5c7166a98fdcb4b60ee55722582c0eb9f103be3b55166efa4c20fdfcc5a4e026330dd", + }, + ], + + [ + "Different combinations of different views of the same bytes", + [[slicedView, bufferCopy], [slicedCopy, "", slicedView], [ + slicedCopy, + "", + slicedView, + ], [ + "", + bufferCopy, + dataView, + ], [dataView, new Uint8Array(), slicedCopy, ""]], + {}, + { + BLAKE2B: + "0ad2f5cb56954ada6e852adcd8b3a9147e92cb68859b13ddb511a6abee263c51e32db3a4a8a78152fa0638f726c9ac96fa1fda41898bc6d7a4017d7abdbf8480", + "BLAKE2B-256": + "be41aad5e22791bfa0b6fc37cd35ecf32b5c6170f85aabcac839fb5e0315def9", + "BLAKE2B-384": + "a6b745fab507fe0251102c67e7616416f94d3508160bde3cc033917469b804464a0394edaaa6d93dd28ba196df8dd970", + BLAKE2S: + "627f9025def22ddbf8ccfba535900aa8dd79ce532778aeae138fa797dd479008", + BLAKE3: + "5af7084d217935de95ffd87daadc037ba08bdda86e14e02716cb2eb4054e2297", + "KECCAK-224": "5b620623f63faf310190cd69fada226f4ba51b5766c2eef4d69ec7f8", + "KECCAK-256": + "fbfcc67319c5a077a3304ff6a8bb791f1e8aa7005d0fb71511dedf706f3018db", + "KECCAK-384": + "72a509f9279f48192871c212a12316ef231a0ccdc063e543750d4fc635f07b4c7dc34dc0ad269b3e57013ac3eb9f092c", + "KECCAK-512": + "63cac04fe488807d59860ab58a802bd177d7a9ac0848578f952121a802542d7f2caf67138a06004a7f33eb4a3ba4fcab6fa650ee3986fa699030255c87aec6e6", + MD5: "67162fd7a3a58a71b8dd3ee48d7a81de", + "RIPEMD-160": "d4bdea1747dfc0cda2171c7b5a55b732feabb1cf", + "SHA-1": "77fd495a283c66d4f9c28351c510fbff1458adf5", + "SHA-224": "955a032fdcfb471142b979c30b93ed87c5ece98e7007510637f3f17a", + "SHA-256": + "e077f0aedd7a63888226967b9709f20485f9425fc682f08b2ba4e14a1e6035af", + "SHA3-224": "9a98128a7f797cb533cdbfa3e99d3d74fdadf54acb0805d7aaca1d35", + "SHA3-256": + "949f0ce70e07fea1a7cf5c7a20253badc88e8d20403d1e2b6f3898efcb6b2268", + "SHA3-384": + "17b6f90433dd728dad9eed2c72ce128b359d52873d94b4764ddd9a58fcc47061448e0053f46d5add92230e6f41d54f9a", + "SHA3-512": + "891d21e1a4c7de0b44e69a0ea4b821cf32ac0885b10540f6633c33ef409bb8993b1eb277addeb21595deb4f392b8eef306dfb832a100403e6cb16c070cde7df8", + "SHA-384": + "0f3493e6027e30381d25d2902b00de9a6ad72deb000e8485d4a750356ec6aea755d6fd25330df843516ce2d3fcdd59ea", + "SHA-512": + "28f8c2773ba1dc4774b6d97ca2c50d7cec871fb2b0cdbb0871a3c40d426a367c92b8635e29e8d09841e9a3e39b00855f200001040e5a8eb8be64f588855ac4aa", + SHAKE128: + "8b8d4e2daec80c06cdf68170c54ade9745945bbd5f998763ac9f90586f203a3f", + SHAKE256: + "5eb886f6cfe4460a3bac6e19bae068ea67e2d13507f880b770fe32c57914e9f10b6ffee3154e4bef277499055eb6c59138ecfa74f47c47b63edc451d57606b28", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 0", + [[blake3TestInput.slice(0, 0)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "af1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262e00f03e7b69af26b7faaf09fcd333050338ddfe085b8cc869ca98b206c08243a26f5487789e8f660afe6c99ef9e0c52b92e7393024a80459cf91f476f9ffdbda7001c22e159b402631f277ca96f2defdf1078282314e763699a31c5363165421cce14d", + SHAKE128: + "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef263cb1eea988004b93103cfb0aeefd2a686e01fa4a58e8a3639ca8a1e3f9ae57e235b8cc873c23dc62b8d260169afa2f75ab916a58d974918835d25e6a435085b2badfd6dfaac359a5efbb7bcc4b59d538df9a04302e10c8bc1cbf1a0b3a5120ea17cda7", + SHAKE256: + "46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be141e96616fb13957692cc7edd0b45ae3dc07223c8e92937bef84bc0eab862853349ec75546f58fb7c2775c38462c5010d846c185c15111e595522a6bcd16cf86f3d122", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 1", + [[blake3TestInput.slice(0, 1)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "2d3adedff11b61f14c886e35afa036736dcd87a74d27b5c1510225d0f592e213c3a6cb8bf623e20cdb535f8d1a5ffb86342d9c0b64aca3bce1d31f60adfa137b358ad4d79f97b47c3d5e79f179df87a3b9776ef8325f8329886ba42f07fb138bb502f4081cbcec3195c5871e6c23e2cc97d3c69a613eba131e5f1351f3f1da786545e5", + SHAKE128: + "0b784469a0628e03861cd8a196dfafa0e9e8056d04cddcc49f0746b9ad43ccb291e0c86535ff6254400d4df18bc0b840d8d505d37fd1b211c20af49fd8c8ee604299a5ece841b097b58b6bf541f9e38062ed091aa6258edf998c34b125199668da92d870fbfb05a939fc731802fb0d3a2e2bf3b328154aa087f10c93b81f9832111da0", + SHAKE256: + "b8d01df855f7075882c636f6ddeacf41e5de0bbf30042ef0a86e36f4b8600d546c516501a6a3c821678d3d9943fa9e74b9b99fccd47aecc91dd1f4946b8355b30a500d7bd8081e67ad4599a5c8e23706803f955aeff1686e54cdf48840e32dd2342c1a26fb27aaec2b4fe5b9111f6497143cc59be6ff2abeff59230ca332b31365af12", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 2", + [[blake3TestInput.slice(0, 2)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "7b7015bb92cf0b318037702a6cdd81dee41224f734684c2c122cd6359cb1ee63d8386b22e2ddc05836b7c1bb693d92af006deb5ffbc4c70fb44d0195d0c6f252faac61659ef86523aa16517f87cb5f1340e723756ab65efb2f91964e14391de2a432263a6faf1d146937b35a33621c12d00be8223a7f1919cec0acd12097ff3ab00ab1", + SHAKE128: + "e62801291d99605599422504e24283f0633b6d9a84d60b37dc9fa04a8c59205f503a48dbf87e797fb3dc1679cbf45ddb15856d01459c4d5c42bff32ac79071735681130cb378e08abdfb71a14abc99225982d1e4ae1df06706664fd2e5e3df57f4021d7dd5a8cbcc04a39f85989299a818e830e9d53eadefca175f98976de73380933c", + SHAKE256: + "bc6fac1888e51c55a2019b36984c6efbbf492628c53d1397a1b8962ba80e8f223f13b5dfd1d7156229dce3cc53ff9fa38423b6ab2591b73303d4ea9389e7cf3c0e3f5a10fa966e24ec3bdba22431b226b198159f4bf230cebaeb957af28018762db55950355e5872c3606ab24e2d1a66f970b55fb2757bca64d9b4dcf35eb4fe4a0b81", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 3", + [[blake3TestInput.slice(0, 3)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "e1be4d7a8ab5560aa4199eea339849ba8e293d55ca0a81006726d184519e647f5b49b82f805a538c68915c1ae8035c900fd1d4b13902920fd05e1450822f36de9454b7e9996de4900c8e723512883f93f4345f8a58bfe64ee38d3ad71ab027765d25cdd0e448328a8e7a683b9a6af8b0af94fa09010d9186890b096a08471e4230a134", + SHAKE128: + "203d4b7543731ad58bce7697b39a48eafc4fee548891d1cf94bffd231022a89627b84d6ea94edcf86cfbc98cca95987cee442bd10b3049820345202b697a9de0a4f7e60d895a782fd168c06f99664b066d0ebd206a2a0bf402ddfad23eb5140690131567f47660faf5163a2decfc20a59658214d0336cd232222f0474d5860a840de43", + SHAKE256: + "714501167ead924ea87e422993eea1e67df0ead7b93140c1109470fb66d50aaaff04ddafd104b481b98b1f4a81be29fa10e54a51b2cf5f804c158a95202ced095112b66e383aaf06b0afbcf715260060eb5cc7272863a4525a974eabe52faaa127ba418cfae66dfa2b4d723e513978f8dd7a8c823b28e28d11c39259caf837461f08b7", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 4", + [[blake3TestInput.slice(0, 4)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "f30f5ab28fe047904037f77b6da4fea1e27241c5d132638d8bedce9d40494f328f603ba4564453e06cdcee6cbe728a4519bbe6f0d41e8a14b5b225174a566dbfa61b56afb1e452dc08c804f8c3143c9e2cc4a31bb738bf8c1917b55830c6e65797211701dc0b98daa1faeaa6ee9e56ab606ce03a1a881e8f14e87a4acf4646272cfd12", + SHAKE128: + "0b0cc28e60e37698b411234b1158a5d42636440432a28e8b8df5be04208878f9906685c2f1e1ca901bc5c419d9ac786a658c74d5f1a73536f7638853d53325e30652ebba829dd82cb355863b23ba35e72cbc7f0a88b789af3d1668a426a144bf90cc4136422a0f4980cc826ebd9148104ce7fc363ec7e6ed7595d17639f7bda3aae78c", + SHAKE256: + "48b8d57a5f8c29d0326049216380aa85d2d7a58b784f5a49e980ca93409e3d4bac25509371f937ef3224820eda0af0915c10d07e2df78bafe7208d23f36388a942130c01d78ab09d553a8acb47e820d27279616ed506367a8f84d999a596e445df3b097251b3a70557460d26a3f8a017ec11b34532f147c09c70edd7e9bb51e77b288a", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 5", + [[blake3TestInput.slice(0, 4), blake3TestInput.slice(4, 5)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "b40b44dfd97e7a84a996a91af8b85188c66c126940ba7aad2e7ae6b385402aa2ebcfdac6c5d32c31209e1f81a454751280db64942ce395104e1e4eaca62607de1c2ca748251754ea5bbe8c20150e7f47efd57012c63b3c6a6632dc1c7cd15f3e1c999904037d60fac2eb9397f2adbe458d7f264e64f1e73aa927b30988e2aed2f03620", + SHAKE128: + "e0da1cff89d768c948759b3040da9423a6f2bbf6265474dbe0591c34edb85b83be54ad871a55c0ca590aa4637f968b08b95f1f210f71f27bb45bfd37928af5741e9385627f047ea7e62c2d91a86c65a583b0726047e92f5c515c1842b7164ad2afb1cd0ac4531838474dce45738e6d24651e4c9c02ce2b6b803f1d599bf3636c9f71ea", + SHAKE256: + "f3d21988c170243fa71ad748e1198aed2de43a81bdf3a2d033a800520c25a1501dde8abd6a6e64e659a305a7327b2d955a451d7693c1dd0c61ac15cd645b0bfd3bac87624ac6e87d5e9539ab10ce84ab6df4e8bed5d5174b7737b3d891e99a426cced615a141e2fcfb371b545c347e60372a48f4a55cb7d955e0ecc2593a4983e8c45e", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 6", + [[blake3TestInput.slice(0, 6)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "06c4e8ffb6872fad96f9aaca5eee1553eb62aed0ad7198cef42e87f6a616c844611a30c4e4f37fe2fe23c0883cde5cf7059d88b657c7ed2087e3d210925ede716435d6d5d82597a1e52b9553919e804f5656278bd739880692c94bff2824d8e0b48cac1d24682699e4883389dc4f2faa2eb3b4db6e39debd5061ff3609916f3e07529a", + SHAKE128: + "66949b7a0951e403bee03087bbbf6a2643a9ba982403f7e203163315b04d0635619c30769eb8301f80f888c0bdb2bae3fab4355daffc12f9fd2331cc53fd5d51e1017a8951f77c71299e235df5a06e2119d4302c7618dd349578b15cf936c7270bcf30cb79388e8b8e7bb7785cff3341f26d6bd6670b79f18dfda9cbaa479708a3d8de", + SHAKE256: + "3a1b0d60aadb0d3d435ef65aac428a6cb122768eb8bc1ab505cbb37239e2087f4ede665f54888b9ab31cd89e81996e0d8ae8b21fe9f7263e2132cf6363223f6da1d7b8c37f9ab28e42ceda7b66926a9c8f6b39bd905ede936ef2d009767541d6db9ebdfcfc844d1c15cbc15b6631d280e2e301afd5158fd88878be7352312f86b44186", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 7", + [[blake3TestInput.slice(0, 7)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "3f8770f387faad08faa9d8414e9f449ac68e6ff0417f673f602a646a891419fe66036ef6e6d1a8f54baa9fed1fc11c77cfb9cff65bae915045027046ebe0c01bf5a941f3bb0f73791d3fc0b84370f9f30af0cd5b0fc334dd61f70feb60dad785f070fef1f343ed933b49a5ca0d16a503f599a365a4296739248b28d1a20b0e2cc8975c", + SHAKE128: + "4652c0aed60f33ef1b6dd719770cffc99756d6865d74e8f27da5118b29236561aebf39475006e99e57aa03d89bf329b579df3c6ebd891a4b76ca44e167deec78fd5aeccfd42dcbd2e783f5e5e0e8bfb985993240a3d09a85ceb2338364f49153791a688735547ce3de99503e93e3aefadf553afaad767ba0feaf1c52fd3d351e31b4b3", + SHAKE256: + "552294355aff5c43a2c7009607e47c0ca3720536eeccb2f7560d1574ce1a197951a4164ac477db352c95bbd3c7d1d5beb1bd9778bb7f4ca58ffa6f0f2abd976682470fbdadbd3d3f05e0f8058305987999b6df6316914fb75f5048b7e43bcd704fcdd96434935783c10c5b6130240ebe9e23fd6b9ec186bdecc1e4ba7d655efe79280c", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 8", + [[blake3TestInput.slice(0, 8)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "2351207d04fc16ade43ccab08600939c7c1fa70a5c0aaca76063d04c3228eaeb725d6d46ceed8f785ab9f2f9b06acfe398c6699c6129da084cb531177445a682894f9685eaf836999221d17c9a64a3a057000524cd2823986db378b074290a1a9b93a22e135ed2c14c7e20c6d045cd00b903400374126676ea78874d79f2dd7883cf5c", + SHAKE128: + "2ea7a0601b9c5cb41e469f854077c1e33aac94d39ce46163429abcacfa992bbc424ab689bb0123e0dc3e0d84376a56616ca0d2f7832f6a7facddfbc0d9d6175ae7ac86172d43f576e6af5baa80db29fc079cb737aae6cf82ea69ac6d005e072d41ff84ca47772dff4a08c2e29a5d69a564728bf5669ed8146a9fdc4edb5e58c962140d", + SHAKE256: + "b44dae93f2360c4914fa999f3aed53901d47a1b614109e4bfbe8a595d5dd5058142c63b0b548e296c37f8972677b7faf0c22bf85bf9c891c1b91f69184d8b6de9a32b15e289912ca731a125c15fa69403cb31158f7d6159ae3e20778b59a6f43ee3e27347d5ec238b7c3a29812406487962c239a40bcf9c41eb285caa4cd270ef7ccab", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 63", + [[blake3TestInput.slice(0, 63)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "e9bc37a594daad83be9470df7f7b3798297c3d834ce80ba85d6e207627b7db7b1197012b1e7d9af4d7cb7bdd1f3bb49a90a9b5dec3ea2bbc6eaebce77f4e470cbf4687093b5352f04e4a4570fba233164e6acc36900e35d185886a827f7ea9bdc1e5c3ce88b095a200e62c10c043b3e9bc6cb9b6ac4dfa51794b02ace9f98779040755", + SHAKE128: + "e8c2c5be7ef8b003ea881c06f34334691c24267bd31ca0360faa7375b2362dd901508f7fed801b7c1c94552f17e5cdf768a76ea5975878f1e11d24c4801917b9439086f3ae151830043a276c981f46cd91d58f3a210fba60c9ef37181398018ac33a78657301cd3300c8674d134863010b3baa6a446d24999869f3b9082acdbb8e29e6", + SHAKE256: + "fbbd7bcc6463c166cc83e3f286efb9223fd8b98bafeb56d44eb8fb328e1fca7bc05c2dca9294f1722052511d75db5731f7e5775138d2c886208ca43985ae894c4d70251655317bfb5b3fac78fc7d10b0415656dad7bb206253a83ece2adb1227e43f60f1775d1e88b8c4e8dc41845813b5fc0840155ffe6b98f88b962d5e5d50f69e3f", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 64", + [[blake3TestInput.slice(0, 64)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "4eed7141ea4a5cd4b788606bd23f46e212af9cacebacdc7d1f4c6dc7f2511b98fc9cc56cb831ffe33ea8e7e1d1df09b26efd2767670066aa82d023b1dfe8ab1b2b7fbb5b97592d46ffe3e05a6a9b592e2949c74160e4674301bc3f97e04903f8c6cf95b863174c33228924cdef7ae47559b10b294acd660666c4538833582b43f82d74", + SHAKE128: + "d96d7e90a6278534de6b95eaf3dbe0c478cf582577b36a50a3a8af6829b73404dfb15e74f34e11d218d59fe1afb3ce4f3d4df40d5bd55359fba65d0b4f93c510d79aace259bc8c133cba777a847745bb87387ba6d3020f885485284ba1d99124f5701dfa1adccc87aaf51e1ad0201f0128e40e893da777fd398f972b4f5e8a8f0f188b", + SHAKE256: + "755e8863a2b2bc067f51c1637a71c819d524dc37c17ba7a29c6ee3767c996a49e39d3f402bd2452d01f3977dea88467ac2aff4207f8a70ca32a3c345123a5875b67c4edd0f08d084310d0130165dbaa0d0744434dd23f24d3dad84a883133a0733907cad915743712fa15101ba80fcfb9ca603485d93f5e66384be22144a3543afdf02", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 65", + [[blake3TestInput.slice(0, 65)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "de1e5fa0be70df6d2be8fffd0e99ceaa8eb6e8c93a63f2d8d1c30ecb6b263dee0e16e0a4749d6811dd1d6d1265c29729b1b75a9ac346cf93f0e1d7296dfcfd4313b3a227faaaaf7757cc95b4e87a49be3b8a270a12020233509b1c3632b3485eef309d0abc4a4a696c9decc6e90454b53b000f456a3f10079072baaf7a981653221f2c", + SHAKE128: + "701ce6125b588c626a6d9c68411a4588bac7cc9ed2afba7bcc0b068bdc0dbc99d608d9fe814f2997fb4670f0959e91147ca866985e0404c4f63e408ac9aaf18d0f97323b9059afc4390a28d81a76947e564916aa4407c868a26767e027c7edd8f9687ee668197efc5670310f6ba712efa836a97540500e2414765c5d4768b14c689f80", + SHAKE256: + "0779f3e173425a7e640107f7af17be8f6d39f95a75f73a111af7b7a2de5719f32b8eb1bc9dbe4b7091098dd81da327b3ab45cfa41b89e33db08895362a78f5c41ad1ca838071b69bb5b7c76cd3eed31a7810137f6f00d218581eca303eedaf19c9adf34838e1e23060a4f255fe8cffdf94f99fb846b607f4fe46351ec740ab4deae36d", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 127", + [[blake3TestInput.slice(0, 127)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "d81293fda863f008c09e92fc382a81f5a0b4a1251cba1634016a0f86a6bd640de3137d477156d1fde56b0cf36f8ef18b44b2d79897bece12227539ac9ae0a5119da47644d934d26e74dc316145dcb8bb69ac3f2e05c242dd6ee06484fcb0e956dc44355b452c5e2bbb5e2b66e99f5dd443d0cbcaaafd4beebaed24ae2f8bb672bcef78", + SHAKE128: + "4d2d62b4c29b64d592631d7f764c482407ec1663a9c1378f9a40bbed8ba6134774bfe45f8f7ff8f24d91b5acf3b9d9e769f3e4d2f6e5f353b4eed16aa10f4ac9cf522d3b61bb7071865b1cee050b410dda5cb188d7352976b42ddbcd51550bfb14274b6ba3f451061b2c9088024f2cd4f0fd6b286546b49c6268f4ef85a1bf29d8af13", + SHAKE256: + "7456abc9254107b20377f545c308b2f9812b55bca1ecdb616f48bdb75d0794a788cc5d1857c3faf4bb665f829b23f6416d82982db8afb38730b004b19c5e67c6b2504c102bd61802a543b52fe80f34ebd847b9897fe453dc548e71078e28acbb5fad1c135c371f31aa5eb25b5e941f5d413c6eec925a663db511ebc4e6bfe492661241", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 128", + [[blake3TestInput.slice(0, 128)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "f17e570564b26578c33bb7f44643f539624b05df1a76c81f30acd548c44b45efa69faba091427f9c5c4caa873aa07828651f19c55bad85c47d1368b11c6fd99e47ecba5820a0325984d74fe3e4058494ca12e3f1d3293d0010a9722f7dee64f71246f75e9361f44cc8e214a100650db1313ff76a9f93ec6e84edb7add1cb4a95019b0c", + SHAKE128: + "cd5fd43033df4a618199e01eb9b999830edbc36e0865e10ef1ea7f8d513cdfbfffc22c8dca948544fca7c6c7bd4b31cea9dcb2daa677c9d093d7a9a393513c6078b80e7cba6d4df686535dfa30dbec7507fece4a5abd0fbe5d2e56f11e7c640f182f1010f5a9924b9ab2d7e378ff8a64143ba20cdc95780115ca3d993b71ebed326a88", + SHAKE256: + "8d3a3a49eb989dd9de155fcd66a2c85fb33b9d0576bec9790af31c0565ee15ec1de5870ad28d7f48dfcb11e39118b114565fe73ffdcdd8cb4b23263dcc6da15c1865975ed3474de962093a15da1a2a9ab7d60a10ac61590c2f4ee858b56597d7536c410d0b325618bc6c9fb9c200308767023a88d2d4b58419d08c228696db06c2535e", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 129", + [[blake3TestInput.slice(0, 129)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "683aaae9f3c5ba37eaaf072aed0f9e30bac0865137bae68b1fde4ca2aebdcb12f96ffa7b36dd78ba321be7e842d364a62a42e3746681c8bace18a4a8a79649285c7127bf8febf125be9de39586d251f0d41da20980b70d35e3dac0eee59e468a894fa7e6a07129aaad09855f6ad4801512a116ba2b7841e6cfc99ad77594a8f2d181a7", + SHAKE128: + "7e78f5b0b1b8c1919332254f504b47d8caf453dc6b5094944a41e732fde983d06592bb14783fcf285890bd8ff91d4f73f83899954558107f5de3dfce9666745bf7a6cb836f51fe31ac3b32b298b399b64ed84bde49693b947cde635fe97a671079f7b930b137cc91c8cad596697813652744912a4a0f13230b5f2eabf9975fe23eef0e", + SHAKE256: + "1454e9127a50e2765fabb757e10d46e28447c6bb0cbc943274409f5207c5eee5771d62103922b6035e966a19f16c63bd4723b03e11b8066f73159dbe3306904cb3197f47a7550192c37a029b77094edc24bf50dcc9b0b9d67fc222e93f43cb2155baa7d5274873b9cbad06b8ff2864921d3f7e2ac627e7d1a80023aa71417d44096841", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 1023", + [[blake3TestInput.slice(0, 1023)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "10108970eeda3eb932baac1428c7a2163b0e924c9a9e25b35bba72b28f70bd11a182d27a591b05592b15607500e1e8dd56bc6c7fc063715b7a1d737df5bad3339c56778957d870eb9717b57ea3d9fb68d1b55127bba6a906a4a24bbd5acb2d123a37b28f9e9a81bbaae360d58f85e5fc9d75f7c370a0cc09b6522d9c8d822f2f28f485", + SHAKE128: + "6eb1815b93cf607dac0b9cbae53371ae8719e70d90521d82db06c8d3856b0bda8c4db0ed59dbe9d64d1835c516ae2caaa63164e878b79bf720e25a31c33822a9b8a38e1b60b7f1f904cae678d4431a5440b7551fbce80a94d9d63c4d58347adb1686ecb8dde6155c5fe625d2400e82525105664780522e68c27f1d130cafb193644996", + SHAKE256: + "81bb178698a098b0c6b70e82d8ee48443a487fa9349647d00c27e6ba0202995a8cb96402d557e6247a30d19bc21217c9eb0c5d36fbf07133a9bd2fe5565fbe745ebdbaf95b82be5cfd5d8d02860f83efd3c4c99a975bec51d77e9510a5fd0ac97d4b9fbc76b60bfab1795a0fcba1cf088025b163c58ef56995f13e960185f7fbd358fe", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 1024", + [[blake3TestInput.slice(0, 1024)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "42214739f095a406f3fc83deb889744ac00df831c10daa55189b5d121c855af71cf8107265ecdaf8505b95d8fcec83a98a6a96ea5109d2c179c47a387ffbb404756f6eeae7883b446b70ebb144527c2075ab8ab204c0086bb22b7c93d465efc57f8d917f0b385c6df265e77003b85102967486ed57db5c5ca170ba441427ed9afa684e", + SHAKE128: + "b4347102639420d3f094d275cc1311e91cab7e047cf624679f20b81f5c9e2a9c2e1682d86896dfd8bb0dc9976e076c1e7900bb5dc224d9e7ed7148332cc6e5c2a8d40ef5b09818ffb279aff9eb005de385ca659a1d6e012cd364b4e606f42243cc873a86743466cdb41dba60308a5bc5d4d4c6175729cd560f028f671c04330fdd3a63", + SHAKE256: + "9d780b699069ff9c378acd8857081da4efe44787ead6b5c92d8213445d4b1ebaf8f18ee78ae5c80640470731ab70162961625d053467abafe60dcb7950fc84bd14278b396ac2ff951a44c54698a25935d4624071ed4c7e31ff6651bcceebe5f72581fe3e327af15010fc9fb8f1ad21084fd455ab376094d5b785c7f327e786ae750514", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 1025", + [[blake3TestInput.slice(0, 1025)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "d00278ae47eb27b34faecf67b4fe263f82d5412916c1ffd97c8cb7fb814b8444f4c4a22b4b399155358a994e52bf255de60035742ec71bd08ac275a1b51cc6bfe332b0ef84b409108cda080e6269ed4b3e2c3f7d722aa4cdc98d16deb554e5627be8f955c98e1d5f9565a9194cad0c4285f93700062d9595adb992ae68ff12800ab67a", + SHAKE128: + "cade7de1dfa08a5be2566cf519bb8f96747dc86e937f27554bdb75a336c858f298653e16aa29715902cb552610d7c053a9504a3db591b35ed96d6c6708343444275ae5809215f8658eb3ad0efaddadf98163243d702d90efc308719960ee2a7b2ffcfa91e6afdee1323e7418705ce60e710a5de1e24e0b57a1422c64bccb15ad871471", + SHAKE256: + "35c3d95330b0077c02f14876e922c64a447205bc68f447f62092f7369c4dd79a5f4285e6b67154ec95a9336de7eb0379490ed4d7da1c4a65f5e8cdcc7a6249123cfb59eab5e7d381238174f0aa6b49fdd60a54b32cd12bf43886f71db1584ebce48cae48bbc0454035c8b0ccea048ace6e5bd29c397ba135278b2805ed181eb1055035", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 2048", + [[blake3TestInput.slice(0, 2048)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "e776b6028c7cd22a4d0ba182a8bf62205d2ef576467e838ed6f2529b85fba24a9a60bf80001410ec9eea6698cd537939fad4749edd484cb541aced55cd9bf54764d063f23f6f1e32e12958ba5cfeb1bf618ad094266d4fc3c968c2088f677454c288c67ba0dba337b9d91c7e1ba586dc9a5bc2d5e90c14f53a8863ac75655461cea8f9", + SHAKE128: + "2fe0586a9d4b8ebd4f499a0f549e7863977425801e60c342903a2dde6f31c9bf8528d4bfca901d5924e75b0dc49a307254b164fc88ca13507bfa24be0fad0ab6774f8741fa9576bf7fe48c2a9edc928ef0c0e3c4f4b1b83ca016a84d76350b31d7e5121acee17b4934ec87337d5f3041c948635e43abe537b55f2516b57da38c5a8231", + SHAKE256: + "2f42cc0f215e1229c42f09dabadb1ea1ac13adbe337718233fb6b05c08537fa84aec1d83612c42ba58902ae8c146aae8e65c005a1dfa4887cfaf10d787021e873aad38b32bb8b340d19efc6b820f773c41001d3a87258e1d8289e9bc9e54ccb57766b1215414dea18abf25111c8787f6e6215a49d2f344947aa8f6c4b93f67810c8533", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 2049", + [[blake3TestInput.slice(0, 2049)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "5f4d72f40d7a5f82b15ca2b2e44b1de3c2ef86c426c95c1af0b687952256303096de31d71d74103403822a2e0bc1eb193e7aecc9643a76b7bbc0c9f9c52e8783aae98764ca468962b5c2ec92f0c74eb5448d519713e09413719431c802f948dd5d90425a4ecdadece9eb178d80f26efccae630734dff63340285adec2aed3b51073ad3", + SHAKE128: + "84638924c2173e4ea39660b84797e97efd9f62af9f3e6df81e7a6e04ac3f7c76d14c1b2bbe607353795d890dfca3b687eec7baf9c6f3b4233842b7b33d47280f839a161078e08e33983273d87396dd14b0da6d7da8cc06907db7c7c14f03b2a5f6c64dd41cd4aa67a40e87cbd2b80456510eeed94219d15ac420912f147bdb344e72ae", + SHAKE256: + "0e60a78d9db32c690c15e054af9d32ecc310963d8f9b78987cc31d92f5806a2a05374faf08baef5426f182a7cd8dcc091d3af42c276971476b2091c1732d2544188120aad693a1d1d8e3bc24118141f3e5e64d30e5b1bac926c79223f365a51d4bc44baf287fb9622b6deeb6215b4ef019b45902f038a0fd5211257132ba76b7a1445a", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 3072", + [[blake3TestInput.slice(0, 3072)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "b98cb0ff3623be03326b373de6b9095218513e64f1ee2edd2525c7ad1e5cffd29a3f6b0b978d6608335c09dc94ccf682f9951cdfc501bfe47b9c9189a6fc7b404d120258506341a6d802857322fbd20d3e5dae05b95c88793fa83db1cb08e7d8008d1599b6209d78336e24839724c191b2a52a80448306e0daa84a3fdb566661a37e11", + SHAKE128: + "48d3e2e8ba339ec9135b82007d937014e7f17b1d17d02c9e2999b97598ffa6e1b728837ba6b13d5b6c56c3710fe256333a34d1294b981b20211e40e40fe774999cf51d8953fde306c751b26ecf3a600a3ee6638edf68b49144839bc864b27f55c10cee264c12036afd878b3074aca099812c6d5289575e6e6f674434df633246bc55ad", + SHAKE256: + "d634c06667f221b34c30fd1c2d7a011bdc894e3a0807779cb38efe252f0cd65c0cebc4a1bbecf0e49e816524481e306a5950360ccd195793e2699e007bd48662500b210172fae7ff10010c41dd725072eea91f0bbf1df242abf830a7ffde2c1b9ddc0b946c6468d56fa8320a5c1f6405ec8f7ed11e17bf4317583f5c840943bcc8b038", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 3073", + [[blake3TestInput.slice(0, 3073)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "7124b49501012f81cc7f11ca069ec9226cecb8a2c850cfe644e327d22d3e1cd39a27ae3b79d68d89da9bf25bc27139ae65a324918a5f9b7828181e52cf373c84f35b639b7fccbb985b6f2fa56aea0c18f531203497b8bbd3a07ceb5926f1cab74d14bd66486d9a91eba99059a98bd1cd25876b2af5a76c3e9eed554ed72ea952b603bf", + SHAKE128: + "36b727b5067cdeccca25fcc1040b98eb0daaf96a7cd07ee0f9e42fb7c9ca4648f1a6362da3e8724cb5a7ed8bd7cde678a3948323b9b6e7677d96269a951a27de0d32baf5a05023c0531a93eae42d7a4dac8d561ce93e299a7a8cd0a7154f0c0cccea65da04a9ac9a44aea38f4c0745a87355dbb59f66b843568c9436bfc8af49ff531f", + SHAKE256: + "ba9410f6c6bab6eb88c74df83dedbd12799c0401f001a5045eff456a25e623042a613837be74d6dd252ce294697fcd0d0ed1b23d8297becc88dc44cb795093bc4dbae1919022571096db8b8d96e65b7b0157026831ac9662abd113de6b8a83ec783f887469fd1d692eacb76080d4744c809adf13318fcaab3f86beb478e6cdbe25f82c", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 4096", + [[blake3TestInput.slice(0, 4096)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "015094013f57a5277b59d8475c0501042c0b642e531b0a1c8f58d2163229e9690289e9409ddb1b99768eafe1623da896faf7e1114bebeadc1be30829b6f8af707d85c298f4f0ff4d9438aef948335612ae921e76d411c3a9111df62d27eaf871959ae0062b5492a0feb98ef3ed4af277f5395172dbe5c311918ea0074ce0036454f620", + SHAKE128: + "2ac5afdf6c0adc68f0375517cc9d547f812ba9b05da1a93be310847c654e294774ca4ba9505847bc46a5905472f9cdafa84d10489bfb914eb984b36d42ad9117dab4fd86ce55a39c7e6cb778408ee4502704972e9429c3fc9bacb0f230b60a2f98cfb50206f7a128289fb2cc453a68138e6d18d2153f044764059a882b7fe18d1b010a", + SHAKE256: + "70676a5d57937756a94d3cdbb4a636c7a957e5fccd1323d8a4997b62e32ca63235aed57e6563724797107ed8f2eed5c061d2654559f3f1f98418390980fe5f2c91de512116d9fd868ef7b13f5d0c455b1322656ceb2c1218a7d3fe650639fbf97d9349264af111cdcf19cb14b21d3a039f7a378457a1e42e4fc615719324ca11a24cd8", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 4097", + [[blake3TestInput.slice(0, 4097)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "9b4052b38f1c5fc8b1f9ff7ac7b27cd242487b3d890d15c96a1c25b8aa0fb99505f91b0b5600a11251652eacfa9497b31cd3c409ce2e45cfe6c0a016967316c426bd26f619eab5d70af9a418b845c608840390f361630bd497b1ab44019316357c61dbe091ce72fc16dc340ac3d6e009e050b3adac4b5b2c92e722cffdc46501531956", + SHAKE128: + "5bbd95f92e015333295fedfe79c4121c024fa7c0c36aad11070d472d6c6b1b58b32e016de07d3a3ca90c7775557fcaeddbe9362b764f2ec6a6d05b194d428328d8a3ebd1d463438d3290ff21f00f5708d2281ddf3b5ebca55129e84414f28c17cc2b6915b2f28477e655c656e6be9fc53b5b2ba9de1943f65be40e6abbeb01a5f63816", + SHAKE256: + "267d68975d5de40909221876c90f47bdbf114f388edf9d8a1a087e55bb6ddaf41e6e69e2e988cc7c3a7b2d2d09ccbb4bafc4ae4923414ea7147bb4a9ff99aada9d5c553cd0f3f8a2f3aaf856e6d551b38b8370a7d33f8784eeeb0abb840b6193c0a4fa72f3e84ebe1b50f6e895618eab4e4d9cfabdb3bac0c14f3e0313bf06c1a37034", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 5120", + [[blake3TestInput.slice(0, 5120)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "9cadc15fed8b5d854562b26a9536d9707cadeda9b143978f319ab34230535833acc61c8fdc114a2010ce8038c853e121e1544985133fccdd0a2d507e8e615e611e9a0ba4f47915f49e53d721816a9198e8b30f12d20ec3689989175f1bf7a300eee0d9321fad8da232ece6efb8e9fd81b42ad161f6b9550a069e66b11b40487a5f5059", + SHAKE128: + "fe95af7dd621664a24bb1f9339f353359225fdea7733783f58e32d5e4d85baf7ab08405a954f9943684496bde51a886641eaf1f8e9f9e325f98c68a89efcf44b291f4ea0e359668e411a34a3ed372653bdc2c10330cdef8893101f94cbe5566204180e2a6be21483178d810c48ec7f7246fa7369b29153607669f2ce8c297be18125ef", + SHAKE256: + "11295720c7ce1c3c8d6ac97bdaeabd3d0cf47b796cab7aa575c6d50e3ef894d03035d51a972ceeee4821bb7fc3325ea515a9c8ce74de76ce0ceb082f7ee2f6c95aa29a4d490e99eff7daecb1bb990f965d1e7d77c19589d351d015715b80dfa8cc7fe91fa26601936c3e70b739bb763695686be3dcfdf3e360ffbc7f8d2ca197f65a48", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 5121", + [[blake3TestInput.slice(0, 5121)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "628bd2cb2004694adaab7bbd778a25df25c47b9d4155a55f8fbd79f2fe154cff96adaab0613a6146cdaabe498c3a94e529d3fc1da2bd08edf54ed64d40dcd6777647eac51d8277d70219a9694334a68bc8f0f23e20b0ff70ada6f844542dfa32cd4204ca1846ef76d811cdb296f65e260227f477aa7aa008bac878f72257484f2b6c95", + SHAKE128: + "3a7f361620263d1cfcc7297f3b87836c4e5fd9080a4963bd76d6099f955f2f88c64efe4e9880c9e98cf269356e7216051ca612ae45cfbe2752b306b1c30d49a29915a6433bec537c7017c7a59a496d45c111c0424494b79a63c72687938a6ca2b9b738ee73ff13835c1a11ada89e3f4717ef61f4f6f4ff5a56b0e4e4fb65dd70e21473", + SHAKE256: + "a1dbe1bc3eaa519cd1127f955dea3402872e70c5bd6afb97747cd6934df59a5e989d43f64d46ebf7ba6ceb871739f24bc1381bc4144f56bccf758fd07d8fe808ef70528c1cd06a4ae89289310f6deeea8408ccfb08256b82fba909f0f9832e14c2f72b99ed00c132e2937bd2feb4b37bc10797945b1241cb1cb933f5d10632fd69fdff", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 6144", + [[blake3TestInput.slice(0, 6144)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "3e2e5b74e048f3add6d21faab3f83aa44d3b2278afb83b80b3c35164ebeca2054d742022da6fdda444ebc384b04a54c3ac5839b49da7d39f6d8a9db03deab32aade156c1c0311e9b3435cde0ddba0dce7b26a376cad121294b689193508dd63151603c6ddb866ad16c2ee41585d1633a2cea093bea714f4c5d6b903522045b20395c83", + SHAKE128: + "d8098513417ee6564911bbd78c99f531a2d9c1abb46a450e62166171fb7f6891697e23edb49c45d52ae5b63eec35c8f7b34df5df534c7cddbcd9f346e9a3d8bc197eb530a102904a4a6b9e1bff2497e2e30d8d003bcf3c878ba20f7bde2e131e6fc55d9d727822ace69d97d534789af01d20392575bcc5467b9b9b2aa03d1a8bd599bf", + SHAKE256: + "17fb270939ddc594d7283a44a89dd7ff72444411f761c00fad532f6c22fc788e450b1c86cf742456e3601958e4f0399b671fd41e517ae7559dde4a7eea03d02f847a1d02ac2cede20222e684eaf27bce02ec01bd0c3b363f73172024016bb612868362e0754de7bbab377be24a3b9b78285121bf8120cd4833aeb5b40e71e11e54849d", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 6145", + [[blake3TestInput.slice(0, 6145)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "f1323a8631446cc50536a9f705ee5cb619424d46887f3c376c695b70e0f0507f18a2cfdd73c6e39dd75ce7c1c6e3ef238fd54465f053b25d21044ccb2093beb015015532b108313b5829c3621ce324b8e14229091b7c93f32db2e4e63126a377d2a63a3597997d4f1cba59309cb4af240ba70cebff9a23d5e3ff0cdae2cfd54e070022", + SHAKE128: + "bac95567e37ded8cb59b3182a053975324b5622fd8ba40b7e068b50836a8e9ddd27ba197d0831dc637eddc17209bff9a8c79eef509b870665e832133a983b9067cf3d541bf0781fc14b03c714bf89fe500138fab1d214c5535531607e06be543c221f4aeaf6390d3f1a3c533754df4a98f6f44037c5f643caa63410ae4d90f51bffd47", + SHAKE256: + "e34c13b7e0d62cd491dc69b15ad5ce63494226a4e9840b0ce82dcdfcb8ce3e900dc0ea4d50028c12ca4c025a3e1378bcf6cca6c8ff79e047823f0b29adc988ae0f5a6961794c9a9f60b85eecdb874c45ec44295d9029b85764d3df9b6c07bd10ea2b73723d5794eadf2773a39c1190b50a1de6096646117d734efa9fd1361dd0f6aac2", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 7168", + [[blake3TestInput.slice(0, 7168)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "61da957ec2499a95d6b8023e2b0e604ec7f6b50e80a9678b89d2628e99ada77a5707c321c83361793b9af62a40f43b523df1c8633cecb4cd14d00bdc79c78fca5165b863893f6d38b02ff7236c5a9a8ad2dba87d24c547cab046c29fc5bc1ed142e1de4763613bb162a5a538e6ef05ed05199d751f9eb58d332791b8d73fb74e4fce95", + SHAKE128: + "b3da9e5a424fd41e825992b34c5f95b01a4934b99f7aeb1a2585e490617be42f8ffbfbd06308e0460c8b188625052f60b07180b82b1a2085c07595351c4761fa25715c7c51e6282d98dd4bc4883834bad8f03acd89331ed977d6c9412f75e420416d2502519041dc9ee212ada918d9f587a02d34c56a3d9c7d16d1c6b6dd42ee2c21c4", + SHAKE256: + "8de5aabbcdef4542ca5feded1f40b4f3469a48b33f162d8cd2144ce06caf214e4686c02680de660caadbfaddb3fc12dbe55460da4127560015173db66b3742c0245bc0f4f8f21731dc3fa5f7c175f968ef653e9019406c57c572f066a99fd656c11563182fca64b921d4e5d4552a3f031633f35a85b51d1657f2de995d5e8c370944ec", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 7169", + [[blake3TestInput.slice(0, 7169)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "a003fc7a51754a9b3c7fae0367ab3d782dccf28855a03d435f8cfe74605e781798a8b20534be1ca9eb2ae2df3fae2ea60e48c6fb0b850b1385b5de0fe460dbe9d9f9b0d8db4435da75c601156df9d047f4ede008732eb17adc05d96180f8a73548522840779e6062d643b79478a6e8dbce68927f36ebf676ffa7d72d5f68f050b119c8", + SHAKE128: + "756dfff2449ea96c33aecd98e2b102efb7b1aca6c85634abbf8bdade4c9efaf7c72dcddddf8c0f23a581667c948cf25ae665b30166ea2ad9d5ee98306241bf42a8b2132f3fbdc65f9dff88218f28c03d026be63a433ca1e61c32365cc7fde5c707902d77d01c0ddca64871a0491820a3add3deb04f82015ce8a10d91424893cd221d6c", + SHAKE256: + "d74e49cec9380ef693f39006fbc76129fef10c67a650cdd32eaa1f7451c90d04f6639f4132acac615358ee266dafa35b5af4851571a53f7cff4f97dac99fea874d8b37478eb4e9c1276b295a43859b7f3cd74ec4b6824d3ce8841a33f358e1b4add35b17d24b662b790d9e80d48c6fa9cd6c7445bdcd548cd35fddd21bfb317da155f9", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 8192", + [[ + blake3TestInput.slice(0, 1234), + blake3TestInput.slice(1234, 5678), + blake3TestInput.slice(5678, 8192), + ]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "aae792484c8efe4f19e2ca7d371d8c467ffb10748d8a5a1ae579948f718a2a635fe51a27db045a567c1ad51be5aa34c01c6651c4d9b5b5ac5d0fd58cf18dd61a47778566b797a8c67df7b1d60b97b19288d2d877bb2df417ace009dcb0241ca1257d62712b6a4043b4ff33f690d849da91ea3bf711ed583cb7b7a7da2839ba71309bbf", + SHAKE128: + "d91222e88d0b3e4e12edf5d82d4c66c254682eb99de79d8ca47405b7527306b08d08fa8ffa044f835e3f439101ff466f514ea2eb89dbbf2173c1e67f5c74decb9bd9b7b6705b8bf2a2feae80ab19f3316fddcc33c0feaa6f0f9b0a60cab73143773a492a56dc186cbef435d0bcdcea6a49c221200f188e2b328db94703598fc6e27e26", + SHAKE256: + "9cc49c82718707b00f1de5c812d620d7c1519b895bb968c07f1b5343e5e7a93c95245ad1588e7d72cf3f62ccfcc5f1064c25c9da02cfb9268a7da26d850fd0120901b6a86547a4220b8246abe780d62b0e0c04deb67887f56b2f354a84cf316a4f7a4b4b9349f93a95389af54eeaf8c92480f20b528ddfc6cba5d81039a9d51f648639", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 8193", + [[blake3TestInput.slice(0, 8193)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "bab6c09cb8ce8cf459261398d2e7aef35700bf488116ceb94a36d0f5f1b7bc3bb2282aa69be089359ea1154b9a9286c4a56af4de975a9aa4a5c497654914d279bea60bb6d2cf7225a2fa0ff5ef56bbe4b149f3ed15860f78b4e2ad04e158e375c1e0c0b551cd7dfc82f1b155c11b6b3ed51ec9edb30d133653bb5709d1dbd55f4e1ff6", + SHAKE128: + "c26f6910bbb4fe728330d3e497fd28aeda340ab2746029f0629b4684262e11fa4d81fa8f65e95d017a54b21421184470cd2f65d7f158bff30639b19922215f250c7ada5804d89fa239183b08ab40bbedf80fb5e2a452c98770c70f22364f381fca00a16039a09fc64c4eaf143b93e48f46041e8d4cc760a00edaa2b3d2f5aac7ae5afe", + SHAKE256: + "9b2be4e870af8b6cfcb6e64d23f8efeeef9fc6c42ea4492aa93d2fdd10288bccbf77267c63893602766f1eff876ad87d3d971fe75a06acc6fc37ede9fcfc9097301a446cdb181cbd19a065c20ff7ef18638726dc109d451ff305bbdb805efc462bd8834b53f86de985f5e22876862c1889edd1671d20ac7a4fbeb960c4e1c4ad17504d", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 16384", + [[blake3TestInput.slice(0, 16384)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "f875d6646de28985646f34ee13be9a576fd515f76b5b0a26bb324735041ddde49d764c270176e53e97bdffa58d549073f2c660be0e81293767ed4e4929f9ad34bbb39a529334c57c4a381ffd2a6d4bfdbf1482651b172aa883cc13408fa67758a3e47503f93f87720a3177325f7823251b85275f64636a8f1d599c2e49722f42e93893", + SHAKE128: + "574eb85d00d89dcce3cb796c00d17c63dd52ab4d15e595514df4526ee25919ea8a9306cba3a07bd88d3cf08c7161e8ff540ecff2a2c71a5854262b7f4fac30409cedf93ec605a43ab828e204a7bf1b014711aed7b3df471c85fb9368640ff71b68f1dbe81dbe1515c930b4c80650262f9874e6699b64672e78689bf31575ea0e871d22", + SHAKE256: + "aa737331d168b3ffa1418122a3d7475937c0e0a9032cd55c5a324d7bab9f9fe75a54058e67aed27d6641473541a941953a031f8a1f038cdc330a77b6aad45c6bbc630fee7394dc0f7f441ee4464c19e62bbe6ae04af3e8cbee72183c1ec5804547f45a1c3aee741cdfd5b02ae8a0fa40b0a6ddc70a1c891c7da5aeae660cc886fa4c3a", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 31744", + [[blake3TestInput.slice(0, 31744)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "62b6960e1a44bcc1eb1a611a8d6235b6b4b78f32e7abc4fb4c6cdcce94895c47860cc51f2b0c28a7b77304bd55fe73af663c02d3f52ea053ba43431ca5bab7bfea2f5e9d7121770d88f70ae9649ea713087d1914f7f312147e247f87eb2d4ffef0ac978bf7b6579d57d533355aa20b8b77b13fd09748728a5cc327a8ec470f4013226f", + SHAKE128: + "1d6d7ed953b95146b6b05cd468c325a4f0e9d0575a5358dd325c6a4f0e61a7ac4d02111636bb55b52b3ce4fe43cda7d3e54ceab6356654f1a0960e16d49ce5741169886f7f8f22dfaae2c91cf564bf5dd0b33c2da3816dd0758a2018aaa5435f9625d61084162e6f15d212fd2050081e78e83508f2e8c83fb3abc1859101c83a9603f2", + SHAKE256: + "94db03a1c95703d2518868e1cea885684df1263696a385b95c28881f7d7d6d98bd48268d09b61dd78e1dd8bdd05f1d2cb7e9ac04cfc95e48ca1ad9c4c39359ea635219d3b1e153fbbb9aafd37700a79a02930edd9caaa2c209db75a0f8baa68c989b055001e3c22c333ebd3978733aed70ea7db73b4309e7b2e0bf18cfb18ad911a9b6", + }, + ], + + [ + "BLAKE3 official test vector input for hash with input length 102400", + [[blake3TestInput.slice(0, 102400)]], + { length: 131 }, + { + ...allErrors, + BLAKE3: + "bc3e3d41a1146b069abffad3c0d44860cf664390afce4d9661f7902e7943e085e01c59dab908c04c3342b816941a26d69c2605ebee5ec5291cc55e15b76146e6745f0601156c3596cb75065a9c57f35585a52e1ac70f69131c23d611ce11ee4ab1ec2c009012d236648e77be9295dd0426f29b764d65de58eb7d01dd42248204f45f8e", + SHAKE128: + "66c46a1d8eb2a81332627d7eaddf26c1ae44248785b419c20d4e2a6ab7b9718e9fba547058d7d63937c832a74c2ac56ebe36775cceb9dfb770b46257c92581ee81c8dbbb15946617f4bd5fb750b7fc30c431c628211703bebca863af9d3ba1a16cc5ffc034e69522707fa97d3a4325b3bd35f629aa3a07781ccf8a049393335b049f4d", + SHAKE256: + "9ae96dbcac28723fa69799bb24cd244160b097778e8d74d2b94d9826f29f99fe896638856c1ad6915d0ff9837c2333061ce582dbf38a0e428956fcac1dc75841c85895f6e25a5be2e0a5af9677f9c900fbbbef680c80dc0783199ad4eb67204ba7da0460dc5fbac31cc31f8fa950b27b4a1eb4c9728af4ce3588134885ab64631f07a8", + }, + ], +]; + +for (const algorithm of digestAlgorithms) { + Deno.test(`[crypto/digest/${algorithm}] test vectors`, async () => { + for ( + const [caption, piecesVariations, options, algorithms] of digestCases + ) { + const expected = algorithms[algorithm]; + for (const [i, pieces] of piecesVariations.entries()) { + const bytePieces = pieces.map((piece) => + typeof piece === "string" ? new TextEncoder().encode(piece) : piece + ) as Array; + try { + const actual = toHexString( + await stdCrypto.subtle.digest({ + ...options, + name: algorithm, + }, bytePieces), + ); + assertEquals( + expected, + actual, + `${algorithm} of ${caption}${ + i > 0 ? ` (but not until variation [${i}]!)` : "" + } with options ${ + JSON.stringify(options) + }) returned unexpected value\n actual: ${actual}\nexpected: ${expected}`, + ); + } catch (error) { + if (expected instanceof Function) { + assert( + error instanceof expected, + `got a different error than expected: ${error}`, + ); + } else { + throw error; + } + } + } + } + }); +} + +const toHexString = (bytes: ArrayBuffer): string => + new Uint8Array(bytes).reduce( + (str, byte) => str + byte.toString(16).padStart(2, "0"), + "", + ); diff --git a/node/_crypto/pbkdf2.ts b/node/_crypto/pbkdf2.ts index 2a63802e6..360220629 100644 --- a/node/_crypto/pbkdf2.ts +++ b/node/_crypto/pbkdf2.ts @@ -1,5 +1,5 @@ -import { createHash } from "../../hash/mod.ts"; import { Buffer } from "../buffer.ts"; +import { createHash } from "../crypto.ts"; import { MAX_ALLOC } from "./constants.ts"; import { HASH_DATA } from "./types.ts"; @@ -22,20 +22,14 @@ type Algorithms = | "sha384" | "sha512"; -function createHasher(alg: Algorithms) { - let normalizedAlg: NormalizedAlgorithms; - if (alg === "rmd160") { - normalizedAlg = "ripemd160"; - } else { - normalizedAlg = alg; - } - return (value: Uint8Array) => - Buffer.from(createHash(normalizedAlg).update(value).digest()); -} +const createHasher = (algorithm: string) => + (value: Uint8Array) => + Buffer.from(createHash(algorithm).update(value).digest() as Buffer); function getZeroes(zeros: number) { return Buffer.alloc(zeros); } + const sizes = { md5: 16, sha1: 20, diff --git a/node/_crypto/pbkdf2_test.ts b/node/_crypto/pbkdf2_test.ts index b43b65ea5..a408cab3c 100644 --- a/node/_crypto/pbkdf2_test.ts +++ b/node/_crypto/pbkdf2_test.ts @@ -385,7 +385,7 @@ Deno.test("pbkdf2 hashes data correctly", () => { dkLen, algorithm as Algorithms, (err, res) => { - assert(!err); + assert(!err, String(err)); assertEquals( res?.toString("hex"), results[algorithm as Algorithms], diff --git a/node/crypto.ts b/node/crypto.ts index e805f0ecf..a77c49d29 100644 --- a/node/crypto.ts +++ b/node/crypto.ts @@ -2,16 +2,35 @@ // Copyright Joyent, Inc. and Node.js contributors. All rights reserved. MIT license. import { default as randomBytes } from "./_crypto/randomBytes.ts"; import { - createHash as stdCreateHash, - Hasher, - SupportedAlgorithm, - supportedAlgorithms, -} from "../hash/mod.ts"; + crypto as wasmCrypto, + DigestAlgorithm, + digestAlgorithms, +} from "../_wasm_crypto/mod.ts"; import { pbkdf2, pbkdf2Sync } from "./_crypto/pbkdf2.ts"; import { Buffer } from "./buffer.ts"; import { Transform } from "./stream.ts"; import { TransformOptions } from "./_stream/transform.ts"; import { encode as encodeToHex } from "../encoding/hex.ts"; +import { encode as encodeToBase64 } from "../encoding/base64.ts"; + +const coerceToBytes = (data: string | BufferSource): Uint8Array => { + if (data instanceof Uint8Array) { + return data; + } else if (typeof data === "string") { + // This assumes UTF-8, which may not be correct. + return new TextEncoder().encode(data); + } else if (ArrayBuffer.isView(data)) { + return new Uint8Array( + data.buffer, + data.byteOffset, + data.byteLength, + ); + } else if (data instanceof ArrayBuffer) { + return new Uint8Array(data); + } else { + throw new TypeError("expected data to be string | BufferSource"); + } +}; /** * The Hash class is a utility for creating hash digests of data. It can be used in one of two ways: @@ -22,34 +41,58 @@ import { encode as encodeToHex } from "../encoding/hex.ts"; * The crypto.createHash() method is used to create Hash instances. Hash objects are not to be created directly using the new keyword. */ export class Hash extends Transform { - public hash: Hasher; - constructor(algorithm: SupportedAlgorithm, _opts?: TransformOptions) { + #context: wasmCrypto.DigestContext; + + constructor( + algorithm: string | wasmCrypto.DigestContext, + _opts?: TransformOptions, + ) { super({ transform(chunk: string, _encoding: string, callback: () => void): void { - hash.update(chunk); + context.update(coerceToBytes(chunk)); callback(); }, flush(callback: () => void): void { - this.push(hash.digest()); + this.push(context.digest(undefined)); callback(); }, }); - const hash = this.hash = stdCreateHash(algorithm); + + if (typeof algorithm === "string") { + // Node/OpenSSL and WebCrypto format some digest names differently; + // we attempt to handle those here. + algorithm = algorithm.toUpperCase(); + if (opensslToWebCryptoDigestNames[algorithm]) { + algorithm = opensslToWebCryptoDigestNames[algorithm]; + } + this.#context = new wasmCrypto.DigestContext( + algorithm as DigestAlgorithm, + ); + } else { + this.#context = algorithm; + } + + const context = this.#context; } - // TODO(kt3k): Implement copy method - // copy(options) { ... } + copy(): Hash { + return new Hash(this.#context.clone()); + } /** * Updates the hash content with the given data. */ update(data: string | ArrayBuffer, _encoding?: string): this { + let bytes; if (typeof data === "string") { data = new TextEncoder().encode(data); - this.hash.update(data); + bytes = coerceToBytes(data); } else { - this.hash.update(data); + bytes = coerceToBytes(data); } + + this.#context.update(bytes); + return this; } @@ -58,34 +101,50 @@ export class Hash extends Transform { * * If encoding is provided a string will be returned; otherwise a Buffer is returned. * - * Supported encoding is currently 'hex' only. 'binary', 'base64' will be supported in the future versions. + * Supported encoding is currently 'hex', 'binary', 'base64'. */ digest(encoding?: string): Buffer | string { - const digest = this.hash.digest(); + const digest = this.#context.digest(undefined); if (encoding === undefined) { return Buffer.from(digest); } switch (encoding) { - case "hex": { + case "hex": return new TextDecoder().decode(encodeToHex(new Uint8Array(digest))); - } - // TODO(kt3k): Support more output encodings such as base64, binary, etc - default: { + case "binary": + return String.fromCharCode(...digest); + case "base64": + return encodeToBase64(digest); + default: throw new Error( - `The output encoding for hash digest is not impelemented: ${encoding}`, + `The output encoding for hash digest is not implemented: ${encoding}`, ); - } } } } +/** + * Supported digest names that OpenSSL/Node and WebCrypto identify differently. + */ +const opensslToWebCryptoDigestNames: Record = { + "BLAKE2B512": "BLAKE2B", + "BLAKE2S256": "BLAKE2S", + "RIPEMD160": "RIPEMD-160", + "RMD160": "RIPEMD-160", + "SHA1": "SHA-1", + "SHA224": "SHA-224", + "SHA256": "SHA-256", + "SHA384": "SHA-384", + "SHA512": "SHA-512", +}; + /** * Creates and returns a Hash object that can be used to generate hash digests * using the given `algorithm`. Optional `options` argument controls stream behavior. */ export function createHash( - algorithm: SupportedAlgorithm, + algorithm: string, opts?: TransformOptions, ) { return new Hash(algorithm, opts); @@ -94,8 +153,8 @@ export function createHash( /** * Returns an array of the names of the supported hash algorithms, such as 'sha1'. */ -export function getHashes(): SupportedAlgorithm[] { - return supportedAlgorithms.slice(); +export function getHashes(): readonly string[] { + return digestAlgorithms; } export default { Hash, createHash, getHashes, pbkdf2, pbkdf2Sync, randomBytes }; diff --git a/ws/mod.ts b/ws/mod.ts index 5870f8216..cbef364ca 100644 --- a/ws/mod.ts +++ b/ws/mod.ts @@ -2,7 +2,9 @@ import { hasOwnProperty } from "../_util/has_own_property.ts"; import { BufReader, BufWriter } from "../io/bufio.ts"; import { readLong, readShort, sliceLongToBytes } from "../io/ioutil.ts"; -import { Sha1 } from "../hash/sha1.ts"; +import { crypto } from "../crypto/mod.ts"; +import * as base64 from "../encoding/base64.ts"; + import { writeResponse } from "../http/_io.ts"; import { TextProtoReader } from "../textproto/mod.ts"; import { Deferred, deferred } from "../async/deferred.ts"; @@ -410,10 +412,9 @@ const kGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; /** Create value of Sec-WebSocket-Accept header from inputted nonce. */ export function createSecAccept(nonce: string): string { - const sha1 = new Sha1(); - sha1.update(nonce + kGUID); - const bytes = sha1.digest(); - return btoa(String.fromCharCode(...bytes)); + return base64.encode( + crypto.subtle.digestSync("SHA-1", new TextEncoder().encode(nonce + kGUID)), + ); } /** Upgrade inputted TCP connection into WebSocket connection. */