diff --git a/.gitignore b/.gitignore index dac7be1..925ba52 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ wasm/typescript/demo/ wasm/test micromamba/ .pixi/ +.vscode/ diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000..0196e10 --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1,7 @@ +resampled-moving-via-downsample-transform.mha +resampled-moving.mha +resampledMoving.mha +result-downsampled.mha +result.mha +result.png + diff --git a/examples/downsample-register.mjs b/examples/downsample-register.mjs new file mode 100644 index 0000000..bffdbf8 --- /dev/null +++ b/examples/downsample-register.mjs @@ -0,0 +1,118 @@ +#!/usr/bin/env node + +/* + +This example demonstrates how to use the @itk-wasm/elastix module. + +It shows how to: + +1. Register with elastix +2. Apply the resulting transform with transformix +3. Downsample the input images. +4. Register the downsampled images. +5. Apply the resulting transform at the original resolution. + +*/ + +import path from "path"; + +import { readImageNode, writeImageNode } from "@itk-wasm/image-io"; +import { downsampleNode } from "@itk-wasm/downsample"; +import { + elastixNode, + defaultParameterMapNode, + transformixNode, +} from "@itk-wasm/elastix"; + +// ------------------------------------------------------------------ +// Read output input fixed and moving images +const fixedImagePath = path.join( + import.meta.dirname, + "data", + "CT_2D_head_fixed.mha" +); +const movingImagePath = path.join( + import.meta.dirname, + "data", + "CT_2D_head_moving.mha" +); +const fixedImage = await readImageNode(fixedImagePath); +const movingImage = await readImageNode(movingImagePath); +console.log("Fixed image:", fixedImage); +console.log("Moving image:", movingImage); + +// ------------------------------------------------------------------ +// Perform registration at full resolution +const { parameterMap: translationParameterMap } = await defaultParameterMapNode( + "translation", + { + numberOfResolutions: 2, + } +); +const { parameterMap: bsplineParameterMap } = await defaultParameterMapNode( + "bspline", + { + numberOfResolutions: 2, + } +); +const parameterObject = [translationParameterMap, bsplineParameterMap]; +const { result, transformParameterObject } = await elastixNode( + parameterObject, + { + fixed: fixedImage, + moving: movingImage, + } +); +await writeImageNode(result, "result.mha"); + +// ------------------------------------------------------------------ +// Use the transform to resample the moving image +const { result: resampledMovingImage } = await transformixNode( + movingImage, + transformParameterObject +); +// Same as result.mha +await writeImageNode(resampledMovingImage, "resampled-moving.mha"); + +// ------------------------------------------------------------------ +// Generate a downsampled version of the fixed and moving images +const shrinkFactors = [2, 2]; +const { downsampled: downsampledFixedImage } = await downsampleNode( + fixedImage, + { + shrinkFactors, + } +); +const { downsampled: downsampledMovingImage } = await downsampleNode( + movingImage, + { + shrinkFactors, + } +); +console.log("Downsampled fixed image:", downsampledFixedImage); +console.log("Downsampled moving image:", downsampledMovingImage); + +// ------------------------------------------------------------------ +// Perform registration at downsampled resolution +const { + result: resultDownsampled, + transformParameterObject: transformParameterObjectDownsampled, +} = await elastixNode(parameterObject, { + fixed: downsampledFixedImage, + moving: downsampledMovingImage, +}); +await writeImageNode(resultDownsampled, "result-downsampled.mha"); + +// ------------------------------------------------------------------ +// Use the transform to resample the moving image at its original resolution +const { result: resampledMovingImageViaDownsampleTransform } = + await transformixNode(movingImage, transformParameterObjectDownsampled, { + outputOrigin: fixedImage.origin, + outputSpacing: fixedImage.spacing, + outputDirection: fixedImage.direction, + outputSize: fixedImage.size, + }); +await writeImageNode( + resampledMovingImageViaDownsampleTransform, + "resampled-moving-via-downsample-transform.mha" +); diff --git a/examples/package-lock.json b/examples/package-lock.json new file mode 100644 index 0000000..049dc7e --- /dev/null +++ b/examples/package-lock.json @@ -0,0 +1,1607 @@ +{ + "name": "itk-elastix-examples", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "itk-elastix-examples", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@itk-wasm/downsample": "^1.6.0", + "@itk-wasm/elastix": "^1.0.2", + "@itk-wasm/image-io": "^1.6.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@ipld/car": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@ipld/car/-/car-5.4.0.tgz", + "integrity": "sha512-FiGxOhTUh3fn/kkA+YvNYQjA/T8T5DcKG0NZwAi3aXrizN1qm99HzdYTccEwcX/rUCtI8wTUCKDNPBLUb7pBIQ==", + "dependencies": { + "@ipld/dag-cbor": "^9.0.7", + "cborg": "^4.0.5", + "multiformats": "^13.0.0", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-cbor": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.2.2.tgz", + "integrity": "sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-json": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-json/-/dag-json-10.2.3.tgz", + "integrity": "sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==", + "dependencies": { + "cborg": "^4.0.0", + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/dag-pb": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.3.tgz", + "integrity": "sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==", + "dependencies": { + "multiformats": "^13.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@ipld/unixfs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@ipld/unixfs/-/unixfs-3.0.0.tgz", + "integrity": "sha512-Tj3/BPOlnemcZQ2ETIZAO8hqAs9KNzWyX5J9+JCL9jDwvYwjxeYjqJ3v+9DusNvTBmJhZnGVP6ijUHrsuOLp+g==", + "dependencies": { + "@ipld/dag-pb": "^4.0.0", + "@multiformats/murmur3": "^2.1.3", + "@perma/map": "^1.0.2", + "actor": "^2.3.1", + "multiformats": "^13.0.1", + "protobufjs": "^7.1.2", + "rabin-rs": "^2.1.0" + } + }, + "node_modules/@itk-wasm/dam": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@itk-wasm/dam/-/dam-1.1.1.tgz", + "integrity": "sha512-7+9L3lrLMKF4y6B6qjs8GqfbpxT0waOJUM14NdMNEA6M+BoBS8fdHREhQHo2s7QMA5O7I+Jv7m+dyqlisGnbdQ==", + "dependencies": { + "axios": "^1.4.0", + "commander": "^10.0.1", + "decompress": "^4.2.1", + "files-from-path": "^1.0.0", + "ipfs-car": "^1.0.0", + "tar": "^6.1.13" + }, + "bin": { + "dam": "cli.js" + } + }, + "node_modules/@itk-wasm/dam/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@itk-wasm/downsample": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@itk-wasm/downsample/-/downsample-1.6.0.tgz", + "integrity": "sha512-nHzOjmGtXDKQlb5QjNSXhs83IMIworD+Tp94hP35nXd2MqEjJjdTV7iFC/jxlbVQ6W2hjc3miJL8fWHN0PcRCw==", + "dependencies": { + "itk-wasm": "^1.0.0-b.188" + } + }, + "node_modules/@itk-wasm/elastix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@itk-wasm/elastix/-/elastix-1.0.2.tgz", + "integrity": "sha512-R4SxPdZAqwelM9N9BkEGZtbN3eM081jeaIjNILhsaL1SKiF6rm2Kck2j04uzORHaQkwc4OC2+oiXllJwHpJpQg==", + "dependencies": { + "itk-wasm": "^1.0.0-b.196" + } + }, + "node_modules/@itk-wasm/image-io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@itk-wasm/image-io/-/image-io-1.6.0.tgz", + "integrity": "sha512-cx+lHpTc3tmkfKMOMpuwGfQyhsYmac09NoOjeo5bOW45pp040boQiPow8Q/GQmjHUfI9c+H7SqeJCfKVS5SPRw==", + "dependencies": { + "axios": "^1.7.4", + "itk-wasm": "^1.0.0-b.188", + "mime-types": "^2.1.35" + } + }, + "node_modules/@multiformats/blake2": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/blake2/-/blake2-2.0.2.tgz", + "integrity": "sha512-AOWu6Tyuk5UoT5m4faB6ntVnPB8EmuD6rn18s4cCgHNEGgsamT8GdvjP9DYjzFHQVaP/0L3CaKqWQqJlXx9ecw==", + "dependencies": { + "blakejs": "^1.2.1", + "multiformats": "^13.0.0" + } + }, + "node_modules/@multiformats/murmur3": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.1.8.tgz", + "integrity": "sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==", + "dependencies": { + "multiformats": "^13.0.0", + "murmurhash3js-revisited": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@multiformats/sha3": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@multiformats/sha3/-/sha3-3.0.2.tgz", + "integrity": "sha512-fBxODTXa1sOWYB9q6GSFe2HYSVwMEdnPa7c7FgNhr/rMFQ2HGtwmRppTm317HSpGSTUkoTvyKQDNcteJEGU+bg==", + "dependencies": { + "js-sha3": "^0.9.1", + "multiformats": "^13.0.0" + } + }, + "node_modules/@perma/map": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@perma/map/-/map-1.0.3.tgz", + "integrity": "sha512-Bf5njk0fnJGTFE2ETntq0N1oJ6YdCPIpTDn3R3KYZJQdeYSOCNL7mBrFlGnbqav8YQhJA/p81pvHINX9vAtHkQ==", + "dependencies": { + "@multiformats/murmur3": "^2.1.0", + "murmurhash3js-revisited": "^3.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@thewtex/zstddec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@thewtex/zstddec/-/zstddec-0.2.1.tgz", + "integrity": "sha512-1yTu7m/qU1nsJy4mCZAB3GAhczsClhw+WIXK0oe598eHcvefH16WLOYN4Uko7K2/Ttz9KEBvvT7WFrZD41ShgA==" + }, + "node_modules/@types/emscripten": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.1.tgz", + "integrity": "sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==" + }, + "node_modules/@types/node": { + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@web3-storage/car-block-validator": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@web3-storage/car-block-validator/-/car-block-validator-1.2.2.tgz", + "integrity": "sha512-lR9l+ZszhTid5HfZE8ohnGf2RJp2kaBOnoejmsACs3iTNiy+3K09dnPm8MhgBE9RCIgPBKM0CCWXO9l+I6jrKA==", + "dependencies": { + "@multiformats/blake2": "^2.0.2", + "@multiformats/murmur3": "^2.1.8", + "@multiformats/sha3": "^3.0.2", + "multiformats": "^13.3.1", + "uint8arrays": "^5.1.0" + } + }, + "node_modules/abort-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", + "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==" + }, + "node_modules/actor": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/actor/-/actor-2.3.1.tgz", + "integrity": "sha512-ST/3wnvcP2tKDXnum7nLCLXm+/rsf8vPocXH2Fre6D8FQwNkGDd4JEitBlXj007VQJfiGYRQvXqwOBZVi+JtRg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/cborg": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-4.2.10.tgz", + "integrity": "sha512-ZVA0xrVn8uBfDJYgfKKZzB/93z/Uiz7YtRdBPsZi/gyHNyqFdHMLHURVEk9dejOHepaX0zhcMyNva2/vF972SA==", + "bin": { + "cborg": "lib/bin.js" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/files-from-path": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/files-from-path/-/files-from-path-1.1.4.tgz", + "integrity": "sha512-huzBO8vS15VrEC0ej62GtYCtPUNEsTdHIN3aFBjCUZyFQTr+bW4cpwvPMZssM/r+9/hOh4ikUiJ3L+9kZKBMag==", + "dependencies": { + "graceful-fs": "^4.2.10" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/hamt-sharding": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.6.tgz", + "integrity": "sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==", + "dependencies": { + "sparse-array": "^1.3.1", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interface-blockstore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.3.1.tgz", + "integrity": "sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw==", + "dependencies": { + "interface-store": "^6.0.0", + "multiformats": "^13.2.3" + } + }, + "node_modules/interface-store": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-6.0.2.tgz", + "integrity": "sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==" + }, + "node_modules/ipfs-car": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ipfs-car/-/ipfs-car-1.2.0.tgz", + "integrity": "sha512-A++1UesxqwfNv14NmFxr4MHi+vD9rR6SWr87MU9o0315Mzqys48pEefL8rlCAA9cw2qKYeT/ZPYVtqIMAr6U1Q==", + "dependencies": { + "@ipld/car": "^5.1.0", + "@ipld/dag-cbor": "^9.0.0", + "@ipld/dag-json": "^10.0.1", + "@ipld/dag-pb": "^4.0.2", + "@ipld/unixfs": "^3.0.0", + "@web3-storage/car-block-validator": "^1.0.1", + "files-from-path": "^1.0.0", + "ipfs-unixfs-exporter": "^13.0.1", + "multiformats": "^13.0.1", + "sade": "^1.8.1", + "varint": "^6.0.0" + }, + "bin": { + "🚘": "bin.js", + "ipfs-car": "bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ipfs-unixfs": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.1.tgz", + "integrity": "sha512-gUeeX63EFgiaMgcs0cUs2ZUPvlOeEZ38okjK8twdWGZX2jYd2rCk8k/TJ3DSRIDZ2t/aZMv6I23guxHaofZE3w==", + "dependencies": { + "protons-runtime": "^5.5.0", + "uint8arraylist": "^2.4.8" + } + }, + "node_modules/ipfs-unixfs-exporter": { + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.6.2.tgz", + "integrity": "sha512-U3NkQHvQn5XzxtjSo1/GfoFIoXYY4hPgOlZG5RUrV5ScBI222b3jAHbHksXZuMy7sqPkA9ieeWdOmnG1+0nxyw==", + "dependencies": { + "@ipld/dag-cbor": "^9.2.1", + "@ipld/dag-json": "^10.2.2", + "@ipld/dag-pb": "^4.1.2", + "@multiformats/murmur3": "^2.1.8", + "hamt-sharding": "^3.0.6", + "interface-blockstore": "^5.3.0", + "ipfs-unixfs": "^11.0.0", + "it-filter": "^3.1.1", + "it-last": "^3.0.6", + "it-map": "^3.1.1", + "it-parallel": "^3.0.8", + "it-pipe": "^3.0.1", + "it-pushable": "^3.2.3", + "multiformats": "^13.2.3", + "p-queue": "^8.0.1", + "progress-events": "^1.0.1" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==" + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/it-filter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.2.tgz", + "integrity": "sha512-2AozaGjIvBBiB7t7MpVNug9kwofqmKSpvgW7zhuyvCs6xxDd6FrfvqyfYtlQTKLNP+Io1WeXko1UQhdlK4M0gg==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-last": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.7.tgz", + "integrity": "sha512-qG4BTveE6Wzsz5voqaOtZAfZgXTJT+yiaj45vp5S0Vi8oOdgKlRqUeolfvWoMCJ9vwSc/z9pAaNYIza7gA851w==" + }, + "node_modules/it-map": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.2.tgz", + "integrity": "sha512-G3dzFUjTYHKumJJ8wa9dSDS3yKm8L7qDUnAgzemOD0UMztwm54Qc2v97SuUCiAgbOz/aibkSLImfoFK09RlSFQ==", + "dependencies": { + "it-peekable": "^3.0.0" + } + }, + "node_modules/it-merge": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.9.tgz", + "integrity": "sha512-TjY4WTiwe4ONmaKScNvHDAJj6Tw0UeQFp4JrtC/3Mq7DTyhytes7mnv5OpZV4gItpZcs0AgRntpT2vAy2cnXUw==", + "dependencies": { + "it-queueless-pushable": "^2.0.0" + } + }, + "node_modules/it-parallel": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.9.tgz", + "integrity": "sha512-FSg8T+pr7Z1VUuBxEzAAp/K1j8r1e9mOcyzpWMxN3mt33WFhroFjWXV1oYSSjNqcdYwxD/XgydMVMktJvKiDog==", + "dependencies": { + "p-defer": "^4.0.1" + } + }, + "node_modules/it-peekable": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.6.tgz", + "integrity": "sha512-odk9wn8AwFQipy8+tFaZNRCM62riraKZJRysfbmOett9wgJumCwgZFzWUBUwMoiQapEcEVGwjDpMChZIi+zLuQ==" + }, + "node_modules/it-pipe": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", + "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", + "dependencies": { + "it-merge": "^3.0.0", + "it-pushable": "^3.1.2", + "it-stream-types": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/it-pushable": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", + "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", + "dependencies": { + "p-defer": "^4.0.0" + } + }, + "node_modules/it-queueless-pushable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.0.tgz", + "integrity": "sha512-MlNnefWT/ntv5fesrHpxwVIu6ZdtlkN0A4aaJiE5wnmPMBv9ttiwX3UEMf78dFwIj5ZNaU9usYXg4swMEpUNJQ==", + "dependencies": { + "abort-error": "^1.0.1", + "p-defer": "^4.0.1", + "race-signal": "^1.1.3" + } + }, + "node_modules/it-stream-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", + "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==" + }, + "node_modules/itk-wasm": { + "version": "1.0.0-b.196", + "resolved": "https://registry.npmjs.org/itk-wasm/-/itk-wasm-1.0.0-b.196.tgz", + "integrity": "sha512-LJoGEFQLgE2lKERTEOq9XFtMTnPUwR0TBWxTA/hI1QPqvXfVNHQGv+vzHTrRCq2GAM+vtWZuVt/XecTBBkN6Hg==", + "dependencies": { + "@emnapi/wasi-threads": "^1.0.1", + "@itk-wasm/dam": "^1.1.1", + "@thewtex/zstddec": "^0.2.1", + "@types/emscripten": "^1.39.10", + "axios": "^1.8.3", + "chalk": "^5.3.0", + "comlink": "^4.4.1", + "commander": "^11.1.0", + "fs-extra": "^11.2.0", + "glob": "^8.1.0", + "markdown-table": "^3.0.3", + "mime-types": "^2.1.35", + "wasm-feature-detect": "^1.6.1" + }, + "bin": { + "itk-wasm": "src/itk-wasm-cli.js" + } + }, + "node_modules/js-sha3": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", + "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==" + }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/multiformats": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.3.2.tgz", + "integrity": "sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==" + }, + "node_modules/murmurhash3js-revisited": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz", + "integrity": "sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-defer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", + "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress-events": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", + "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==" + }, + "node_modules/protobufjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.0.tgz", + "integrity": "sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protons-runtime": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", + "integrity": "sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==", + "dependencies": { + "uint8-varint": "^2.0.2", + "uint8arraylist": "^2.4.3", + "uint8arrays": "^5.0.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/rabin-rs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rabin-rs/-/rabin-rs-2.1.0.tgz", + "integrity": "sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g==" + }, + "node_modules/race-signal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-1.1.3.tgz", + "integrity": "sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/sparse-array": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", + "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/uint8-varint": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", + "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", + "dependencies": { + "uint8arraylist": "^2.0.0", + "uint8arrays": "^5.0.0" + } + }, + "node_modules/uint8arraylist": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", + "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", + "dependencies": { + "uint8arrays": "^5.0.1" + } + }, + "node_modules/uint8arrays": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", + "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", + "dependencies": { + "multiformats": "^13.0.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, + "node_modules/wasm-feature-detect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", + "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/examples/package.json b/examples/package.json new file mode 100644 index 0000000..9bbd322 --- /dev/null +++ b/examples/package.json @@ -0,0 +1,30 @@ +{ + "name": "itk-elastix-examples", + "version": "0.1.0", + "description": "Examples for @itk-wasm/elastix", + "main": "\"\"", + "scripts": { + "test": "npm run downsample-register", + "downsample-register": "node ./downsample-register.mjs" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/InsightSoftwareConsortium/ITKElastix.git" + }, + "keywords": [ + "registration", + "imaging", + "science" + ], + "author": "Matt McCormick", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/InsightSoftwareConsortium/ITKElastix/issues" + }, + "homepage": "https://github.com/InsightSoftwareConsortium/ITKElastix#readme", + "dependencies": { + "@itk-wasm/downsample": "^1.6.0", + "@itk-wasm/elastix": "^1.0.2", + "@itk-wasm/image-io": "^1.6.0" + } +} diff --git a/package.json b/package.json index 00a4a1b..1f62dd0 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,21 @@ { "name": "itk-elastix-build", - "version": "0.1.0", + "version": "1.0.0", "description": "npm scripts to generate itk-wasm artifacts.", "private": true, - "packageManager": "pnpm@10.7.1", + "packageManager": "pnpm@10.12.3", "type": "module", "itk-wasm": { "description": "A toolbox for rigid and nonrigid registration of images.", "repository": "https://github.com/InsightSoftwareConsortium/ITKElastix", - "package-version": "0.4.0", + "package-version": "1.0.2", "test-data-hash": "bafybeie7oon27usqjgrtxodzkbd4i6sanfwobv26c3tf7adhxop46o2f3q", "test-data-urls": [ "https://data.kitware.com/api/v1/file/65196dede7f0366cdfec199e/download", "https://bafybeid5dvqt2z4uhyal7fws5sai7vc6vgrlicknr5tdqi2phx5q7vl3qm.ipfs.w3s.link/ipfs/bafybeid5dvqt2z4uhyal7fws5sai7vc6vgrlicknr5tdqi2phx5q7vl3qm/data.tar.gz" ], - "emscripten-docker-image": "itkwasm/emscripten:20250319-964fe20b", - "wasi-docker-image": "itkwasm/wasi:20250319-964fe20b", + "emscripten-docker-image": "docker.io/itkwasm/emscripten:20250902-fb36664b", + "wasi-docker-image": "docker.io/itkwasm/wasi:20250902-fb36664b", "typescript-package-name": "@itk-wasm/elastix", "typescript-output-dir": "wasm/typescript", "python-package-name": "itkwasm-elastix", @@ -25,6 +25,6 @@ "license": "Apache-2.0", "devDependencies": { "@itk-wasm/dam": "^1.1.1", - "itk-wasm": "^1.0.0-b.188" + "itk-wasm": "^1.0.0-b.196" } } diff --git a/pixi.lock b/pixi.lock index 5d0020a..7368932 100644 --- a/pixi.lock +++ b/pixi.lock @@ -24,7 +24,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.14.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.14.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.7-pyh29332c3_1.conda @@ -68,6 +68,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-10.7.1-h6417eb3_0.conda @@ -291,31 +292,31 @@ packages: license_family: MIT size: 53888 timestamp: 1738578623567 -- conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.14.0-pyhd8ed1ab_1.conda - sha256: 908fc6e847da57da39011be839db0f56f16428d3d950f49a8c7ac1c9c1ed0505 - md5: b34bdd91d7298c76d9891cea6c8ab27f +- conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.14.1-pyhd8ed1ab_0.conda + sha256: d245185287bdf5d3c808267aebda2cb7fbce779099493f92e368f813e6a157d4 + md5: 82f74ce5f4548c3627ed52dfac9da8ca depends: - click >=8.0.6 - - hatchling >=1.24.2 + - hatchling >=1.26.3 - httpx >=0.22.0 - hyperlink >=21.0.0 - keyring >=23.5.0 - - packaging >=24.2 - - pexpect >=4.8,<5 + - packaging >=23.2 + - pexpect >=4.8,<5.dev0 - platformdirs >=2.5.0 - python >=3.9 - rich >=11.2.0 - shellingham >=1.4.0 - tomli-w >=1.0 - tomlkit >=0.11.1 - - userpath >=1.7,<2 - - uv >=0.1.35 + - userpath >=1.7,<2.dev0 + - uv >=0.5.23 - virtualenv >=20.26.6 - - zstandard <1.0 + - zstandard <1 license: MIT license_family: MIT - size: 177914 - timestamp: 1734476985835 + size: 178008 + timestamp: 1744039278512 - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.27.0-pypyhd8ed1ab_0.conda sha256: e83420f81390535774ac33b83d05249b8993e5376b76b4d461f83a77549e493d md5: b85c18ba6e927ae0da3fde426c893cc8 @@ -778,6 +779,15 @@ packages: license: ISC size: 53561 timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1-pyh145f28c_0.conda + sha256: 7aed9a2e365707e03b43642c9661801dcbe1f619e40e9fe0723d7a20a1f2d8bc + md5: 4627e20c39e7340febed674c3bf05b16 + depends: + - python >=3.13.0a0 + license: MIT + license_family: MIT + size: 1246282 + timestamp: 1745671894117 - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_1.conda sha256: bb50f6499e8bc1d1a26f17716c97984671121608dc0c3ecd34858112bce59a27 md5: 577852c7e53901ddccc7e6a9959ddebe diff --git a/pixi.toml b/pixi.toml index b355275..f398a09 100644 --- a/pixi.toml +++ b/pixi.toml @@ -59,4 +59,5 @@ nodejs = ">=22.5.1,<23" pnpm = ">=10.7.1,<11" jq = ">=1.7.1,<2" python = ">=3.12.4,<4" -hatch = ">=1.12.0,<2" +hatch = ">=1.14.1,<2" +pip = ">=25.1,<26" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fcce31..63076d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,50 +10,50 @@ importers: devDependencies: '@itk-wasm/dam': specifier: ^1.1.1 - version: 1.1.1(debug@4.4.1) + version: 1.1.1(debug@4.3.5) itk-wasm: - specifier: ^1.0.0-b.188 - version: 1.0.0-b.192(debug@4.4.1) + specifier: ^1.0.0-b.196 + version: 1.0.0-b.196(debug@4.3.5) wasm/typescript: dependencies: itk-wasm: - specifier: ^1.0.0-b.188 - version: 1.0.0-b.192(debug@4.4.1) + specifier: ^1.0.0-b.196 + version: 1.0.0-b.196(debug@4.3.5) devDependencies: '@itk-wasm/demo-app': specifier: ^0.2.0 - version: 0.2.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(@floating-ui/utils@0.2.10)(@types/react@19.1.8)(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4) + version: 0.2.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(@types/react@18.3.3)(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1) '@itk-wasm/image-io': specifier: ^1.3.0 - version: 1.6.0(debug@4.4.1) + version: 1.3.0(debug@4.3.5) '@playwright/test': specifier: ^1.53.1 - version: 1.54.1 + version: 1.55.0 '@types/node': specifier: ^20.2.5 - version: 20.19.7 + version: 20.14.11 ava: specifier: ^5.3.1 version: 5.3.1 debug: specifier: ^4.3.4 - version: 4.4.1 + version: 4.3.5 esbuild: specifier: ^0.25.0 - version: 0.25.6 + version: 0.25.0 shx: specifier: ^0.3.4 version: 0.3.4 typescript: specifier: ^5.5.4 - version: 5.8.3 + version: 5.5.4 vite: specifier: ^4.5.13 - version: 4.5.14(@types/node@20.19.7)(terser@5.43.1) + version: 4.5.13(@types/node@20.14.11)(terser@5.39.0) vite-plugin-static-copy: specifier: ^0.17.0 - version: 0.17.1(vite@4.5.14(@types/node@20.19.7)(terser@5.43.1)) + version: 0.17.1(vite@4.5.13(@types/node@20.14.11)(terser@5.39.0)) packages: @@ -61,140 +61,130 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + '@babel/core@7.24.9': + resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.27.0': + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + '@babel/helper-create-regexp-features-plugin@7.27.0': + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.4': + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -205,332 +195,392 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.0': - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/plugin-transform-async-generator-functions@7.26.8': + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-block-scoped-functions@7.26.5': + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.0': - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} + '@babel/plugin-transform-block-scoping@7.27.0': + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-exponentiation-operator@7.26.3': + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-for-of@7.26.9': + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + '@babel/plugin-transform-modules-commonjs@7.26.3': + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.0': - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.1': - resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regenerator@7.27.0': + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.26.8': + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.27.0': + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.0': - resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} + '@babel/preset-env@7.24.8': + resolution: {integrity: sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -544,27 +594,31 @@ packages: resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} '@ctrl/tinycolor@4.1.0': resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} engines: {node: '>=14'} - '@emnapi/wasi-threads@1.0.3': - resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==} + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -575,8 +629,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -587,8 +641,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -599,8 +653,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -611,8 +665,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -623,8 +677,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -635,8 +689,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -647,8 +701,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -659,8 +713,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -671,8 +725,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -683,8 +737,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -695,8 +749,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -707,8 +761,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -719,8 +773,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -731,8 +785,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -743,8 +797,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -755,14 +809,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -773,14 +827,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -791,26 +845,20 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -821,8 +869,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -833,8 +881,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -845,35 +893,35 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@floating-ui/core@1.7.2': - resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + '@floating-ui/core@1.6.4': + resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} - '@floating-ui/dom@1.7.2': - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + '@floating-ui/dom@1.6.7': + resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.4': + resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} - '@ipld/car@5.4.2': - resolution: {integrity: sha512-gfyrJvePyXnh2Fbj8mPg4JYvEZ3izhk8C9WgAle7xIYbrJNSXmNQ6BxAls8Gof97vvGbCROdxbTWRmHJtTCbcg==} + '@ipld/car@5.3.2': + resolution: {integrity: sha512-Bb4XrCFlnsCb9tTzZ1I8zo9O61D9qm7HfvuYrQ9gzdE8YhjyVIjrjmHmnoSWV/uCmyc2/bcqiDPIg+9WljXNzg==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-cbor@9.2.4': - resolution: {integrity: sha512-GbDWYl2fdJgkYtIJN0HY9oO0o50d1nB4EQb7uYWKUd2ztxCjxiEW3PjwGG0nqUpN1G4Cug6LX8NzbA7fKT+zfA==} + '@ipld/dag-cbor@9.2.1': + resolution: {integrity: sha512-nyY48yE7r3dnJVlxrdaimrbloh4RokQaNRdI//btfTkcTEZbpmSrbYcBQ4VKTf8ZxXAOUJy4VsRpkJo+y9RTnA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-json@10.2.5': - resolution: {integrity: sha512-Q4Fr3IBDEN8gkpgNefynJ4U/ZO5Kwr7WSUMBDbZx0c37t0+IwQCTM9yJh8l5L4SRFjm31MuHwniZ/kM+P7GQ3Q==} + '@ipld/dag-json@10.2.2': + resolution: {integrity: sha512-NnU8HdHKwAoGyrW3S09NMa8aZw0tImLRyR64hoafpLpDpAbA9g1+fb24JsdlugbL4sXUQVwDVA+qK4Ud8V83lA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@ipld/dag-pb@4.1.5': - resolution: {integrity: sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==} + '@ipld/dag-pb@4.1.2': + resolution: {integrity: sha512-BSztO4l3C+ya9HjCaQot26Y4AVsqIKtnn6+23ubc1usucnf6yoTBme18oCCdM6gKBMxuPqju5ye3lh9WEJsdeQ==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@ipld/unixfs@3.0.0': @@ -885,8 +933,8 @@ packages: '@itk-viewer/blosc-zarr@0.1.3': resolution: {integrity: sha512-O8REh/T8M99ADtE0Cr17FvhJtt++8MLP6giGcAaH35gbNqpMVJeg0gI2444HQplaJ4xicoeVrU5B0ja58+OfJA==} - '@itk-viewer/blosc-zarr@0.2.3': - resolution: {integrity: sha512-70CVcQurIEGDxM8nGkFQPtOoARywMIkE6NrBwt2SwsMocLBQ3KXW4/2+KGbqXymf34qrgdzifR7ezg0kWggBpw==} + '@itk-viewer/blosc-zarr@0.2.2': + resolution: {integrity: sha512-9bfG7DhttdNu7otCW4LJoOZO3WNOfVciP0F96JQfJlqyHFxnMwNn0jofcy8SpHOKqOu1nzMOYwdu/Lm7ZwuhoQ==} '@itk-viewer/element@0.3.0': resolution: {integrity: sha512-UUgrJ6k+tQphj+YJOMJLZUqnVSuZmzu7sYKNm3O2TE2e3Bjxp6duia5Qu2P+cLbtdF5kMN3mKckdVdy7FUUbqw==} @@ -899,20 +947,20 @@ packages: '@itk-viewer/io@0.1.8': resolution: {integrity: sha512-soewY9nbLq0Z8HK2U8mdfzNZtmRPZbxcmzl7HWYdpmCu1cn5pp2y3cZsARjKTnuzsXrRr0DzfV29cBiJg21H8A==} - '@itk-viewer/io@0.4.3': - resolution: {integrity: sha512-LKJdmQDTqLodY6CUn0ZSK/lHnwjmbfLGHZV/35er2m3tdX9wXPjIq3E2LNlUXDexJuj5rX/+rrPDKGyybC9gLw==} + '@itk-viewer/io@0.4.2': + resolution: {integrity: sha512-eT0o5rUeqb5uUIX0rN37GuPT2o+GZi4A72h1zhh2l43Y4PbKxE5ZgEIMJwUbSxOMPBJwoC7J9416cPzu29vP5w==} - '@itk-viewer/remote-viewport@0.2.21': - resolution: {integrity: sha512-4jUAtqSBw+p52KyQsZZ58mw1HPZ/nYXIsaGQt+B1e0R4mVC9KyCTdGROf7fyg20lJ/IypBiGPb6syub3MrS2Fg==} + '@itk-viewer/remote-viewport@0.2.19': + resolution: {integrity: sha512-4tBiWLkvVpX2+aGi8+cdEauqC+T7Chc0DYNsyiPYKbwKdwVEZCAp1iyGV80DPEJ5Nt9IFUDV6WOS/W/fG1wsEw==} - '@itk-viewer/utils@0.1.4': - resolution: {integrity: sha512-4q7d4nQWPa+CBAr1smlQ2i5qNkGOn10iIPrwwLvmgqDR+9Krwdv4HXHenJayYqA9WFNfRgGVqU9z5/y4UEqP/A==} + '@itk-viewer/utils@0.1.3': + resolution: {integrity: sha512-2liw+6wvTRI/eDqPAwVmi+lPT6vj9YiAMt2qdEirc4b6Lg4WpYdsExgaYVgYM9hJpH71xo2DkIlAn7ns2pPF9A==} '@itk-viewer/viewer@0.3.0': resolution: {integrity: sha512-gp9yIhk4o/QbRh/Ni1PXs2xabRtVB/4cpgWpkvHz9gXN+lJn8gvhaB9pXs5HOolgReiZlFcouciMhSz4j6Rntw==} - '@itk-viewer/viewer@0.6.2': - resolution: {integrity: sha512-lS5l3+Wr9ZLeFKt9BxGJSjB0ja3BW/fnu5k3M85FVmGwG7mMkDfw4HdFeWQg3iRBmL9J3IyIJHW2BwMThXQ6Og==} + '@itk-viewer/viewer@0.6.0': + resolution: {integrity: sha512-DaeQZYRD02Nd8qtXPbf/zIBo8obDJ4sNKQfusQ9Y2HKA5iqHL/EA4y3zx/l1pogVfQ9A4FaKtv/MF56/OOXMoQ==} '@itk-viewer/vtkjs@0.1.0': resolution: {integrity: sha512-tkJKiS4182bTPVLl/ECTqSztojUB3xNMP7QOzIFpvmdHdMtjNNXJaINfsPYc6kilsNhInL34bszQRz7QcPHJoA==} @@ -927,24 +975,29 @@ packages: '@itk-wasm/htj2k@2.1.0': resolution: {integrity: sha512-22+mWgXr/LYRCqzzfIJ5il5bgYdJjPD5jiP4XXPvSgCjp48bui5zvZSkvMmXy89bJbVinUB1O6KHuB3K0MUong==} - '@itk-wasm/image-io@1.6.0': - resolution: {integrity: sha512-cx+lHpTc3tmkfKMOMpuwGfQyhsYmac09NoOjeo5bOW45pp040boQiPow8Q/GQmjHUfI9c+H7SqeJCfKVS5SPRw==} + '@itk-wasm/image-io@1.3.0': + resolution: {integrity: sha512-EacjXsMi7sqgyvRetWvX+JHMXlzd00832LQcKlyn+rPs02hdAhjkcxPtIhmtrMLUUgYpuNRoin9aLDGEMNFmog==} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@kitware/vtk.js@30.10.0': resolution: {integrity: sha512-lkJ0S+2UssyrAkr1gx9aJgvJZIGgtVl4OnHTGrA6WnVb2Iep54Nyoa4D5bpmEZjU2019uu/45BOUh43mWV4dbQ==} @@ -954,33 +1007,36 @@ packages: autoprefixer: ^10.4.7 wslink: '>=1.1.0 || ^2.0.0' - '@lit-labs/ssr-dom-shim@1.4.0': - resolution: {integrity: sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==} + '@lit-labs/ssr-dom-shim@1.2.0': + resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} - '@lit/context@1.1.6': - resolution: {integrity: sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==} + '@lit/context@1.1.2': + resolution: {integrity: sha512-S0nw2C6Tkm7fVX5TGYqeROGD+Z9Coa2iFpW+ysYBDH3YvCqOY3wVQvSgwbaliLJkjTnSEYCBe9qFqKV8WUFpVw==} - '@lit/react@1.0.8': - resolution: {integrity: sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==} + '@lit/react@1.0.5': + resolution: {integrity: sha512-RSHhrcuSMa4vzhqiTenzXvtQ6QDq3hSPsnHHO3jaPmmvVFeoNNm4DHoQ0zLdKAUvY3wP3tTENSUf7xpyVfrDEA==} peerDependencies: - '@types/react': 17 || 18 || 19 + '@types/react': 17 || 18 - '@lit/reactive-element@2.1.1': - resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} + '@lit/reactive-element@2.0.4': + resolution: {integrity: sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==} '@msgpack/msgpack@2.8.0': resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} engines: {node: '>= 10'} - '@multiformats/blake2@2.0.2': - resolution: {integrity: sha512-AOWu6Tyuk5UoT5m4faB6ntVnPB8EmuD6rn18s4cCgHNEGgsamT8GdvjP9DYjzFHQVaP/0L3CaKqWQqJlXx9ecw==} + '@multiformats/blake2@1.0.13': + resolution: {integrity: sha512-T1Kzya0wjj85CaVeRSpJ858EnSvW1pw94GSitxYf84VsNdv5XYbJ6QG8y26Ft1bVALzrUCmqkQrR53QHSyu6RA==} + + '@multiformats/murmur3@1.1.3': + resolution: {integrity: sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw==} '@multiformats/murmur3@2.1.8': resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} engines: {node: '>=16.0.0', npm: '>=7.0.0'} - '@multiformats/sha3@3.0.2': - resolution: {integrity: sha512-fBxODTXa1sOWYB9q6GSFe2HYSVwMEdnPa7c7FgNhr/rMFQ2HGtwmRppTm317HSpGSTUkoTvyKQDNcteJEGU+bg==} + '@multiformats/sha3@2.0.17': + resolution: {integrity: sha512-7ik6pk178qLO2cpNucgf48UnAOBMkq/2H92DP4SprZOJqM9zqbVaKS7XyYW6UvhRsDJ3wi921fYv1ihTtQHLtA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1013,8 +1069,8 @@ packages: '@perma/map@1.0.3': resolution: {integrity: sha512-Bf5njk0fnJGTFE2ETntq0N1oJ6YdCPIpTDn3R3KYZJQdeYSOCNL7mBrFlGnbqav8YQhJA/p81pvHINX9vAtHkQ==} - '@playwright/test@1.54.1': - resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} + '@playwright/test@1.55.0': + resolution: {integrity: sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==} engines: {node: '>=18'} hasBin: true @@ -1048,14 +1104,14 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@shoelace-style/animations@1.2.0': - resolution: {integrity: sha512-avvo1xxkLbv2dgtabdewBbqcJfV0e0zCwFqkPMnHFGbJbBHorRFfMAHh1NG9ymmXn0jW95ibUVH03E1NYXD6Gw==} + '@shoelace-style/animations@1.1.0': + resolution: {integrity: sha512-Be+cahtZyI2dPKRm8EZSx3YJQ+jLvEcn3xzRP7tM4tqBnvd/eW/64Xh0iOf0t2w5P8iJKfdBbpVNE9naCaOf2g==} '@shoelace-style/localize@3.2.1': resolution: {integrity: sha512-r4C9C/5kSfMBIr0D9imvpRdCNXtUNgyYThc4YlS6K5Hchv1UyxNQ9mxwj+BTRH2i1Neits260sR3OjKMnplsFA==} - '@shoelace-style/shoelace@2.20.1': - resolution: {integrity: sha512-FSghU95jZPGbwr/mybVvk66qRZYpx5FkXL+vLNpy1Vp8UsdwSxXjIHE3fsvMbKWTKi9UFfewHTkc5e7jAqRYoQ==} + '@shoelace-style/shoelace@2.15.1': + resolution: {integrity: sha512-3ecUw8gRwOtcZQ8kWWkjk4FTfObYQ/XIl3aRhxprESoOYV1cYhloYPsmQY38UoL3+pwJiZb5+LzX0l3u3Zl0GA==} engines: {node: '>=14.17.0'} '@socket.io/component-emitter@3.1.2': @@ -1064,8 +1120,8 @@ packages: '@thewtex/zstddec@0.2.1': resolution: {integrity: sha512-1yTu7m/qU1nsJy4mCZAB3GAhczsClhw+WIXK0oe598eHcvefH16WLOYN4Uko7K2/Ttz9KEBvvT7WFrZD41ShgA==} - '@types/emscripten@1.40.1': - resolution: {integrity: sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==} + '@types/emscripten@1.39.13': + resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1073,26 +1129,32 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@20.19.7': - resolution: {integrity: sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA==} + '@types/node@20.14.11': + resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + + '@types/node@20.17.30': + resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} - '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/webxr@0.5.22': - resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} + '@types/webxr@0.5.19': + resolution: {integrity: sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==} - '@web3-storage/car-block-validator@1.2.2': - resolution: {integrity: sha512-lR9l+ZszhTid5HfZE8ohnGf2RJp2kaBOnoejmsACs3iTNiy+3K09dnPm8MhgBE9RCIgPBKM0CCWXO9l+I6jrKA==} + '@web3-storage/car-block-validator@1.2.0': + resolution: {integrity: sha512-KKQ/M5WtpH/JlkX+bQYKzdG4azmSF495T7vpewje2xh7MBh1d94/BLblxCcLM/larWvXDxOkbAyTTdlECAAuUw==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -1145,21 +1207,22 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abort-error@1.0.1: - resolution: {integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==} - - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: - acorn: ^8.14.0 + acorn: ^8 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} + hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1198,8 +1261,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} ansi-styles@4.3.0: @@ -1232,8 +1295,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -1249,25 +1312,24 @@ packages: '@ava/typescript': optional: true - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - axios@1.10.0: - resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.13: + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.4: + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1293,18 +1355,18 @@ packages: blueimp-md5@2.19.0: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1330,31 +1392,23 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - callsites@4.2.0: resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} engines: {node: '>=12.20'} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001713: + resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} - cborg@4.2.12: - resolution: {integrity: sha512-z126yLoavS75cdTuiKu61RC3Y3trqtDAgQRa5Q0dpHn1RmqhIedptWXKnk0lQ5yo/GmcV9myvIkzFgZ8GnqSog==} + cborg@4.2.3: + resolution: {integrity: sha512-XBFbEJ6WMfn9L7woc2t+EzOxF8vGqddoopKBbrhIvZBt2WIUgSlT8xLmM6Aq1xv8eWt4yOSjwxWjYeuHU3CpJA==} hasBin: true - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chokidar@3.6.0: @@ -1410,8 +1464,8 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comlink@4.4.2: - resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + comlink@4.4.1: + resolution: {integrity: sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==} commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} @@ -1431,10 +1485,8 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - composed-offset-position@0.0.6: - resolution: {integrity: sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==} - peerDependencies: - '@floating-ui/utils': ^0.2.5 + composed-offset-position@0.0.4: + resolution: {integrity: sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1450,8 +1502,8 @@ packages: resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - core-js-compat@3.44.0: - resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + core-js-compat@3.41.0: + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1495,8 +1547,8 @@ packages: resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} engines: {node: '>=6'} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1504,8 +1556,8 @@ packages: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1556,11 +1608,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.183: - resolution: {integrity: sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==} + electron-to-chromium@1.5.136: + resolution: {integrity: sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==} - emittery@1.2.0: - resolution: {integrity: sha512-KxdRyyFcS85pH3dnU8Y5yFUm2YJdaHwcBZWrfG8o89ZY9a13/f9itbN+YG3ELbBo9Pg5zvIozstmuV8bX13q6g==} + emittery@1.0.3: + resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} engines: {node: '>=14.16'} emoji-regex@8.0.0: @@ -1573,20 +1625,23 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - engine.io-client@6.6.3: - resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} + err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1595,8 +1650,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -1611,11 +1666,15 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} hasBin: true + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1666,8 +1725,8 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1676,8 +1735,8 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -1701,8 +1760,8 @@ packages: resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} engines: {node: '>=4'} - files-from-path@1.1.4: - resolution: {integrity: sha512-huzBO8vS15VrEC0ej62GtYCtPUNEsTdHIN3aFBjCUZyFQTr+bW4cpwvPMZssM/r+9/hOh4ikUiJ3L+9kZKBMag==} + files-from-path@1.0.4: + resolution: {integrity: sha512-sMNIVdpRh1uCSIaat3qnM3E6aA1C5FVn5/B16z8sN3gIMjZPkxtVCorkEL07xTcCIxVwTXzjU1Ota7Wif6RfQQ==} engines: {node: '>=18'} fill-range@7.1.1: @@ -1713,8 +1772,8 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1722,12 +1781,12 @@ packages: debug: optional: true - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} - form-data@4.0.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} fraction.js@4.3.7: @@ -1736,8 +1795,8 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} fs-minipass@2.1.0: @@ -1799,6 +1858,10 @@ packages: engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -1843,12 +1906,12 @@ packages: resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} engines: {node: '>=10 <11 || >=12 <13 || >=14'} - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - imjoy-rpc@0.5.59: - resolution: {integrity: sha512-6eM7MG+A49K7n3rL+F8dQxCZP7YsH3ufNbtJr+EioeSUxHmHTFj1AGtSa/tO895MASXKfqHv1zWAUwr4j/q/2w==} + imjoy-rpc@0.5.57: + resolution: {integrity: sha512-RYcplCBxu+pjrnGTCI0F/nvCtKlgHVpjGXQWZzvOXBDO/9Fl08FVNdn3BEbeWwyKtHFfZ9R3vxZUnL3rxTT0jQ==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -1865,11 +1928,11 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - interface-blockstore@5.3.2: - resolution: {integrity: sha512-oA9Pjkxun/JHAsZrYEyKX+EoPjLciTzidE7wipLc/3YoHDjzsnXRJzAzFJXNUvogtY4g7hIwxArx8+WKJs2RIg==} + interface-blockstore@5.2.10: + resolution: {integrity: sha512-9K48hTvBCGsKVD3pF4ILgDcf+W2P/gq0oxLcsHGB6E6W6nDutYkzR+7k7bCs9REHrBEfKzcVDEKieiuNM9WRZg==} - interface-store@6.0.3: - resolution: {integrity: sha512-+WvfEZnFUhRwFxgz+QCQi7UC6o9AM0EHM9bpIe2Nhqb100NHCsTvNAn4eJgvgV2/tmLo1MP9nGxQKEcZTAueLA==} + interface-store@5.1.8: + resolution: {integrity: sha512-7na81Uxkl0vqk0CBPO5PvyTkdaJBaezwUJGsMOz7riPOq0rJt+7W31iaopaMICWea/iykUsvNlPx/Tc+MxC3/w==} internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} @@ -1884,11 +1947,11 @@ packages: engines: {node: '>=18'} hasBin: true - ipfs-unixfs-exporter@13.6.6: - resolution: {integrity: sha512-i/U1gU8AIFuuJH4y06SjtpFpFAhBixrMkvZJsurrGregSkoSroBxsxJZDMb64p2TenN+m5397oznINEbOzPQZA==} + ipfs-unixfs-exporter@13.5.0: + resolution: {integrity: sha512-s1eWXzoyhQFNEAB1p+QE3adjhW+lBdgpORmmjiCLiruHs5z7T5zsAgRVcWpM8LWYhq2flRtJHObb7Hg73J+oLQ==} - ipfs-unixfs@11.2.5: - resolution: {integrity: sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==} + ipfs-unixfs@11.1.4: + resolution: {integrity: sha512-RE4nyx5qgG2w7JOLj0Y0D7SfAR1ZkEdramNaBx0OSD4DlQ2Y2NORgc4FHfej3Pgy31v+QISDVP1pQJhdv3bUUg==} irregular-plurals@3.5.0: resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} @@ -1898,8 +1961,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} is-core-module@2.16.1: @@ -1943,10 +2006,6 @@ packages: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -1954,26 +2013,23 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + it-filter@3.1.1: + resolution: {integrity: sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==} - it-filter@3.1.4: - resolution: {integrity: sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==} + it-last@3.0.6: + resolution: {integrity: sha512-M4/get95O85u2vWvWQinF8SJUc/RPC5bWTveBTYXvlP2q5TF9Y+QhT3nz+CRCyS2YEc66VJkyl/da6WrJ0wKhw==} - it-last@3.0.9: - resolution: {integrity: sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w==} + it-map@3.1.1: + resolution: {integrity: sha512-9bCSwKD1yN1wCOgJ9UOl+46NQtdatosPWzxxUk2NdTLwRPXLh+L7iwCC9QKsbgM60RQxT/nH8bKMqm3H/o8IHQ==} - it-map@3.1.4: - resolution: {integrity: sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==} + it-merge@3.0.5: + resolution: {integrity: sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==} - it-merge@3.0.12: - resolution: {integrity: sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==} + it-parallel@3.0.8: + resolution: {integrity: sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==} - it-parallel@3.0.13: - resolution: {integrity: sha512-85PPJ/O8q97Vj9wmDTSBBXEkattwfQGruXitIzrh0RLPso6RHfiVqkuTqBNufYYtB1x6PSkh0cwvjmMIkFEPHA==} - - it-peekable@3.0.8: - resolution: {integrity: sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==} + it-peekable@3.0.5: + resolution: {integrity: sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==} it-pipe@3.0.1: resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} @@ -1982,26 +2038,24 @@ packages: it-pushable@3.2.3: resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} - it-queueless-pushable@2.0.2: - resolution: {integrity: sha512-2BqIt7XvDdgEgudLAdJkdseAwbVSBc0yAd8yPVHrll4eBuJPWIj9+8C3OIxzEKwhswLtd3bi+yLrzgw9gCyxMA==} - - it-stream-types@2.0.2: - resolution: {integrity: sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==} + it-stream-types@2.0.1: + resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} itk-wasm@1.0.0-b.160: resolution: {integrity: sha512-yrt0uRukqI9Q5s9HhzArxMNYvyU5CMbI1ddGzH0A4O3JWscnJug7J0RtY+RTl6nTHcqdrppNH7IRbnTXLZ79Rg==} hasBin: true - itk-wasm@1.0.0-b.192: - resolution: {integrity: sha512-Sr7oo5dWqBz0CScQYN5LxmF/8e1JXUP6kRlyHk0kMmw3tpROSvLrOZo0IQXIjf9QeX3UnhUEXU1TGY4KWzWm0Q==} + itk-wasm@1.0.0-b.196: + resolution: {integrity: sha512-LJoGEFQLgE2lKERTEOq9XFtMTnPUwR0TBWxTA/hI1QPqvXfVNHQGv+vzHTrRCq2GAM+vtWZuVt/XecTBBkN6Hg==} hasBin: true jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - js-sha3@0.9.3: - resolution: {integrity: sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==} + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} @@ -2049,14 +2103,14 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - lit-element@4.2.1: - resolution: {integrity: sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==} + lit-element@4.0.6: + resolution: {integrity: sha512-U4sdJ3CSQip7sLGZ/uJskO5hGiqtlpxndsLr6mt3IQIjheg93UKYeGQjWMRql1s/cXNOaRrCzC2FQwjIwSUqkg==} - lit-html@3.3.1: - resolution: {integrity: sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==} + lit-html@3.1.4: + resolution: {integrity: sha512-yKKO2uVv7zYFHlWMfZmqc+4hkmSbFp8jgjdZY9vvR9jr4J8fH6FUMXhr+ljfELgmjpvlF7Z1SJ5n5/Jeqtc9YA==} - lit@3.3.1: - resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + lit@3.1.4: + resolution: {integrity: sha512-q6qKnKXHy2g1kjBaNfcoLlgbI3+aSOZ9Q4tiGa9bGYXq5RBXxkVTqTIVmP2VWMp29L4GyvCFm8ZQ2o56eUAMyA==} load-json-file@7.0.1: resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} @@ -2084,8 +2138,8 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - long@5.3.2: - resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2098,8 +2152,8 @@ packages: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} matcher@5.0.0: resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} @@ -2124,8 +2178,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -2171,11 +2225,17 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multiformats@13.3.7: - resolution: {integrity: sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ==} + multiformats@13.1.3: + resolution: {integrity: sha512-CZPi9lFZCM/+7oRolWYsvalsyWQGFo+GpdaTmjxXXomC+nP/W1Rnxb9sUgjvmNmRZ5bOPqRAl4nuK+Ydw/4tGw==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} murmurhash3js-revisited@3.0.0: resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} @@ -2239,16 +2299,16 @@ packages: resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} engines: {node: '>=12'} - p-queue@8.1.0: - resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} + p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} engines: {node: '>=18'} p-timeout@5.1.0: resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} engines: {node: '>=12'} - p-timeout@6.1.4: - resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} engines: {node: '>=14.16'} parse-ms@3.0.0: @@ -2273,6 +2333,9 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2300,13 +2363,13 @@ packages: resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - playwright-core@1.54.1: - resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} + playwright-core@1.55.0: + resolution: {integrity: sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==} engines: {node: '>=18'} hasBin: true - playwright@1.54.1: - resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} + playwright@1.55.0: + resolution: {integrity: sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==} engines: {node: '>=18'} hasBin: true @@ -2314,15 +2377,11 @@ packages: resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} pretty-ms@8.0.0: @@ -2335,12 +2394,12 @@ packages: progress-events@1.0.1: resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} - protobufjs@7.5.3: - resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + protobufjs@7.3.2: + resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} engines: {node: '>=12.0.0'} - protons-runtime@5.6.0: - resolution: {integrity: sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==} + protons-runtime@5.4.0: + resolution: {integrity: sha512-XfA++W/WlQOSyjUyuF5lgYBfXZUEMP01Oh1C2dSwZAlF2e/ZrMRPfWonXj6BGM+o8Xciv7w0tsRMKYwYEuQvaw==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -2358,9 +2417,6 @@ packages: rabin-rs@2.1.0: resolution: {integrity: sha512-5y72gAXPzIBsAMHcpxZP8eMDuDT98qMP1BqSDHRbHkJJXEgWIN1lA47LxUqzsK6jknOJtgfkQr9v+7qMlFDm6g==} - race-signal@1.1.3: - resolution: {integrity: sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -2389,6 +2445,9 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regexpu-core@6.2.0: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} @@ -2421,8 +2480,12 @@ packages: engines: {node: '>= 0.4'} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rollup@3.29.5: @@ -2447,8 +2510,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} engines: {node: '>= 10.13.0'} seedrandom@3.0.5: @@ -2462,8 +2525,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2474,10 +2537,6 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - shader-loader@1.3.1: resolution: {integrity: sha512-dt8F9K0x4rjmaFyHh7rNDfpt4LUiR64zhNIEwp2WbE99B3z4ALuvvmhftkElg93dUD6sTmv/aXa/z9SJiEddcA==} @@ -2503,8 +2562,8 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} engines: {node: '>=10.0.0'} socket.io-parser@4.2.4: @@ -2549,9 +2608,6 @@ packages: string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2575,8 +2631,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} tar-stream@1.6.2: @@ -2607,8 +2663,8 @@ packages: uglify-js: optional: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} hasBin: true @@ -2619,27 +2675,22 @@ packages: resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} engines: {node: '>=4'} - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} - engines: {node: '>= 0.4'} + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -2649,14 +2700,20 @@ packages: uint8arraylist@2.4.8: resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} + uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + uint8arrays@5.1.0: resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -2699,8 +2756,8 @@ packages: peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - vite@4.5.14: - resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + vite@4.5.13: + resolution: {integrity: sha512-Hgp8IF/yZDzKsN1hQWOuQZbrKiaFsbQud+07jJ8h9m9PaHWkpvZ5u55Xw5yYjWRXwRQ4jwFlJvY7T7FUJG9MCA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -2727,19 +2784,19 @@ packages: terser: optional: true - wasm-feature-detect@1.8.0: - resolution: {integrity: sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==} + wasm-feature-detect@1.6.2: + resolution: {integrity: sha512-4dnaZ+Fq/q+BbMlTIfaNS851i+0zmHzui++NUZdskESRu3xwB6g6x2FnGvBdWtpijqO5yuj1l+EUTJGc4S4DKg==} - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.100.1: - resolution: {integrity: sha512-YJB/ESPUe2Locd0NKXmw72Dx8fZQk1gTzI6rc9TAT4+Sypbnhl8jd8RywB1bDsDF9Dy1RUR7gn3q/ZJTd0OZZg==} + webpack@5.93.0: + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -2755,10 +2812,6 @@ packages: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - worker-loader@3.0.8: resolution: {integrity: sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==} engines: {node: '>= 10.13.0'} @@ -2788,15 +2841,15 @@ packages: utf-8-validate: optional: true - wslink@2.3.4: - resolution: {integrity: sha512-O+tbdQDFdGnbmgZJUkugxF+cXD6FPoWbIm9EETWib0UHTJHD71HcmBfDJWTh2RRAd7MjaKQStykVgsJYyihXlQ==} + wslink@2.1.1: + resolution: {integrity: sha512-vy31Rqo4gQk8pKpm5ltL1i67qoYnH/HGmCyw15lDYzWaB7btqttsl5qQQZQVAP8arJ0ZXJQkrFwzeSNu+yHPpA==} xmlbuilder2@3.0.2: resolution: {integrity: sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==} engines: {node: '>=12.0'} - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} xstate-lit@2.0.5: @@ -2806,9 +2859,6 @@ packages: lit: ^3.1.0 xstate: ^5.4.1 - xstate@5.17.1: - resolution: {integrity: sha512-RNwcXdth+kboWZg+Zhf6f6iNP6CtAAiS4z4qwyTd/fWBH9PHXRqko6OdW3xOTwP62f0mVD+jsPOSqY4Ar8nZKQ==} - xstate@5.5.2: resolution: {integrity: sha512-RLf9wc5HDO0pvj2TQQ+lY6tDW8CU8Entfgmtzzo6NhkC8qOEBXSN6WUSvnUM7NHZgdih06+by1b4nbaHVu1c+g==} @@ -2837,900 +2887,954 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/compat-data@7.26.8': {} - '@babel/core@7.28.0': + '@babel/core@7.24.9': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.9) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.0': + '@babel/generator@7.27.0': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.27.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.27.0': dependencies: - '@babel/compat-data': 7.28.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.24.9) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.27.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/core': 7.24.9 + '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1 + '@babel/core': 7.24.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0 lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.27.0 - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + '@babel/helper-replace-supers@7.26.5(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-wrap-function@7.27.1': + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.6': + '@babel/helpers@7.27.0': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 - '@babel/parser@7.28.0': + '@babel/parser@7.27.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.27.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.24.9) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.24.9 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.24.9) + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.24.9) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 7.24.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.24.9) + '@babel/traverse': 7.27.0 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/template': 7.27.0 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/core': 7.24.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.24.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.24.9) - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.24.9) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.0)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.24.9)': + dependencies: + '@babel/core': 7.24.9 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/preset-env@7.24.8(@babel/core@7.24.9)': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/core': 7.24.9 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.24.9) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.24.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.9) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.24.9) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.24.9) + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.24.9) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.24.9) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.24.9) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.24.9) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.24.9) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.24.9) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.24.9) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.24.9) + '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.24.9) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.24.9) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.24.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.9) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.24.9) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.24.9) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.24.9) + core-js-compat: 3.41.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.9)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.1 + '@babel/core': 7.24.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.27.0 esutils: 2.0.3 '@babel/runtime@7.22.11': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.27.2': + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 - '@babel/traverse@7.28.0': + '@babel/traverse@7.27.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - debug: 4.4.1 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.28.1': + '@babel/types@7.27.0': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@ctrl/tinycolor@4.1.0': {} - '@emnapi/wasi-threads@1.0.3': + '@emnapi/wasi-threads@1.0.1': dependencies: - tslib: 2.8.1 + tslib: 2.6.3 - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.0': optional: true '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.0': optional: true '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.0': optional: true '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.0': optional: true '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.0': optional: true '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.0': optional: true '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.0': optional: true '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.0': optional: true '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.0': optional: true '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.0': optional: true '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.0': optional: true '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.0': optional: true '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.0': optional: true '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.0': optional: true '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.0': optional: true '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.0': optional: true '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.0': optional: true '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.0': optional: true '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.25.6': - optional: true - - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openbsd-x64@0.25.0': optional: true '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.0': optional: true '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.0': optional: true '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.0': optional: true '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.0': optional: true - '@floating-ui/core@1.7.2': + '@floating-ui/core@1.6.4': dependencies: - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.4 - '@floating-ui/dom@1.7.2': + '@floating-ui/dom@1.6.7': dependencies: - '@floating-ui/core': 1.7.2 - '@floating-ui/utils': 0.2.10 + '@floating-ui/core': 1.6.4 + '@floating-ui/utils': 0.2.4 - '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.4': {} - '@ipld/car@5.4.2': + '@ipld/car@5.3.2': dependencies: - '@ipld/dag-cbor': 9.2.4 - cborg: 4.2.12 - multiformats: 13.3.7 + '@ipld/dag-cbor': 9.2.1 + cborg: 4.2.3 + multiformats: 13.1.3 varint: 6.0.0 - '@ipld/dag-cbor@9.2.4': + '@ipld/dag-cbor@9.2.1': dependencies: - cborg: 4.2.12 - multiformats: 13.3.7 + cborg: 4.2.3 + multiformats: 13.1.3 - '@ipld/dag-json@10.2.5': + '@ipld/dag-json@10.2.2': dependencies: - cborg: 4.2.12 - multiformats: 13.3.7 + cborg: 4.2.3 + multiformats: 13.1.3 - '@ipld/dag-pb@4.1.5': + '@ipld/dag-pb@4.1.2': dependencies: - multiformats: 13.3.7 + multiformats: 13.1.3 '@ipld/unixfs@3.0.0': dependencies: - '@ipld/dag-pb': 4.1.5 + '@ipld/dag-pb': 4.1.2 '@multiformats/murmur3': 2.1.8 '@perma/map': 1.0.3 actor: 2.3.1 - multiformats: 13.3.7 - protobufjs: 7.5.3 + multiformats: 13.1.3 + protobufjs: 7.3.2 rabin-rs: 2.1.0 '@itk-viewer/arcball@0.0.1': dependencies: gl-matrix: 3.4.3 - '@itk-viewer/blosc-zarr@0.1.3(debug@4.4.1)': + '@itk-viewer/blosc-zarr@0.1.3(debug@4.3.5)': dependencies: - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - itk-wasm: 1.0.0-b.160(debug@4.4.1) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + itk-wasm: 1.0.0-b.160(debug@4.3.5) transitivePeerDependencies: - debug - '@itk-viewer/blosc-zarr@0.2.3(debug@4.4.1)': + '@itk-viewer/blosc-zarr@0.2.2(debug@4.3.5)': dependencies: - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - itk-wasm: 1.0.0-b.160(debug@4.4.1) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + itk-wasm: 1.0.0-b.160(debug@4.3.5) transitivePeerDependencies: - debug - '@itk-viewer/element@0.3.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4)': + '@itk-viewer/element@0.3.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1)': dependencies: '@itk-viewer/arcball': 0.0.1 - '@itk-viewer/io': 0.1.8(debug@4.4.1) - '@itk-viewer/remote-viewport': 0.2.21(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - '@itk-viewer/viewer': 0.3.0(debug@4.4.1) - '@itk-viewer/vtkjs': 0.1.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4) - '@lit/context': 1.1.6 + '@itk-viewer/io': 0.1.8(debug@4.3.5) + '@itk-viewer/remote-viewport': 0.2.19(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + '@itk-viewer/viewer': 0.3.0(debug@4.3.5) + '@itk-viewer/vtkjs': 0.1.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1) + '@lit/context': 1.1.2 gl-matrix: 3.4.3 - itk-wasm: 1.0.0-b.160(debug@4.4.1) - lit: 3.3.1 + itk-wasm: 1.0.0-b.160(debug@4.3.5) + lit: 3.1.4 xstate: 5.5.2 - xstate-lit: 2.0.5(@lit/context@1.1.6)(lit@3.3.1)(xstate@5.5.2) + xstate-lit: 2.0.5(@lit/context@1.1.2)(lit@3.1.4)(xstate@5.5.2) transitivePeerDependencies: - '@babel/preset-env' - autoprefixer @@ -3741,76 +3845,76 @@ snapshots: - webpack - wslink - '@itk-viewer/io@0.1.8(debug@4.4.1)': + '@itk-viewer/io@0.1.8(debug@4.3.5)': dependencies: - '@itk-viewer/blosc-zarr': 0.1.3(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - axios: 1.10.0(debug@4.4.1) - comlink: 4.4.2 + '@itk-viewer/blosc-zarr': 0.1.3(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + axios: 1.7.2(debug@4.3.5) + comlink: 4.4.1 gl-matrix: 3.4.3 - itk-wasm: 1.0.0-b.160(debug@4.4.1) - p-queue: 8.1.0 - zod: 3.25.76 + itk-wasm: 1.0.0-b.160(debug@4.3.5) + p-queue: 8.0.1 + zod: 3.23.8 transitivePeerDependencies: - debug - '@itk-viewer/io@0.4.3(debug@4.4.1)': + '@itk-viewer/io@0.4.2(debug@4.3.5)': dependencies: - '@itk-viewer/blosc-zarr': 0.2.3(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - axios: 1.10.0(debug@4.4.1) - comlink: 4.4.2 + '@itk-viewer/blosc-zarr': 0.2.2(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + axios: 1.11.0(debug@4.3.5) + comlink: 4.4.1 gl-matrix: 3.4.3 - itk-wasm: 1.0.0-b.160(debug@4.4.1) - p-queue: 8.1.0 - zod: 3.25.76 + itk-wasm: 1.0.0-b.160(debug@4.3.5) + p-queue: 8.0.1 + zod: 3.23.8 transitivePeerDependencies: - debug - '@itk-viewer/remote-viewport@0.2.21(debug@4.4.1)': + '@itk-viewer/remote-viewport@0.2.19(debug@4.3.5)': dependencies: - '@itk-viewer/io': 0.4.3(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) - '@itk-viewer/viewer': 0.6.2(debug@4.4.1) - '@itk-wasm/htj2k': 2.1.0(debug@4.4.1) + '@itk-viewer/io': 0.4.2(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) + '@itk-viewer/viewer': 0.6.0(debug@4.3.5) + '@itk-wasm/htj2k': 2.1.0(debug@4.3.5) gl-matrix: 3.4.3 - imjoy-rpc: 0.5.59 - xstate: 5.17.1 + imjoy-rpc: 0.5.57 + xstate: 5.5.2 transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - '@itk-viewer/utils@0.1.4(debug@4.4.1)': + '@itk-viewer/utils@0.1.3(debug@4.3.5)': dependencies: - itk-wasm: 1.0.0-b.160(debug@4.4.1) + itk-wasm: 1.0.0-b.160(debug@4.3.5) transitivePeerDependencies: - debug - '@itk-viewer/viewer@0.3.0(debug@4.4.1)': + '@itk-viewer/viewer@0.3.0(debug@4.3.5)': dependencies: - '@itk-viewer/io': 0.1.8(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) + '@itk-viewer/io': 0.1.8(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) gl-matrix: 3.4.3 xstate: 5.5.2 transitivePeerDependencies: - debug - '@itk-viewer/viewer@0.6.2(debug@4.4.1)': + '@itk-viewer/viewer@0.6.0(debug@4.3.5)': dependencies: - '@itk-viewer/io': 0.4.3(debug@4.4.1) - '@itk-viewer/utils': 0.1.4(debug@4.4.1) + '@itk-viewer/io': 0.4.2(debug@4.3.5) + '@itk-viewer/utils': 0.1.3(debug@4.3.5) gl-matrix: 3.4.3 - xstate: 5.17.1 + xstate: 5.5.2 transitivePeerDependencies: - debug - '@itk-viewer/vtkjs@0.1.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4)': + '@itk-viewer/vtkjs@0.1.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1)': dependencies: - '@itk-viewer/io': 0.1.8(debug@4.4.1) - '@itk-viewer/viewer': 0.3.0(debug@4.4.1) - '@kitware/vtk.js': 30.10.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4) + '@itk-viewer/io': 0.1.8(debug@4.3.5) + '@itk-viewer/viewer': 0.3.0(debug@4.3.5) + '@kitware/vtk.js': 30.10.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1) gl-matrix: 3.4.3 xstate: 5.5.2 transitivePeerDependencies: @@ -3820,27 +3924,26 @@ snapshots: - webpack - wslink - '@itk-wasm/dam@1.1.1(debug@4.4.1)': + '@itk-wasm/dam@1.1.1(debug@4.3.5)': dependencies: - axios: 1.10.0(debug@4.4.1) + axios: 1.7.2(debug@4.3.5) commander: 10.0.1 decompress: 4.2.1 - files-from-path: 1.1.4 + files-from-path: 1.0.4 ipfs-car: 1.2.0 tar: 6.2.1 transitivePeerDependencies: - debug - '@itk-wasm/demo-app@0.2.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(@floating-ui/utils@0.2.10)(@types/react@19.1.8)(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4)': + '@itk-wasm/demo-app@0.2.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(@types/react@18.3.3)(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1)': dependencies: - '@itk-viewer/element': 0.3.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(debug@4.4.1)(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4) - '@itk-viewer/io': 0.1.8(debug@4.4.1) - '@shoelace-style/shoelace': 2.20.1(@floating-ui/utils@0.2.10)(@types/react@19.1.8) - itk-wasm: 1.0.0-b.192(debug@4.4.1) - lit: 3.3.1 + '@itk-viewer/element': 0.3.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(debug@4.3.5)(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1) + '@itk-viewer/io': 0.1.8(debug@4.3.5) + '@shoelace-style/shoelace': 2.15.1(@types/react@18.3.3) + itk-wasm: 1.0.0-b.196(debug@4.3.5) + lit: 3.1.4 transitivePeerDependencies: - '@babel/preset-env' - - '@floating-ui/utils' - '@material/web' - '@types/react' - autoprefixer @@ -3851,45 +3954,48 @@ snapshots: - webpack - wslink - '@itk-wasm/htj2k@2.1.0(debug@4.4.1)': + '@itk-wasm/htj2k@2.1.0(debug@4.3.5)': dependencies: - itk-wasm: 1.0.0-b.192(debug@4.4.1) + itk-wasm: 1.0.0-b.196(debug@4.3.5) transitivePeerDependencies: - debug - '@itk-wasm/image-io@1.6.0(debug@4.4.1)': + '@itk-wasm/image-io@1.3.0(debug@4.3.5)': dependencies: - axios: 1.10.0(debug@4.4.1) - itk-wasm: 1.0.0-b.192(debug@4.4.1) + axios: 1.7.2(debug@4.3.5) + itk-wasm: 1.0.0-b.196(debug@4.3.5) mime-types: 2.1.35 transitivePeerDependencies: - debug - '@jridgewell/gen-mapping@0.3.12': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.10': + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.29': + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/sourcemap-codec': 1.5.0 - '@kitware/vtk.js@30.10.0(@babel/preset-env@7.28.0(@babel/core@7.28.0))(autoprefixer@10.4.21(postcss@8.5.6))(webpack@5.100.1(esbuild@0.25.6))(wslink@2.3.4)': + '@kitware/vtk.js@30.10.0(@babel/preset-env@7.24.8(@babel/core@7.24.9))(autoprefixer@10.4.19(postcss@8.5.3))(webpack@5.93.0(esbuild@0.25.0))(wslink@2.1.1)': dependencies: - '@babel/preset-env': 7.28.0(@babel/core@7.28.0) + '@babel/preset-env': 7.24.8(@babel/core@7.24.9) '@babel/runtime': 7.22.11 - '@types/webxr': 0.5.22 - autoprefixer: 10.4.21(postcss@8.5.6) + '@types/webxr': 0.5.19 + autoprefixer: 10.4.19(postcss@8.5.3) commander: 9.2.0 d3-scale: 4.0.2 fast-deep-equal: 3.1.3 @@ -3902,42 +4008,47 @@ snapshots: spark-md5: 3.0.2 stream-browserify: 3.0.0 webworker-promise: 0.5.0 - worker-loader: 3.0.8(webpack@5.100.1(esbuild@0.25.6)) - wslink: 2.3.4 + worker-loader: 3.0.8(webpack@5.93.0(esbuild@0.25.0)) + wslink: 2.1.1 xmlbuilder2: 3.0.2 transitivePeerDependencies: - webpack - '@lit-labs/ssr-dom-shim@1.4.0': {} + '@lit-labs/ssr-dom-shim@1.2.0': {} - '@lit/context@1.1.6': + '@lit/context@1.1.2': dependencies: - '@lit/reactive-element': 2.1.1 + '@lit/reactive-element': 2.0.4 - '@lit/react@1.0.8(@types/react@19.1.8)': + '@lit/react@1.0.5(@types/react@18.3.3)': dependencies: - '@types/react': 19.1.8 + '@types/react': 18.3.3 - '@lit/reactive-element@2.1.1': + '@lit/reactive-element@2.0.4': dependencies: - '@lit-labs/ssr-dom-shim': 1.4.0 + '@lit-labs/ssr-dom-shim': 1.2.0 '@msgpack/msgpack@2.8.0': {} - '@multiformats/blake2@2.0.2': + '@multiformats/blake2@1.0.13': dependencies: blakejs: 1.2.1 - multiformats: 13.3.7 + multiformats: 9.9.0 + + '@multiformats/murmur3@1.1.3': + dependencies: + multiformats: 9.9.0 + murmurhash3js-revisited: 3.0.0 '@multiformats/murmur3@2.1.8': dependencies: - multiformats: 13.3.7 + multiformats: 13.1.3 murmurhash3js-revisited: 3.0.0 - '@multiformats/sha3@3.0.2': + '@multiformats/sha3@2.0.17': dependencies: - js-sha3: 0.9.3 - multiformats: 13.3.7 + js-sha3: 0.8.0 + multiformats: 9.9.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3949,7 +4060,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.17.1 '@oozcitak/dom@1.15.10': dependencies: @@ -3973,9 +4084,9 @@ snapshots: '@multiformats/murmur3': 2.1.8 murmurhash3js-revisited: 3.0.0 - '@playwright/test@1.54.1': + '@playwright/test@1.55.0': dependencies: - playwright: 1.54.1 + playwright: 1.55.0 '@protobufjs/aspromise@1.1.2': {} @@ -4000,63 +4111,69 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@shoelace-style/animations@1.2.0': {} + '@shoelace-style/animations@1.1.0': {} '@shoelace-style/localize@3.2.1': {} - '@shoelace-style/shoelace@2.20.1(@floating-ui/utils@0.2.10)(@types/react@19.1.8)': + '@shoelace-style/shoelace@2.15.1(@types/react@18.3.3)': dependencies: '@ctrl/tinycolor': 4.1.0 - '@floating-ui/dom': 1.7.2 - '@lit/react': 1.0.8(@types/react@19.1.8) - '@shoelace-style/animations': 1.2.0 + '@floating-ui/dom': 1.6.7 + '@lit/react': 1.0.5(@types/react@18.3.3) + '@shoelace-style/animations': 1.1.0 '@shoelace-style/localize': 3.2.1 - composed-offset-position: 0.0.6(@floating-ui/utils@0.2.10) - lit: 3.3.1 + composed-offset-position: 0.0.4 + lit: 3.1.4 qr-creator: 1.0.0 transitivePeerDependencies: - - '@floating-ui/utils' - '@types/react' '@socket.io/component-emitter@3.1.2': {} '@thewtex/zstddec@0.2.1': {} - '@types/emscripten@1.40.1': {} + '@types/emscripten@1.39.13': {} '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - '@types/estree@1.0.8': {} + '@types/estree@1.0.7': {} '@types/json-schema@7.0.15': {} - '@types/node@20.19.7': + '@types/node@20.14.11': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.17.30': dependencies: - undici-types: 6.21.0 + undici-types: 6.19.8 + + '@types/prop-types@15.7.14': {} - '@types/react@19.1.8': + '@types/react@18.3.3': dependencies: + '@types/prop-types': 15.7.14 csstype: 3.1.3 '@types/trusted-types@2.0.7': {} - '@types/webxr@0.5.22': {} + '@types/webxr@0.5.19': {} - '@web3-storage/car-block-validator@1.2.2': + '@web3-storage/car-block-validator@1.2.0': dependencies: - '@multiformats/blake2': 2.0.2 - '@multiformats/murmur3': 2.1.8 - '@multiformats/sha3': 3.0.2 - multiformats: 13.3.7 - uint8arrays: 5.1.0 + '@multiformats/blake2': 1.0.13 + '@multiformats/murmur3': 1.1.3 + '@multiformats/sha3': 2.0.17 + multiformats: 9.9.0 + uint8arrays: 3.1.1 '@webassemblyjs/ast@1.14.1': dependencies: @@ -4138,17 +4255,17 @@ snapshots: '@xtuc/long@4.2.2': {} - abort-error@1.0.1: {} - - acorn-import-phases@1.0.4(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: - acorn: 8.15.0 + acorn: 8.14.1 - acorn-walk@8.3.4: + acorn-walk@8.3.3: dependencies: - acorn: 8.15.0 + acorn: 8.12.1 + + acorn@8.12.1: {} - acorn@8.15.0: {} + acorn@8.14.1: {} actor@2.3.1: {} @@ -4186,7 +4303,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.0.1: {} ansi-styles@4.3.0: dependencies: @@ -4211,26 +4328,26 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.21(postcss@8.5.6): + autoprefixer@10.4.19(postcss@8.5.3): dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001713 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.3 postcss-value-parser: 4.2.0 ava@5.3.1: dependencies: - acorn: 8.15.0 - acorn-walk: 8.3.4 + acorn: 8.12.1 + acorn-walk: 8.3.3 ansi-styles: 6.2.1 arrgv: 1.0.2 arrify: 3.0.0 callsites: 4.2.0 cbor: 8.1.0 - chalk: 5.4.1 + chalk: 5.3.0 chokidar: 3.6.0 chunkd: 2.0.1 ci-info: 3.9.0 @@ -4241,8 +4358,8 @@ snapshots: common-path-prefix: 3.0.0 concordance: 5.0.4 currently-unhandled: 0.4.1 - debug: 4.4.1 - emittery: 1.2.0 + debug: 4.3.5 + emittery: 1.0.3 figures: 5.0.0 globby: 13.2.2 ignore-by-default: 2.1.0 @@ -4269,39 +4386,43 @@ snapshots: transitivePeerDependencies: - supports-color - available-typed-arrays@1.0.7: + axios@1.11.0(debug@4.3.5): dependencies: - possible-typed-array-names: 1.1.0 + follow-redirects: 1.15.6(debug@4.3.5) + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug - axios@1.10.0(debug@4.4.1): + axios@1.7.2(debug@4.3.5): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) - form-data: 4.0.3 + follow-redirects: 1.15.6(debug@4.3.5) + form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.24.9): dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/compat-data': 7.26.8 + '@babel/core': 7.24.9 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.24.9) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.24.9): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 + '@babel/core': 7.24.9 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.24.9) + core-js-compat: 3.41.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.24.9): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) + '@babel/core': 7.24.9 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.24.9) transitivePeerDependencies: - supports-color @@ -4322,12 +4443,12 @@ snapshots: blueimp-md5@2.19.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -4335,12 +4456,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.1: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.183 + caniuse-lite: 1.0.30001713 + electron-to-chromium: 1.5.136 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + update-browserslist-db: 1.1.3(browserslist@4.24.4) buffer-alloc-unsafe@1.1.0: {} @@ -4365,29 +4486,17 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - callsites@4.2.0: {} - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001713: {} cbor@8.1.0: dependencies: nofilter: 3.1.0 - cborg@4.2.12: {} + cborg@4.2.3: {} - chalk@5.4.1: {} + chalk@5.3.0: {} chokidar@3.6.0: dependencies: @@ -4442,7 +4551,7 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comlink@4.4.2: {} + comlink@4.4.1: {} commander@10.0.1: {} @@ -4454,9 +4563,7 @@ snapshots: common-path-prefix@3.0.0: {} - composed-offset-position@0.0.6(@floating-ui/utils@0.2.10): - dependencies: - '@floating-ui/utils': 0.2.10 + composed-offset-position@0.0.4: {} concat-map@0.0.1: {} @@ -4468,16 +4575,16 @@ snapshots: js-string-escape: 1.0.1 lodash: 4.17.21 md5-hex: 3.0.1 - semver: 7.7.2 + semver: 7.7.1 well-known-symbols: 2.0.0 convert-source-map@2.0.0: {} convert-to-spaces@2.0.1: {} - core-js-compat@3.44.0: + core-js-compat@3.41.0: dependencies: - browserslist: 4.25.1 + browserslist: 4.24.4 core-util-is@1.0.3: {} @@ -4519,11 +4626,11 @@ snapshots: dependencies: time-zone: 1.0.0 - debug@4.3.7: + debug@4.3.5: dependencies: - ms: 2.1.3 + ms: 2.1.2 - debug@4.4.1: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4591,9 +4698,9 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.183: {} + electron-to-chromium@1.5.136: {} - emittery@1.2.0: {} + emittery@1.0.3: {} emoji-regex@8.0.0: {} @@ -4601,17 +4708,17 @@ snapshots: emojis-list@3.0.0: {} - end-of-stream@1.4.5: + end-of-stream@1.4.4: dependencies: once: 1.4.0 - engine.io-client@6.6.3: + engine.io-client@6.5.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 + debug: 4.3.5 engine.io-parser: 5.2.3 ws: 8.17.1 - xmlhttprequest-ssl: 2.1.2 + xmlhttprequest-ssl: 2.0.0 transitivePeerDependencies: - bufferutil - supports-color @@ -4619,16 +4726,18 @@ snapshots: engine.io-parser@5.2.3: {} - enhanced-resolve@5.18.2: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.2.1 + + err-code@3.0.1: {} es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@1.6.0: {} es-object-atoms@1.1.1: dependencies: @@ -4666,34 +4775,35 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.25.6: + esbuild@0.25.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + + escalade@3.1.2: {} escalade@3.2.0: {} @@ -4726,21 +4836,21 @@ snapshots: fast-diff@1.3.0: {} - fast-glob@3.3.3: + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.8 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-uri@3.0.6: {} - fastq@1.19.1: + fastq@1.17.1: dependencies: - reusify: 1.1.0 + reusify: 1.0.4 fd-slicer@1.1.0: dependencies: @@ -4759,7 +4869,7 @@ snapshots: file-type@6.2.0: {} - files-from-path@1.1.4: + files-from-path@1.0.4: dependencies: graceful-fs: 4.2.11 @@ -4772,15 +4882,17 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 - follow-redirects@1.15.9(debug@4.4.1): + follow-redirects@1.15.6(debug@4.3.5): optionalDependencies: - debug: 4.4.1 + debug: 4.3.5 - for-each@0.3.5: + form-data@4.0.0: dependencies: - is-callable: 1.2.7 + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 - form-data@4.0.3: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4792,7 +4904,7 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@11.3.0: + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -4864,6 +4976,8 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 + globals@11.12.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 @@ -4871,8 +4985,8 @@ snapshots: globby@13.2.2: dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 + fast-glob: 3.3.2 + ignore: 5.3.1 merge2: 1.4.1 slash: 4.0.0 @@ -4905,12 +5019,12 @@ snapshots: ignore-by-default@2.1.0: {} - ignore@5.3.2: {} + ignore@5.3.1: {} - imjoy-rpc@0.5.59: + imjoy-rpc@0.5.57: dependencies: '@msgpack/msgpack': 2.8.0 - socket.io-client: 4.8.1 + socket.io-client: 4.7.5 transitivePeerDependencies: - bufferutil - supports-color @@ -4927,12 +5041,12 @@ snapshots: inherits@2.0.4: {} - interface-blockstore@5.3.2: + interface-blockstore@5.2.10: dependencies: - interface-store: 6.0.3 - multiformats: 13.3.7 + interface-store: 5.1.8 + multiformats: 13.1.3 - interface-store@6.0.3: {} + interface-store@5.1.8: {} internmap@2.0.3: {} @@ -4940,40 +5054,42 @@ snapshots: ipfs-car@1.2.0: dependencies: - '@ipld/car': 5.4.2 - '@ipld/dag-cbor': 9.2.4 - '@ipld/dag-json': 10.2.5 - '@ipld/dag-pb': 4.1.5 + '@ipld/car': 5.3.2 + '@ipld/dag-cbor': 9.2.1 + '@ipld/dag-json': 10.2.2 + '@ipld/dag-pb': 4.1.2 '@ipld/unixfs': 3.0.0 - '@web3-storage/car-block-validator': 1.2.2 - files-from-path: 1.1.4 - ipfs-unixfs-exporter: 13.6.6 - multiformats: 13.3.7 + '@web3-storage/car-block-validator': 1.2.0 + files-from-path: 1.0.4 + ipfs-unixfs-exporter: 13.5.0 + multiformats: 13.1.3 sade: 1.8.1 varint: 6.0.0 - ipfs-unixfs-exporter@13.6.6: + ipfs-unixfs-exporter@13.5.0: dependencies: - '@ipld/dag-cbor': 9.2.4 - '@ipld/dag-json': 10.2.5 - '@ipld/dag-pb': 4.1.5 + '@ipld/dag-cbor': 9.2.1 + '@ipld/dag-json': 10.2.2 + '@ipld/dag-pb': 4.1.2 '@multiformats/murmur3': 2.1.8 + err-code: 3.0.1 hamt-sharding: 3.0.6 - interface-blockstore: 5.3.2 - ipfs-unixfs: 11.2.5 - it-filter: 3.1.4 - it-last: 3.0.9 - it-map: 3.1.4 - it-parallel: 3.0.13 + interface-blockstore: 5.2.10 + ipfs-unixfs: 11.1.4 + it-filter: 3.1.1 + it-last: 3.0.6 + it-map: 3.1.1 + it-parallel: 3.0.8 it-pipe: 3.0.1 it-pushable: 3.2.3 - multiformats: 13.3.7 - p-queue: 8.1.0 + multiformats: 13.1.3 + p-queue: 8.0.1 progress-events: 1.0.1 - ipfs-unixfs@11.2.5: + ipfs-unixfs@11.1.4: dependencies: - protons-runtime: 5.6.0 + err-code: 3.0.1 + protons-runtime: 5.4.0 uint8arraylist: 2.4.8 irregular-plurals@3.5.0: {} @@ -4982,7 +5098,9 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-callable@1.2.7: {} + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 is-core-module@2.16.1: dependencies: @@ -5010,94 +5128,82 @@ snapshots: is-stream@1.1.0: {} - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - is-unicode-supported@1.3.0: {} isarray@1.0.0: {} - isarray@2.0.5: {} - - it-filter@3.1.4: + it-filter@3.1.1: dependencies: - it-peekable: 3.0.8 + it-peekable: 3.0.5 - it-last@3.0.9: {} + it-last@3.0.6: {} - it-map@3.1.4: + it-map@3.1.1: dependencies: - it-peekable: 3.0.8 + it-peekable: 3.0.5 - it-merge@3.0.12: + it-merge@3.0.5: dependencies: - it-queueless-pushable: 2.0.2 + it-pushable: 3.2.3 - it-parallel@3.0.13: + it-parallel@3.0.8: dependencies: p-defer: 4.0.1 - it-peekable@3.0.8: {} + it-peekable@3.0.5: {} it-pipe@3.0.1: dependencies: - it-merge: 3.0.12 + it-merge: 3.0.5 it-pushable: 3.2.3 - it-stream-types: 2.0.2 + it-stream-types: 2.0.1 it-pushable@3.2.3: dependencies: p-defer: 4.0.1 - it-queueless-pushable@2.0.2: - dependencies: - abort-error: 1.0.1 - p-defer: 4.0.1 - race-signal: 1.1.3 + it-stream-types@2.0.1: {} - it-stream-types@2.0.2: {} - - itk-wasm@1.0.0-b.160(debug@4.4.1): + itk-wasm@1.0.0-b.160(debug@4.3.5): dependencies: '@thewtex/zstddec': 0.2.1 - '@types/emscripten': 1.40.1 - axios: 1.10.0(debug@4.4.1) - comlink: 4.4.2 + '@types/emscripten': 1.39.13 + axios: 1.7.2(debug@4.3.5) + comlink: 4.4.1 commander: 11.1.0 - fs-extra: 11.3.0 + fs-extra: 11.2.0 glob: 8.1.0 - markdown-table: 3.0.4 + markdown-table: 3.0.3 mime-types: 2.1.35 - wasm-feature-detect: 1.8.0 + wasm-feature-detect: 1.6.2 transitivePeerDependencies: - debug - itk-wasm@1.0.0-b.192(debug@4.4.1): + itk-wasm@1.0.0-b.196(debug@4.3.5): dependencies: - '@emnapi/wasi-threads': 1.0.3 - '@itk-wasm/dam': 1.1.1(debug@4.4.1) + '@emnapi/wasi-threads': 1.0.1 + '@itk-wasm/dam': 1.1.1(debug@4.3.5) '@thewtex/zstddec': 0.2.1 - '@types/emscripten': 1.40.1 - axios: 1.10.0(debug@4.4.1) - chalk: 5.4.1 - comlink: 4.4.2 + '@types/emscripten': 1.39.13 + axios: 1.11.0(debug@4.3.5) + chalk: 5.3.0 + comlink: 4.4.1 commander: 11.1.0 - fs-extra: 11.3.0 + fs-extra: 11.2.0 glob: 8.1.0 - markdown-table: 3.0.4 + markdown-table: 3.0.3 mime-types: 2.1.35 - wasm-feature-detect: 1.8.0 + wasm-feature-detect: 1.6.2 transitivePeerDependencies: - debug jest-worker@27.5.1: dependencies: - '@types/node': 20.19.7 + '@types/node': 20.17.30 merge-stream: 2.0.0 supports-color: 8.1.1 - js-sha3@0.9.3: {} + js-sha3@0.8.0: {} js-string-escape@1.0.1: {} @@ -5135,21 +5241,21 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - lit-element@4.2.1: + lit-element@4.0.6: dependencies: - '@lit-labs/ssr-dom-shim': 1.4.0 - '@lit/reactive-element': 2.1.1 - lit-html: 3.3.1 + '@lit-labs/ssr-dom-shim': 1.2.0 + '@lit/reactive-element': 2.0.4 + lit-html: 3.1.4 - lit-html@3.3.1: + lit-html@3.1.4: dependencies: '@types/trusted-types': 2.0.7 - lit@3.3.1: + lit@3.1.4: dependencies: - '@lit/reactive-element': 2.1.1 - lit-element: 4.2.1 - lit-html: 3.3.1 + '@lit/reactive-element': 2.0.4 + lit-element: 4.0.6 + lit-html: 3.1.4 load-json-file@7.0.1: {} @@ -5175,7 +5281,7 @@ snapshots: lodash@4.17.21: {} - long@5.3.2: {} + long@5.2.3: {} lru-cache@5.1.1: dependencies: @@ -5189,7 +5295,7 @@ snapshots: dependencies: p-defer: 1.0.0 - markdown-table@3.0.4: {} + markdown-table@3.0.3: {} matcher@5.0.0: dependencies: @@ -5210,7 +5316,7 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.8: + micromatch@4.0.7: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -5225,11 +5331,11 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.11 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.1 minimist@1.2.8: {} @@ -5248,9 +5354,13 @@ snapshots: mri@1.2.0: {} + ms@2.1.2: {} + ms@2.1.3: {} - multiformats@13.3.7: {} + multiformats@13.1.3: {} + + multiformats@9.9.0: {} murmurhash3js-revisited@3.0.0: {} @@ -5284,7 +5394,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.1 + yocto-queue: 1.1.1 p-locate@6.0.0: dependencies: @@ -5294,14 +5404,14 @@ snapshots: dependencies: aggregate-error: 4.0.1 - p-queue@8.1.0: + p-queue@8.0.1: dependencies: eventemitter3: 5.0.1 - p-timeout: 6.1.4 + p-timeout: 6.1.2 p-timeout@5.1.0: {} - p-timeout@6.1.4: {} + p-timeout@6.1.2: {} parse-ms@3.0.0: {} @@ -5315,6 +5425,8 @@ snapshots: pend@1.2.0: {} + picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5334,11 +5446,11 @@ snapshots: find-up: 6.3.0 load-json-file: 7.0.1 - playwright-core@1.54.1: {} + playwright-core@1.55.0: {} - playwright@1.54.1: + playwright@1.55.0: dependencies: - playwright-core: 1.54.1 + playwright-core: 1.55.0 optionalDependencies: fsevents: 2.3.2 @@ -5346,11 +5458,9 @@ snapshots: dependencies: irregular-plurals: 3.5.0 - possible-typed-array-names@1.1.0: {} - postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.3: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -5364,7 +5474,7 @@ snapshots: progress-events@1.0.1: {} - protobufjs@7.5.3: + protobufjs@7.3.2: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -5376,10 +5486,10 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.19.7 - long: 5.3.2 + '@types/node': 20.14.11 + long: 5.2.3 - protons-runtime@5.6.0: + protons-runtime@5.4.0: dependencies: uint8-varint: 2.0.4 uint8arraylist: 2.4.8 @@ -5395,8 +5505,6 @@ snapshots: rabin-rs@2.1.0: {} - race-signal@1.1.3: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -5414,7 +5522,7 @@ snapshots: readable-stream@3.6.2: dependencies: inherits: 2.0.4 - string_decoder: 1.3.0 + string_decoder: 1.1.1 util-deprecate: 1.0.2 readdirp@3.6.0: @@ -5423,7 +5531,7 @@ snapshots: rechoir@0.6.2: dependencies: - resolve: 1.22.10 + resolve: 1.22.8 regenerate-unicode-properties@10.2.0: dependencies: @@ -5433,6 +5541,10 @@ snapshots: regenerator-runtime@0.14.1: {} + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.27.0 + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 @@ -5464,7 +5576,13 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} rollup@3.29.5: optionalDependencies: @@ -5488,7 +5606,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - schema-utils@4.3.2: + schema-utils@4.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 8.17.1 @@ -5503,7 +5621,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} + semver@7.7.1: {} serialize-error@7.0.1: dependencies: @@ -5513,15 +5631,6 @@ snapshots: dependencies: randombytes: 2.1.0 - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - shader-loader@1.3.1: dependencies: loader-utils: 1.4.2 @@ -5546,11 +5655,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - socket.io-client@4.8.1: + socket.io-client@4.7.5: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.6.3 + debug: 4.3.5 + engine.io-client: 6.5.4 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil @@ -5560,7 +5669,7 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -5604,17 +5713,13 @@ snapshots: dependencies: safe-buffer: 5.1.2 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.0.1 strip-dirs@2.1.0: dependencies: @@ -5633,16 +5738,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.2.2: {} + tapable@2.2.1: {} tar-stream@1.6.2: dependencies: bl: 1.2.3 buffer-alloc: 1.2.0 - end-of-stream: 1.4.5 + end-of-stream: 1.4.4 fs-constants: 1.0.0 readable-stream: 2.3.8 - to-buffer: 1.2.1 + to-buffer: 1.1.1 xtend: 4.0.2 tar@6.2.1: @@ -5656,21 +5761,21 @@ snapshots: temp-dir@3.0.0: {} - terser-webpack-plugin@5.3.14(esbuild@0.25.6)(webpack@5.100.1(esbuild@0.25.6)): + terser-webpack-plugin@5.3.14(esbuild@0.25.0)(webpack@5.93.0(esbuild@0.25.0)): dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 - schema-utils: 4.3.2 + schema-utils: 4.3.0 serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.100.1(esbuild@0.25.6) + terser: 5.39.0 + webpack: 5.93.0(esbuild@0.25.0) optionalDependencies: - esbuild: 0.25.6 + esbuild: 0.25.0 - terser@5.43.1: + terser@5.39.0: dependencies: - '@jridgewell/source-map': 0.3.10 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 commander: 2.20.3 source-map-support: 0.5.21 @@ -5678,27 +5783,17 @@ snapshots: time-zone@1.0.0: {} - to-buffer@1.2.1: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 + to-buffer@1.1.1: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tslib@2.8.1: {} + tslib@2.6.3: {} type-fest@0.13.1: {} - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typescript@5.8.3: {} + typescript@5.5.4: {} uint8-varint@2.0.4: dependencies: @@ -5709,16 +5804,22 @@ snapshots: dependencies: uint8arrays: 5.1.0 + uint8arrays@3.1.1: + dependencies: + multiformats: 9.9.0 + uint8arrays@5.1.0: dependencies: - multiformats: 13.3.7 + multiformats: 13.1.3 unbzip2-stream@1.4.3: dependencies: buffer: 5.7.1 through: 2.3.8 - undici-types@6.21.0: {} + undici-types@5.26.5: {} + + undici-types@6.19.8: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -5733,9 +5834,9 @@ snapshots: universalify@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: - browserslist: 4.25.1 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -5747,47 +5848,46 @@ snapshots: varint@6.0.0: {} - vite-plugin-static-copy@0.17.1(vite@4.5.14(@types/node@20.19.7)(terser@5.43.1)): + vite-plugin-static-copy@0.17.1(vite@4.5.13(@types/node@20.14.11)(terser@5.39.0)): dependencies: chokidar: 3.6.0 - fast-glob: 3.3.3 - fs-extra: 11.3.0 - picocolors: 1.1.1 - vite: 4.5.14(@types/node@20.19.7)(terser@5.43.1) + fast-glob: 3.3.2 + fs-extra: 11.2.0 + picocolors: 1.0.1 + vite: 4.5.13(@types/node@20.14.11)(terser@5.39.0) - vite@4.5.14(@types/node@20.19.7)(terser@5.43.1): + vite@4.5.13(@types/node@20.14.11)(terser@5.39.0): dependencies: esbuild: 0.18.20 - postcss: 8.5.6 + postcss: 8.5.3 rollup: 3.29.5 optionalDependencies: - '@types/node': 20.19.7 + '@types/node': 20.14.11 fsevents: 2.3.3 - terser: 5.43.1 + terser: 5.39.0 - wasm-feature-detect@1.8.0: {} + wasm-feature-detect@1.6.2: {} - watchpack@2.4.4: + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - webpack-sources@3.3.3: {} + webpack-sources@3.2.3: {} - webpack@5.100.1(esbuild@0.25.6): + webpack@5.93.0(esbuild@0.25.0): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 + '@types/estree': 1.0.7 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + browserslist: 4.24.4 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -5796,11 +5896,11 @@ snapshots: loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(esbuild@0.25.6)(webpack@5.100.1(esbuild@0.25.6)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.14(esbuild@0.25.0)(webpack@5.93.0(esbuild@0.25.0)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild @@ -5810,21 +5910,11 @@ snapshots: well-known-symbols@2.0.0: {} - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - worker-loader@3.0.8(webpack@5.100.1(esbuild@0.25.6)): + worker-loader@3.0.8(webpack@5.93.0(esbuild@0.25.0)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.1(esbuild@0.25.6) + webpack: 5.93.0(esbuild@0.25.0) wrap-ansi@7.0.0: dependencies: @@ -5841,7 +5931,7 @@ snapshots: ws@8.17.1: {} - wslink@2.3.4: + wslink@2.1.1: dependencies: '@msgpack/msgpack': 2.8.0 @@ -5850,19 +5940,17 @@ snapshots: '@oozcitak/dom': 1.15.10 '@oozcitak/infra': 1.0.8 '@oozcitak/util': 8.3.8 - '@types/node': 20.19.7 + '@types/node': 20.17.30 js-yaml: 3.14.0 - xmlhttprequest-ssl@2.1.2: {} + xmlhttprequest-ssl@2.0.0: {} - xstate-lit@2.0.5(@lit/context@1.1.6)(lit@3.3.1)(xstate@5.5.2): + xstate-lit@2.0.5(@lit/context@1.1.2)(lit@3.1.4)(xstate@5.5.2): dependencies: - '@lit/context': 1.1.6 - lit: 3.3.1 + '@lit/context': 1.1.2 + lit: 3.1.4 xstate: 5.5.2 - xstate@5.17.1: {} - xstate@5.5.2: {} xtend@4.0.2: {} @@ -5878,7 +5966,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.2.0 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -5890,6 +5978,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yocto-queue@1.2.1: {} + yocto-queue@1.1.1: {} - zod@3.25.76: {} + zod@3.23.8: {} diff --git a/wasm/CMakeLists.txt b/wasm/CMakeLists.txt index f5bb092..3fc3516 100644 --- a/wasm/CMakeLists.txt +++ b/wasm/CMakeLists.txt @@ -5,12 +5,11 @@ set(CMAKE_CXX_STANDARD 17) if(EMSCRIPTEN) set(io_components - ITKTransformIO ) elseif(WASI) set(io_components ITKIOMeta - ITKTransformIO + ITKIOTransformHDF5 ) else() set(io_components @@ -29,6 +28,9 @@ include(${ITK_USE_FILE}) add_executable(elastix elastix-wasm.cxx) target_link_libraries(elastix PUBLIC ${ITK_LIBRARIES}) +add_executable(transformix transformix-wasm.cxx) +target_link_libraries(transformix PUBLIC ${ITK_LIBRARIES}) + add_executable(read-parameter-files read-parameter-files.cxx) target_link_libraries(read-parameter-files PUBLIC ${ITK_LIBRARIES}) @@ -93,6 +95,24 @@ add_test(NAME elastix-wasm-2d-multiple-test -m ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/CT_2D_head_moving.iwi.cbor ) +add_test(NAME transformix-wasm-test + COMMAND transformix + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/CT_3D_lung_moving.iwi.cbor + ${CMAKE_CURRENT_BINARY_DIR}/CT_3D_lung.json + ${CMAKE_CURRENT_BINARY_DIR}/CT_3D_lung_transformix.iwi.cbor + ) +set_tests_properties(transformix-wasm-test PROPERTIES DEPENDS elastix-wasm-test) + +# add_test(NAME elastix-wasm-2d-test +# COMMAND elastix +# ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/parameters_single.json +# ${CMAKE_CURRENT_BINARY_DIR}/CT_2D_head_registered.iwi.cbor +# ${CMAKE_CURRENT_BINARY_DIR}/CT_2D_head.h5 +# ${CMAKE_CURRENT_BINARY_DIR}/CT_2D_head.json +# -f ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/CT_2D_head_fixed.iwi.cbor +# -m ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/CT_2D_head_moving.iwi.cbor +# ) + add_test(NAME read-parameter-files-test COMMAND read-parameter-files ${CMAKE_CURRENT_BINARY_DIR}/parameters_single.json diff --git a/wasm/elastix-wasm.cxx b/wasm/elastix-wasm.cxx index d232e18..680aa0f 100644 --- a/wasm/elastix-wasm.cxx +++ b/wasm/elastix-wasm.cxx @@ -22,21 +22,20 @@ #include "itkInputTextStream.h" #include "itkOutputTextStream.h" #include "itkSupportInputImageTypes.h" +#include "itkOutputTransform.h" +#include "itkInputTransform.h" #include "itkImage.h" -#include "itkTransformFileWriter.h" -#include "itkTransformFileReader.h" #include "itkIdentityTransform.h" #include "itkCompositeTransform.h" #include "itkCompositeTransformIOHelper.h" #include "itkCastImageFilter.h" -#include "rapidjson/document.h" -#include "rapidjson/prettywriter.h" -#include "rapidjson/stringbuffer.h" - #include +#include "itkElastixWasmParameterObject.h" +#include "glaze/glaze.hpp" + template class PipelineFunctor { @@ -46,6 +45,11 @@ class PipelineFunctor { using ImageType = TImage; using ParametersValueType = double; + using FloatImageType = itk::Image; + using RegistrationType = itk::ElastixRegistrationMethod; + using TransformType = typename RegistrationType::TransformType; + using CompositeTransformType = itk::CompositeTransform; + using CompositeHelperType = itk::CompositeTransformIOHelperTemplate; using InputImageType = itk::wasm::InputImage; InputImageType fixedImage; @@ -54,10 +58,10 @@ class PipelineFunctor InputImageType movingImage; pipeline.add_option("-m,--moving", movingImage, "Moving image")->type_name("INPUT_IMAGE"); - std::string initialTransformFile; - pipeline - .add_option("-i,--initial-transform", initialTransformFile, "Initial transform to apply before registration") - ->type_name("INPUT_BINARY_FILE"); + using InputTransformType = itk::wasm::InputTransform; + InputTransformType initialTransform; + pipeline.add_option("-i,--initial-transform", initialTransform, "Initial transform to apply before registration") + ->type_name("INPUT_TRANSFORM"); itk::wasm::InputTextStream initialTransformParameterObjectJson; auto initialTransformParameterObjectOption = @@ -77,10 +81,11 @@ class PipelineFunctor OutputImageType resultImage; pipeline.add_option("result", resultImage, "Resampled moving image")->required()->type_name("OUTPUT_IMAGE"); - std::string outputTransform; + using OutputTransformType = itk::wasm::OutputTransform; + OutputTransformType outputTransform; pipeline.add_option("transform", outputTransform, "Fixed-to-moving transform file") ->required() - ->type_name("OUTPUT_BINARY_FILE"); + ->type_name("OUTPUT_TRANSFORM"); itk::wasm::OutputTextStream transformParameterObjectJson; pipeline @@ -92,7 +97,6 @@ class PipelineFunctor ITK_WASM_PARSE(pipeline); - using FloatImageType = itk::Image; using CasterType = itk::CastImageFilter; typename CasterType::Pointer fixedCaster = CasterType::New(); @@ -103,36 +107,17 @@ class PipelineFunctor movingCaster->SetInput(movingImage.Get()); ITK_WASM_CATCH_EXCEPTION(pipeline, movingCaster->Update()); - using RegistrationType = itk::ElastixRegistrationMethod; typename RegistrationType::Pointer registration = RegistrationType::New(); - rapidjson::Document document; - std::stringstream ss; - ss << parameterObjectJson.Get().rdbuf(); - document.Parse(ss.str().c_str()); - using ParameterObjectType = elastix::ParameterObject; - const auto parameterObject = ParameterObjectType::New(); - const auto numParameterMaps = document.Size(); - using ParameterMapType = std::map>; - std::vector parameterMaps; - for (unsigned int i = 0; i < numParameterMaps; ++i) + const auto parameterObject = ParameterObjectType::New(); + std::stringstream ss; + ss << parameterObjectJson.Get().rdbuf(); + const std::string errorMessage = itk::wasm::ReadParameterObject(ss.str(), parameterObject); + if (!errorMessage.empty()) { - const auto & parameterMapJson = document[i]; - ParameterMapType parameterMap; - for (auto it = parameterMapJson.MemberBegin(); it != parameterMapJson.MemberEnd(); ++it) - { - const auto & key = it->name.GetString(); - const auto & valueJson = it->value; - std::vector value; - for (auto it2 = valueJson.Begin(); it2 != valueJson.End(); ++it2) - { - const auto & valueElement = it2->GetString(); - value.push_back(valueElement); - } - parameterMap[key] = value; - } - parameterObject->AddParameterMap(parameterMap); + std::cerr << "Error reading parameter object JSON: " << errorMessage << std::endl; + return EXIT_FAILURE; } auto fixed = const_cast(fixedImage.Get()); @@ -141,69 +126,22 @@ class PipelineFunctor registration->SetMovingImage(movingCaster->GetOutput()); registration->SetParameterObject(parameterObject); - typename RegistrationType::TransformType::Pointer initialTransform; - using CompositeTransformType = itk::CompositeTransform; - using CompositeHelperType = itk::CompositeTransformIOHelperTemplate; - using TransformReaderType = itk::TransformFileReaderTemplate; - typename TransformReaderType::Pointer transformReader = TransformReaderType::New(); - if (!initialTransformFile.empty()) + typename RegistrationType::TransformType::Pointer externalInitialTransform; + if (initialTransform.Get()) { - transformReader->SetFileName(initialTransformFile); - ITK_WASM_CATCH_EXCEPTION(pipeline, transformReader->Update()); - - if (transformReader->GetTransformList()->size() == 1) - { - auto firstTransform = transformReader->GetModifiableTransformList()->front(); - if (!strcmp(firstTransform->GetNameOfClass(), "CompositeTransform")) - { - initialTransform = static_cast(firstTransform.GetPointer()); - registration->SetExternalInitialTransform(initialTransform); - } - // We could add support for other initial transform types here - else - { - std::cerr << "Initial transform is not a composite transform, which is not currently supported." << std::endl; - return EXIT_FAILURE; - } - } - else if (transformReader->GetTransformList()->size() > 1) - { - CompositeHelperType helper; - typename CompositeTransformType::Pointer compositeTransform = CompositeTransformType::New(); - helper.SetTransformList(compositeTransform, *transformReader->GetModifiableTransformList()); - initialTransform = compositeTransform; - registration->SetExternalInitialTransform(initialTransform); - } + registration->SetExternalInitialTransform(const_cast(initialTransform.Get())); } else if (!initialTransformParameterObjectOption->empty()) { - rapidjson::Document initialDocument; - std::stringstream ss; - ss << initialTransformParameterObjectJson.Get().rdbuf(); - initialDocument.Parse(ss.str().c_str()); - using ParameterObjectType = elastix::ParameterObject; - const auto initialTransformParameterObject = ParameterObjectType::New(); - const auto numTransformParameterMaps = initialDocument.Size(); - using ParameterMapType = std::map>; - std::vector transformParameterMaps; - for (unsigned int i = 0; i < numTransformParameterMaps; ++i) + const auto initialTransformParameterObject = ParameterObjectType::New(); + std::stringstream ss; + ss << initialTransformParameterObjectJson.Get().rdbuf(); + const std::string errorMessage = itk::wasm::ReadParameterObject(ss.str(), initialTransformParameterObject); + if (!errorMessage.empty()) { - const auto & parameterMapJson = initialDocument[i]; - ParameterMapType parameterMap; - for (auto it = parameterMapJson.MemberBegin(); it != parameterMapJson.MemberEnd(); ++it) - { - const auto & key = it->name.GetString(); - const auto & valueJson = it->value; - std::vector value; - for (auto it2 = valueJson.Begin(); it2 != valueJson.End(); ++it2) - { - const auto & valueElement = it2->GetString(); - value.push_back(valueElement); - } - parameterMap[key] = value; - } - initialTransformParameterObject->AddParameterMap(parameterMap); + std::cerr << "Error reading transform parameter object JSON: " << errorMessage << std::endl; + return EXIT_FAILURE; } registration->SetInitialTransformParameterObject(initialTransformParameterObject); @@ -220,15 +158,11 @@ class PipelineFunctor typename ImageType::ConstPointer result = resultCaster->GetOutput(); resultImage.Set(result); - const auto writer = itk::TransformFileWriter::New(); - if (registration->GetNumberOfTransforms() == 0) { using IdentityTransformType = itk::IdentityTransform; typename IdentityTransformType::ConstPointer identity = IdentityTransformType::New(); - writer->SetInput(identity); - writer->SetFileName(outputTransform); - ITK_WASM_CATCH_EXCEPTION(pipeline, writer->Update()); + outputTransform.Set(identity); } // Reasonable to enable once we support injecting as an initial transform // else if (!initialTransform.GetPointer() && registration->GetNumberOfTransforms() == 1) @@ -248,40 +182,20 @@ class PipelineFunctor static_cast(registration->ConvertToItkTransform(*combinationTransform).GetPointer()); registeredCompositeTransform->FlattenTransformQueue(); registeredCompositeTransform->SetAllTransformsToOptimizeOff(); - writer->SetInput(registeredCompositeTransform); - writer->SetFileName(outputTransform); - ITK_WASM_CATCH_EXCEPTION(pipeline, writer->Update()); + outputTransform.Set(registeredCompositeTransform); } - const auto transformParameterObject = registration->GetTransformParameterObject(); - rapidjson::Document transformDocument; - transformDocument.SetArray(); - rapidjson::Document::AllocatorType & allocator = transformDocument.GetAllocator(); + const auto transformParameterObject = registration->GetTransformParameterObject(); - const auto numTransformParameterMaps = transformParameterObject->GetNumberOfParameterMaps(); - for (unsigned int i = 0; i < numTransformParameterMaps; ++i) + std::string serialized{}; + const std::string writeErrorMessage = itk::wasm::WriteParameterObject(transformParameterObject, serialized); + if (!writeErrorMessage.empty()) { - const auto & parameterMap = transformParameterObject->GetParameterMap(i); - rapidjson::Value parameterMapJson(rapidjson::kObjectType); - for (const auto & parameter : parameterMap) - { - const auto & key = parameter.first; - const auto & value = parameter.second; - rapidjson::Value valueJson(rapidjson::kArrayType); - for (const auto & valueElement : value) - { - valueJson.PushBack(rapidjson::Value(valueElement.c_str(), allocator).Move(), allocator); - } - parameterMapJson.AddMember(rapidjson::Value(key.c_str(), allocator).Move(), valueJson, allocator); - } - transformDocument.PushBack(parameterMapJson, allocator); + std::cerr << "Error serializing parameter object: " << writeErrorMessage << std::endl; + return EXIT_FAILURE; } - rapidjson::StringBuffer buffer; - rapidjson::PrettyWriter transformParamWriter(buffer); - transformDocument.Accept(transformParamWriter); - - transformParameterObjectJson.Get() << buffer.GetString(); + transformParameterObjectJson.Get() << serialized; return EXIT_SUCCESS; } diff --git a/wasm/itkElastixWasmParameterObject.h b/wasm/itkElastixWasmParameterObject.h new file mode 100644 index 0000000..de034ab --- /dev/null +++ b/wasm/itkElastixWasmParameterObject.h @@ -0,0 +1,186 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkElastixWasmParameterObject_h +#define itkElastixWasmParameterObject_h + +#include +#include +#include +#include + +#include "glaze/glaze.hpp" + +#include "elxParameterObject.h" + +#include "itkNumberToString.h" +namespace itk +{ +namespace wasm +{ + +/** + * @brief Type used to represent an elastix ParameterKey in ITK-Wasm pipelines + * and for serializing elastix parameter files with glaze. + * + * This is the name of the parameter, e.g. "NumberOfResolutions" + */ +using ParameterKey = std::string; + +/** + * @brief Type used to represent an elastix ParameterValue in ITK-Wasm pipelines + * and for serializing elastix parameter files with glaze. + * + * This is the type cast string held in a ParameterFile + */ +using ParameterValue = std::variant; + +using ParameterValueVector = std::vector; + +/** + * @brief Type used to represent an elastix ParameterObject in ITK-Wasm pipelines + * and for serializing elastix parameter files with glaze. + */ +using ParameterMap = std::map; + +/** + * @brief Type used to represent a vector of elastix ParameterMaps in ITK-Wasm pipelines + * and for serializing elastix parameter files with glaze. + */ +using ParameterMapVector = std::vector; + +/** + * @brief Read an itk::wasm::ParameterMapVector elastix parameter object JSON representation into an + * elastix::ParameterObject. + * + * @param parameterObjectJson JSON representation of the elastix parameter object + * @param parameterObject Pointer to the elastix::ParameterObject to populate + * @return std::string Error message if reading the parameter object fails, empty string otherwise. + */ +std::string +ReadParameterObject(const std::string & parameterObjectJson, elastix::ParameterObject * parameterObject) +{ + using ParameterObjectType = elastix::ParameterObject; + + itk::wasm::ParameterMapVector wasmParameterMaps; + auto errorCode = glz::read_json(wasmParameterMaps, parameterObjectJson); + if (errorCode) + { + const std::string errorMessage = glz::format_error(errorCode, parameterObjectJson); + return errorMessage; + } + + const auto numParameterMaps = wasmParameterMaps.size(); + ParameterObjectType::ParameterMapVectorType parameterMaps; + parameterMaps.reserve(numParameterMaps); + for (const auto wasmParameterMap : wasmParameterMaps) + { + ParameterObjectType::ParameterMapType parameterMap; + for (const auto & parameter : wasmParameterMap) + { + ParameterObjectType::ParameterValueVectorType parameterValues; + for (const auto & value : parameter.second) + { + if (value.index() == 0) + { + const auto & valueString = std::get(value); + parameterValues.push_back(valueString); + } + else if (value.index() == 1) + { + const auto & valueBool = std::get(value); + if (valueBool) + { + parameterValues.push_back("true"); + } + else + { + parameterValues.push_back("false"); + } + } + else if (value.index() == 2) + { + const auto & valueInt = std::get(value); + parameterValues.push_back(itk::ConvertNumberToString(valueInt)); + } + else if (value.index() == 3) + { + const auto & valueDouble = std::get(value); + parameterValues.push_back(itk::ConvertNumberToString(valueDouble)); + } + } + parameterMap[parameter.first] = parameterValues; + } + + parameterObject->AddParameterMap(parameterMap); + } + + return {}; +} + +/** + * @brief Write an elastix::ParameterObject into an itk::wasm::ParameterMapVector JSON representation. + * + * @param parameterObject Pointer to the elastix::ParameterObject to serialize + * @param parameterObjectJson JSON representation of the elastix parameter object (output) + * @return std::string Error message if writing the parameter object fails, empty string otherwise. + */ +std::string +WriteParameterObject(const elastix::ParameterObject * parameterObject, std::string & parameterObjectJson) +{ + using ParameterObjectType = elastix::ParameterObject; + + itk::wasm::ParameterMapVector wasmParameterMaps; + + const auto numParameterMaps = parameterObject->GetNumberOfParameterMaps(); + wasmParameterMaps.reserve(numParameterMaps); + + for (unsigned int i = 0; i < numParameterMaps; ++i) + { + const auto & parameterMap = parameterObject->GetParameterMap(i); + itk::wasm::ParameterMap wasmParameterMap; + + for (const auto & parameter : parameterMap) + { + const auto & parameterValueVector = parameter.second; + auto & wasmValues = wasmParameterMap[parameter.first]; + wasmValues.reserve(parameterValueVector.size()); + + // Convert each string into the variant + for (const auto & val : parameterValueVector) + { + wasmValues.emplace_back(val); + } + } + wasmParameterMaps.push_back(wasmParameterMap); + } + + auto errorCode = glz::write(wasmParameterMaps, parameterObjectJson); + if (errorCode) + { + const std::string errorMessage = glz::format_error(errorCode, parameterObjectJson); + return errorMessage; + } + + return {}; +} + + +} // namespace wasm +} // namespace itk + +#endif // itkElastixWasmParameterObject_h \ No newline at end of file diff --git a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/__init__.py b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/__init__.py index 25b1055..0da15c9 100644 --- a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/__init__.py +++ b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/__init__.py @@ -5,6 +5,7 @@ from .default_parameter_map_async import default_parameter_map_async from .elastix_async import elastix_async from .read_parameter_files_async import read_parameter_files_async +from .transformix_async import transformix_async from .write_parameter_files_async import write_parameter_files_async from ._version import __version__ diff --git a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/_version.py b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/_version.py index 260c070..7863915 100644 --- a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/_version.py +++ b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/_version.py @@ -1 +1 @@ -__version__ = "0.3.1" +__version__ = "1.0.2" diff --git a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/elastix_async.py b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/elastix_async.py index 612c8d7..b807893 100644 --- a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/elastix_async.py +++ b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/elastix_async.py @@ -14,25 +14,21 @@ from itkwasm import ( InterfaceTypes, Image, - BinaryFile, + TransformList, ) async def elastix_async( parameter_object: Any, - transform: str, fixed: Optional[Image] = None, moving: Optional[Image] = None, - initial_transform: Optional[os.PathLike] = None, + initial_transform: Optional[TransformList] = None, initial_transform_parameter_object: Optional[Any] = None, -) -> Tuple[Image, Any]: +) -> Tuple[Image, TransformList, Any]: """Rigid and non-rigid registration of images. :param parameter_object: Elastix parameter object representation :type parameter_object: Any - :param transform: Fixed-to-moving transform file - :type transform: str - :param fixed: Fixed image :type fixed: Image @@ -40,7 +36,7 @@ async def elastix_async( :type moving: Image :param initial_transform: Initial transform to apply before registration - :type initial_transform: os.PathLike + :type initial_transform: TransformList :param initial_transform_parameter_object: Initial elastix transform parameter object to apply before registration. Only provide this or an initial transform. :type initial_transform_parameter_object: Any @@ -48,6 +44,9 @@ async def elastix_async( :return: Resampled moving image :rtype: Image + :return: Fixed-to-moving transform file + :rtype: TransformList + :return: Elastix optimized transform parameter object representation :rtype: Any """ @@ -60,11 +59,11 @@ async def elastix_async( if moving is not None: kwargs["moving"] = to_js(moving) if initial_transform is not None: - kwargs["initialTransform"] = to_js(BinaryFile(initial_transform)) + kwargs["initialTransform"] = to_js(initial_transform) if initial_transform_parameter_object is not None: kwargs["initialTransformParameterObject"] = to_js(initial_transform_parameter_object) - outputs = await js_module.elastix(to_js(parameter_object), to_js(transform), webWorker=web_worker, noCopy=True, **kwargs) + outputs = await js_module.elastix(to_js(parameter_object), webWorker=web_worker, noCopy=True, **kwargs) output_web_worker = None output_list = [] diff --git a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/js_package.py b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/js_package.py index 4038cb5..7c8913d 100644 --- a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/js_package.py +++ b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/js_package.py @@ -3,6 +3,6 @@ from itkwasm.pyodide import JsPackageConfig, JsPackage from ._version import __version__ -default_js_module = """data:text/javascript;base64,dmFyIHh0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgUHQ9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSl4dChBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIFd0PSIwLjQuMCIsanQ9V3Q7dmFyIHZ0PXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0saz12dDt2YXIgWnQ9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LFo9WnQ7ZnVuY3Rpb24gVnQoQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIGsuVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBrLkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIGsuVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIGsuSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSBrLlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSBrLkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2Ugay5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBrLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIFouRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2UgWi5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIEw9VnQ7dmFyIFh0PXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm1MaXN0OiJUcmFuc2Zvcm1MaXN0IixKc29uQ29tcGF0aWJsZToiSnNvbkNvbXBhdGlibGUifSxkPVh0O3ZhciBGZT1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxfdD1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxqQT1TeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5IiksUEE9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLGRBPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxSZT1BPT50eXBlb2YgQT09Im9iamVjdCImJkEhPT1udWxsfHx0eXBlb2YgQT09ImZ1bmN0aW9uIix6dD17Y2FuSGFuZGxlOkE9PlJlKEEpJiZBW0ZlXSxzZXJpYWxpemUoQSl7bGV0e3BvcnQxOmUscG9ydDI6dH09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBVZShBLGUpLFt0LFt0XV19LGRlc2VyaWFsaXplKEEpe3JldHVybiBBLnN0YXJ0KCksdkEoQSl9fSwkdD17Y2FuSGFuZGxlOkE9PlJlKEEpJiZkQSBpbiBBLHNlcmlhbGl6ZSh7dmFsdWU6QX0pe2xldCBlO3JldHVybiBBIGluc3RhbmNlb2YgRXJyb3I/ZT17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTpBLm1lc3NhZ2UsbmFtZTpBLm5hbWUsc3RhY2s6QS5zdGFja319OmU9e2lzRXJyb3I6ITEsdmFsdWU6QX0sW2UsW11dfSxkZXNlcmlhbGl6ZShBKXt0aHJvdyBBLmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoQS52YWx1ZS5tZXNzYWdlKSxBLnZhbHVlKTpBLnZhbHVlfX0sa2U9bmV3IE1hcChbWyJwcm94eSIsenRdLFsidGhyb3ciLCR0XV0pO2Z1bmN0aW9uIEFJKEEsZSl7Zm9yKGxldCB0IG9mIEEpaWYoZT09PXR8fHQ9PT0iKiJ8fHQgaW5zdGFuY2VvZiBSZWdFeHAmJnQudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBVZShBLGU9Z2xvYmFsVGhpcyx0PVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIEkocil7aWYoIXJ8fCFyLmRhdGEpcmV0dXJuO2lmKCFBSSh0LHIub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtyLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDpnLHR5cGU6aSxwYXRoOkN9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LHIuZGF0YSksRT0oci5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChqKSxCO3RyeXtsZXQgbz1DLnNsaWNlKDAsLTEpLnJlZHVjZSgobCxzKT0+bFtzXSxBKSxhPUMucmVkdWNlKChsLHMpPT5sW3NdLEEpO3N3aXRjaChpKXtjYXNlIkdFVCI6Qj1hO2JyZWFrO2Nhc2UiU0VUIjpvW0Muc2xpY2UoLTEpWzBdXT1qKHIuZGF0YS52YWx1ZSksQj0hMDticmVhaztjYXNlIkFQUExZIjpCPWEuYXBwbHkobyxFKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBsPW5ldyBhKC4uLkUpO0I9Z0kobCl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpsLHBvcnQyOnN9PW5ldyBNZXNzYWdlQ2hhbm5lbDtVZShBLHMpLEI9WkEobCxbbF0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6Qj12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKG8pe0I9e3ZhbHVlOm8sW2RBXTowfX1Qcm9taXNlLnJlc29sdmUoQikuY2F0Y2gobz0+KHt2YWx1ZTpvLFtkQV06MH0pKS50aGVuKG89PntsZXRbYSxsXT15QShvKTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aWQ6Z30pLGwpLGk9PT0iUkVMRUFTRSImJihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEkpLE5lKGUpLFBBIGluIEEmJnR5cGVvZiBBW1BBXT09ImZ1bmN0aW9uIiYmQVtQQV0oKSl9KS5jYXRjaChvPT57bGV0W2EsbF09eUEoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtkQV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtpZDpnfSksbCl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBlSShBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBOZShBKXtlSShBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIHZBKEEsZSl7cmV0dXJuIFdBKEEsW10sZSl9ZnVuY3Rpb24gcEEoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIEdlKEEpe3JldHVybiBWKEEse3R5cGU6IlJFTEVBU0UifSkudGhlbigoKT0+e05lKEEpfSl9dmFyIGhBPW5ldyBXZWFrTWFwLERBPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoQT0+e2xldCBlPShoQS5nZXQoQSl8fDApLTE7aEEuc2V0KEEsZSksZT09PTAmJkdlKEEpfSk7ZnVuY3Rpb24gdEkoQSxlKXtsZXQgdD0oaEEuZ2V0KGUpfHwwKSsxO2hBLnNldChlLHQpLERBJiZEQS5yZWdpc3RlcihBLGUsQSl9ZnVuY3Rpb24gSUkoQSl7REEmJkRBLnVucmVnaXN0ZXIoQSl9ZnVuY3Rpb24gV0EoQSxlPVtdLHQ9ZnVuY3Rpb24oKXt9KXtsZXQgST0hMSxyPW5ldyBQcm94eSh0LHtnZXQoZyxpKXtpZihwQShJKSxpPT09akEpcmV0dXJuKCk9PntJSShyKSxHZShBKSxJPSEwfTtpZihpPT09InRoZW4iKXtpZihlLmxlbmd0aD09PTApcmV0dXJue3RoZW46KCk9PnJ9O2xldCBDPVYoQSx7dHlwZToiR0VUIixwYXRoOmUubWFwKEU9PkUudG9TdHJpbmcoKSl9KS50aGVuKGopO3JldHVybiBDLnRoZW4uYmluZChDKX1yZXR1cm4gV0EoQSxbLi4uZSxpXSl9LHNldChnLGksQyl7cEEoSSk7bGV0W0UsQl09eUEoQyk7cmV0dXJuIFYoQSx7dHlwZToiU0VUIixwYXRoOlsuLi5lLGldLm1hcChvPT5vLnRvU3RyaW5nKCkpLHZhbHVlOkV9LEIpLnRoZW4oail9LGFwcGx5KGcsaSxDKXtwQShJKTtsZXQgRT1lW2UubGVuZ3RoLTFdO2lmKEU9PT1fdClyZXR1cm4gVihBLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGopO2lmKEU9PT0iYmluZCIpcmV0dXJuIFdBKEEsZS5zbGljZSgwLC0xKSk7bGV0W0Isb109U2UoQyk7cmV0dXJuIFYoQSx7dHlwZToiQVBQTFkiLHBhdGg6ZS5tYXAoYT0+YS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6Qn0sbykudGhlbihqKX0sY29uc3RydWN0KGcsaSl7cEEoSSk7bGV0W0MsRV09U2UoaSk7cmV0dXJuIFYoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOmUubWFwKEI9PkIudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OkN9LEUpLnRoZW4oail9fSk7cmV0dXJuIHRJKHIsQSkscn1mdW5jdGlvbiBySShBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBTZShBKXtsZXQgZT1BLm1hcCh5QSk7cmV0dXJuW2UubWFwKHQ9PnRbMF0pLHJJKGUubWFwKHQ9PnRbMV0pKV19dmFyIGJlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFpBKEEsZSl7cmV0dXJuIGJlLnNldChBLGUpLEF9ZnVuY3Rpb24gZ0koQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W0ZlXTohMH0pfWZ1bmN0aW9uIHlBKEEpe2ZvcihsZXRbZSx0XW9mIGtlKWlmKHQuY2FuSGFuZGxlKEEpKXtsZXRbSSxyXT10LnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6ZSx2YWx1ZTpJfSxyXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0sYmUuZ2V0KEEpfHxbXV19ZnVuY3Rpb24gaihBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBrZS5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIFYoQSxlLHQpe3JldHVybiBuZXcgUHJvbWlzZShJPT57bGV0IHI9aUkoKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGcoaSl7IWkuZGF0YXx8IWkuZGF0YS5pZHx8aS5kYXRhLmlkIT09cnx8KEEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZyksSShpLmRhdGEpKX0pLEEuc3RhcnQmJkEuc3RhcnQoKSxBLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnJ9LGUpLHQpfSl9ZnVuY3Rpb24gaUkoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfWZ1bmN0aW9uIHJBKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6b0l9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOl9BfT1PYmplY3QsbUE9KEE9PmU9PntsZXQgdD1vSS5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksRz1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+bUEoZSk9PT1BKSxTQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6WH09QXJyYXksZ0E9U0EoInVuZGVmaW5lZCIpO2Z1bmN0aW9uIG5JKEEpe3JldHVybiBBIT09bnVsbCYmIWdBKEEpJiZBLmNvbnN0cnVjdG9yIT09bnVsbCYmIWdBKEEuY29uc3RydWN0b3IpJiZVKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciBIZT1HKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIGFJKEEpe2xldCBlO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/ZT1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6ZT1BJiZBLmJ1ZmZlciYmSGUoQS5idWZmZXIpLGV9dmFyIHNJPVNBKCJzdHJpbmciKSxVPVNBKCJmdW5jdGlvbiIpLFllPVNBKCJudW1iZXIiKSxGQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLENJPUE9PkE9PT0hMHx8QT09PSExLHdBPUE9PntpZihtQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCBlPV9BKEEpO3JldHVybihlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LEJJPUcoIkRhdGUiKSxRST1HKCJGaWxlIiksRUk9RygiQmxvYiIpLGNJPUcoIkZpbGVMaXN0IiksbEk9QT0+RkEoQSkmJlUoQS5waXBlKSxmST1BPT57bGV0IGU7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8VShBLmFwcGVuZCkmJigoZT1tQShBKSk9PT0iZm9ybWRhdGEifHxlPT09Im9iamVjdCImJlUoQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sdUk9RygiVVJMU2VhcmNoUGFyYW1zIiksW3BJLGRJLGhJLERJXT1bIlJlYWRhYmxlU3RyZWFtIiwiUmVxdWVzdCIsIlJlc3BvbnNlIiwiSGVhZGVycyJdLm1hcChHKSx5ST1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywiIik7ZnVuY3Rpb24gaUEoQSxlLHthbGxPd25LZXlzOnQ9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgSSxyO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxYKEEpKWZvcihJPTAscj1BLmxlbmd0aDtJPHI7SSsrKWUuY2FsbChudWxsLEFbSV0sSSxBKTtlbHNle2xldCBnPXQ/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksaT1nLmxlbmd0aCxDO2ZvcihJPTA7STxpO0krKylDPWdbSV0sZS5jYWxsKG51bGwsQVtDXSxDLEEpfX1mdW5jdGlvbiBxZShBLGUpe2U9ZS50b0xvd2VyQ2FzZSgpO2xldCB0PU9iamVjdC5rZXlzKEEpLEk9dC5sZW5ndGgscjtmb3IoO0ktLSA+MDspaWYocj10W0ldLGU9PT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHI7cmV0dXJuIG51bGx9dmFyIHY9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxUZT1BPT4hZ0EoQSkmJkEhPT12O2Z1bmN0aW9uIFhBKCl7bGV0e2Nhc2VsZXNzOkF9PVRlKHRoaXMpJiZ0aGlzfHx7fSxlPXt9LHQ9KEkscik9PntsZXQgZz1BJiZxZShlLHIpfHxyO3dBKGVbZ10pJiZ3QShJKT9lW2ddPVhBKGVbZ10sSSk6d0EoSSk/ZVtnXT1YQSh7fSxJKTpYKEkpP2VbZ109SS5zbGljZSgpOmVbZ109SX07Zm9yKGxldCBJPTAscj1hcmd1bWVudHMubGVuZ3RoO0k8cjtJKyspYXJndW1lbnRzW0ldJiZpQShhcmd1bWVudHNbSV0sdCk7cmV0dXJuIGV9dmFyIHdJPShBLGUsdCx7YWxsT3duS2V5czpJfT17fSk9PihpQShlLChyLGcpPT57dCYmVShyKT9BW2ddPXJBKHIsdCk6QVtnXT1yfSx7YWxsT3duS2V5czpJfSksQSksbUk9QT0+KEEuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYoQT1BLnNsaWNlKDEpKSxBKSxTST0oQSxlLHQsSSk9PntBLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLEkpLEEucHJvdG90eXBlLmNvbnN0cnVjdG9yPUEsT2JqZWN0LmRlZmluZVByb3BlcnR5KEEsInN1cGVyIix7dmFsdWU6ZS5wcm90b3R5cGV9KSx0JiZPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLHQpfSxGST0oQSxlLHQsSSk9PntsZXQgcixnLGksQz17fTtpZihlPWV8fHt9LEE9PW51bGwpcmV0dXJuIGU7ZG97Zm9yKHI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSksZz1yLmxlbmd0aDtnLS0gPjA7KWk9cltnXSwoIUl8fEkoaSxBLGUpKSYmIUNbaV0mJihlW2ldPUFbaV0sQ1tpXT0hMCk7QT10IT09ITEmJl9BKEEpfXdoaWxlKEEmJighdHx8dChBLGUpKSYmQSE9PU9iamVjdC5wcm90b3R5cGUpO3JldHVybiBlfSxSST0oQSxlLHQpPT57QT1TdHJpbmcoQSksKHQ9PT12b2lkIDB8fHQ+QS5sZW5ndGgpJiYodD1BLmxlbmd0aCksdC09ZS5sZW5ndGg7bGV0IEk9QS5pbmRleE9mKGUsdCk7cmV0dXJuIEkhPT0tMSYmST09PXR9LGtJPUE9PntpZighQSlyZXR1cm4gbnVsbDtpZihYKEEpKXJldHVybiBBO2xldCBlPUEubGVuZ3RoO2lmKCFZZShlKSlyZXR1cm4gbnVsbDtsZXQgdD1uZXcgQXJyYXkoZSk7Zm9yKDtlLS0gPjA7KXRbZV09QVtlXTtyZXR1cm4gdH0sVUk9KEE9PmU9PkEmJmUgaW5zdGFuY2VvZiBBKSh0eXBlb2YgVWludDhBcnJheTwidSImJl9BKFVpbnQ4QXJyYXkpKSxOST0oQSxlKT0+e2xldCBJPShBJiZBW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoQSkscjtmb3IoOyhyPUkubmV4dCgpKSYmIXIuZG9uZTspe2xldCBnPXIudmFsdWU7ZS5jYWxsKEEsZ1swXSxnWzFdKX19LEdJPShBLGUpPT57bGV0IHQsST1bXTtmb3IoOyh0PUEuZXhlYyhlKSkhPT1udWxsOylJLnB1c2godCk7cmV0dXJuIEl9LGJJPUcoIkhUTUxGb3JtRWxlbWVudCIpLExJPUE9PkEudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cc10oW2EtelxkXSkoXHcqKS9nLGZ1bmN0aW9uKHQsSSxyKXtyZXR1cm4gSS50b1VwcGVyQ2FzZSgpK3J9KSxKZT0oKHtoYXNPd25Qcm9wZXJ0eTpBfSk9PihlLHQpPT5BLmNhbGwoZSx0KSkoT2JqZWN0LnByb3RvdHlwZSksSkk9RygiUmVnRXhwIiksT2U9KEEsZSk9PntsZXQgdD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhBKSxJPXt9O2lBKHQsKHIsZyk9PntsZXQgaTsoaT1lKHIsZyxBKSkhPT0hMSYmKElbZ109aXx8cil9KSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLEkpfSxNST1BPT57T2UoQSwoZSx0KT0+e2lmKFUoQSkmJlsiYXJndW1lbnRzIiwiY2FsbGVyIiwiY2FsbGVlIl0uaW5kZXhPZih0KSE9PS0xKXJldHVybiExO2xldCBJPUFbdF07aWYoVShJKSl7aWYoZS5lbnVtZXJhYmxlPSExLCJ3cml0YWJsZSJpbiBlKXtlLndyaXRhYmxlPSExO3JldHVybn1lLnNldHx8KGUuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK3QrIiciKX0pfX0pfSxIST0oQSxlKT0+e2xldCB0PXt9LEk9cj0+e3IuZm9yRWFjaChnPT57dFtnXT0hMH0pfTtyZXR1cm4gWChBKT9JKEEpOkkoU3RyaW5nKEEpLnNwbGl0KGUpKSx0fSxZST0oKT0+e30scUk9KEEsZSk9PkEhPW51bGwmJk51bWJlci5pc0Zpbml0ZShBPStBKT9BOmUsVkE9ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IixNZT0iMDEyMzQ1Njc4OSIsS2U9e0RJR0lUOk1lLEFMUEhBOlZBLEFMUEhBX0RJR0lUOlZBK1ZBLnRvVXBwZXJDYXNlKCkrTWV9LFRJPShBPTE2LGU9S2UuQUxQSEFfRElHSVQpPT57bGV0IHQ9IiIse2xlbmd0aDpJfT1lO2Zvcig7QS0tOyl0Kz1lW01hdGgucmFuZG9tKCkqSXwwXTtyZXR1cm4gdH07ZnVuY3Rpb24gT0koQSl7cmV0dXJuISEoQSYmVShBLmFwcGVuZCkmJkFbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJGb3JtRGF0YSImJkFbU3ltYm9sLml0ZXJhdG9yXSl9dmFyIEtJPUE9PntsZXQgZT1uZXcgQXJyYXkoMTApLHQ9KEkscik9PntpZihGQShJKSl7aWYoZS5pbmRleE9mKEkpPj0wKXJldHVybjtpZighKCJ0b0pTT04iaW4gSSkpe2Vbcl09STtsZXQgZz1YKEkpP1tdOnt9O3JldHVybiBpQShJLChpLEMpPT57bGV0IEU9dChpLHIrMSk7IWdBKEUpJiYoZ1tDXT1FKX0pLGVbcl09dm9pZCAwLGd9fXJldHVybiBJfTtyZXR1cm4gdChBLDApfSx4ST1HKCJBc3luY0Z1bmN0aW9uIiksUEk9QT0+QSYmKEZBKEEpfHxVKEEpKSYmVShBLnRoZW4pJiZVKEEuY2F0Y2gpLHhlPSgoQSxlKT0+QT9zZXRJbW1lZGlhdGU6ZT8oKHQsSSk9Pih2LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh7c291cmNlOnIsZGF0YTpnfSk9PntyPT09diYmZz09PXQmJkkubGVuZ3RoJiZJLnNoaWZ0KCkoKX0sITEpLHI9PntJLnB1c2gociksdi5wb3N0TWVzc2FnZSh0LCIqIil9KSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLFtdKTp0PT5zZXRUaW1lb3V0KHQpKSh0eXBlb2Ygc2V0SW1tZWRpYXRlPT0iZnVuY3Rpb24iLFUodi5wb3N0TWVzc2FnZSkpLFdJPXR5cGVvZiBxdWV1ZU1pY3JvdGFzazwidSI/cXVldWVNaWNyb3Rhc2suYmluZCh2KTp0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MubmV4dFRpY2t8fHhlLG49e2lzQXJyYXk6WCxpc0FycmF5QnVmZmVyOkhlLGlzQnVmZmVyOm5JLGlzRm9ybURhdGE6ZkksaXNBcnJheUJ1ZmZlclZpZXc6YUksaXNTdHJpbmc6c0ksaXNOdW1iZXI6WWUsaXNCb29sZWFuOkNJLGlzT2JqZWN0OkZBLGlzUGxhaW5PYmplY3Q6d0EsaXNSZWFkYWJsZVN0cmVhbTpwSSxpc1JlcXVlc3Q6ZEksaXNSZXNwb25zZTpoSSxpc0hlYWRlcnM6REksaXNVbmRlZmluZWQ6Z0EsaXNEYXRlOkJJLGlzRmlsZTpRSSxpc0Jsb2I6RUksaXNSZWdFeHA6SkksaXNGdW5jdGlvbjpVLGlzU3RyZWFtOmxJLGlzVVJMU2VhcmNoUGFyYW1zOnVJLGlzVHlwZWRBcnJheTpVSSxpc0ZpbGVMaXN0OmNJLGZvckVhY2g6aUEsbWVyZ2U6WEEsZXh0ZW5kOndJLHRyaW06eUksc3RyaXBCT006bUksaW5oZXJpdHM6U0ksdG9GbGF0T2JqZWN0OkZJLGtpbmRPZjptQSxraW5kT2ZUZXN0OkcsZW5kc1dpdGg6UkksdG9BcnJheTprSSxmb3JFYWNoRW50cnk6TkksbWF0Y2hBbGw6R0ksaXNIVE1MRm9ybTpiSSxoYXNPd25Qcm9wZXJ0eTpKZSxoYXNPd25Qcm9wOkplLHJlZHVjZURlc2NyaXB0b3JzOk9lLGZyZWV6ZU1ldGhvZHM6TUksdG9PYmplY3RTZXQ6SEksdG9DYW1lbENhc2U6TEksbm9vcDpZSSx0b0Zpbml0ZU51bWJlcjpxSSxmaW5kS2V5OnFlLGdsb2JhbDp2LGlzQ29udGV4dERlZmluZWQ6VGUsQUxQSEFCRVQ6S2UsZ2VuZXJhdGVTdHJpbmc6VEksaXNTcGVjQ29tcGxpYW50Rm9ybTpPSSx0b0pTT05PYmplY3Q6S0ksaXNBc3luY0ZuOnhJLGlzVGhlbmFibGU6UEksc2V0SW1tZWRpYXRlOnhlLGFzYXA6V0l9O2Z1bmN0aW9uIF8oQSxlLHQsSSxyKXtFcnJvci5jYWxsKHRoaXMpLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6dGhpcy5zdGFjaz1uZXcgRXJyb3IoKS5zdGFjayx0aGlzLm1lc3NhZ2U9QSx0aGlzLm5hbWU9IkF4aW9zRXJyb3IiLGUmJih0aGlzLmNvZGU9ZSksdCYmKHRoaXMuY29uZmlnPXQpLEkmJih0aGlzLnJlcXVlc3Q9SSksciYmKHRoaXMucmVzcG9uc2U9cix0aGlzLnN0YXR1cz1yLnN0YXR1cz9yLnN0YXR1czpudWxsKX1uLmluaGVyaXRzKF8sRXJyb3Ise3RvSlNPTjpmdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpuLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMuc3RhdHVzfX19KTt2YXIgUGU9Xy5wcm90b3R5cGUsV2U9e307WyJFUlJfQkFEX09QVElPTl9WQUxVRSIsIkVSUl9CQURfT1BUSU9OIiwiRUNPTk5BQk9SVEVEIiwiRVRJTUVET1VUIiwiRVJSX05FVFdPUksiLCJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTIiwiRVJSX0RFUFJFQ0FURUQiLCJFUlJfQkFEX1JFU1BPTlNFIiwiRVJSX0JBRF9SRVFVRVNUIiwiRVJSX0NBTkNFTEVEIiwiRVJSX05PVF9TVVBQT1JUIiwiRVJSX0lOVkFMSURfVVJMIl0uZm9yRWFjaChBPT57V2VbQV09e3ZhbHVlOkF9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXyxXZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFBlLCJpc0F4aW9zRXJyb3IiLHt2YWx1ZTohMH0pO18uZnJvbT0oQSxlLHQsSSxyLGcpPT57bGV0IGk9T2JqZWN0LmNyZWF0ZShQZSk7cmV0dXJuIG4udG9GbGF0T2JqZWN0KEEsaSxmdW5jdGlvbihFKXtyZXR1cm4gRSE9PUVycm9yLnByb3RvdHlwZX0sQz0+QyE9PSJpc0F4aW9zRXJyb3IiKSxfLmNhbGwoaSxBLm1lc3NhZ2UsZSx0LEksciksaS5jYXVzZT1BLGkubmFtZT1BLm5hbWUsZyYmT2JqZWN0LmFzc2lnbihpLGcpLGl9O3ZhciBwPV87dmFyIFJBPW51bGw7ZnVuY3Rpb24gekEoQSl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChBKXx8bi5pc0FycmF5KEEpfWZ1bmN0aW9uIHZlKEEpe3JldHVybiBuLmVuZHNXaXRoKEEsIltdIik/QS5zbGljZSgwLC0yKTpBfWZ1bmN0aW9uIGplKEEsZSx0KXtyZXR1cm4gQT9BLmNvbmNhdChlKS5tYXAoZnVuY3Rpb24ocixnKXtyZXR1cm4gcj12ZShyKSwhdCYmZz8iWyIrcisiXSI6cn0pLmpvaW4odD8iLiI6IiIpOmV9ZnVuY3Rpb24gakkoQSl7cmV0dXJuIG4uaXNBcnJheShBKSYmIUEuc29tZSh6QSl9dmFyIHZJPW4udG9GbGF0T2JqZWN0KG4se30sbnVsbCxmdW5jdGlvbihlKXtyZXR1cm4vXmlzW0EtWl0vLnRlc3QoZSl9KTtmdW5jdGlvbiBaSShBLGUsdCl7aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7ZT1lfHxuZXcoUkF8fEZvcm1EYXRhKSx0PW4udG9GbGF0T2JqZWN0KHQse21ldGFUb2tlbnM6ITAsZG90czohMSxpbmRleGVzOiExfSwhMSxmdW5jdGlvbihmLGMpe3JldHVybiFuLmlzVW5kZWZpbmVkKGNbZl0pfSk7bGV0IEk9dC5tZXRhVG9rZW5zLHI9dC52aXNpdG9yfHxvLGc9dC5kb3RzLGk9dC5pbmRleGVzLEU9KHQuQmxvYnx8dHlwZW9mIEJsb2I8InUiJiZCbG9iKSYmbi5pc1NwZWNDb21wbGlhbnRGb3JtKGUpO2lmKCFuLmlzRnVuY3Rpb24ocikpdGhyb3cgbmV3IFR5cGVFcnJvcigidmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmdW5jdGlvbiBCKFEpe2lmKFE9PT1udWxsKXJldHVybiIiO2lmKG4uaXNEYXRlKFEpKXJldHVybiBRLnRvSVNPU3RyaW5nKCk7aWYoIUUmJm4uaXNCbG9iKFEpKXRocm93IG5ldyBwKCJCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLiIpO3JldHVybiBuLmlzQXJyYXlCdWZmZXIoUSl8fG4uaXNUeXBlZEFycmF5KFEpP0UmJnR5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFtRXSk6QnVmZmVyLmZyb20oUSk6UX1mdW5jdGlvbiBvKFEsZixjKXtsZXQgdT1RO2lmKFEmJiFjJiZ0eXBlb2YgUT09Im9iamVjdCIpe2lmKG4uZW5kc1dpdGgoZiwie30iKSlmPUk/ZjpmLnNsaWNlKDAsLTIpLFE9SlNPTi5zdHJpbmdpZnkoUSk7ZWxzZSBpZihuLmlzQXJyYXkoUSkmJmpJKFEpfHwobi5pc0ZpbGVMaXN0KFEpfHxuLmVuZHNXaXRoKGYsIltdIikpJiYodT1uLnRvQXJyYXkoUSkpKXJldHVybiBmPXZlKGYpLHUuZm9yRWFjaChmdW5jdGlvbihELE4peyEobi5pc1VuZGVmaW5lZChEKXx8RD09PW51bGwpJiZlLmFwcGVuZChpPT09ITA/amUoW2ZdLE4sZyk6aT09PW51bGw/ZjpmKyJbXSIsQihEKSl9KSwhMX1yZXR1cm4gekEoUSk/ITA6KGUuYXBwZW5kKGplKGMsZixnKSxCKFEpKSwhMSl9bGV0IGE9W10sbD1PYmplY3QuYXNzaWduKHZJLHtkZWZhdWx0VmlzaXRvcjpvLGNvbnZlcnRWYWx1ZTpCLGlzVmlzaXRhYmxlOnpBfSk7ZnVuY3Rpb24gcyhRLGYpe2lmKCFuLmlzVW5kZWZpbmVkKFEpKXtpZihhLmluZGV4T2YoUSkhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrZi5qb2luKCIuIikpO2EucHVzaChRKSxuLmZvckVhY2goUSxmdW5jdGlvbih1LGgpeyghKG4uaXNVbmRlZmluZWQodSl8fHU9PT1udWxsKSYmci5jYWxsKGUsdSxuLmlzU3RyaW5nKGgpP2gudHJpbSgpOmgsZixsKSk9PT0hMCYmcyh1LGY/Zi5jb25jYXQoaCk6W2hdKX0pLGEucG9wKCl9fWlmKCFuLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoImRhdGEgbXVzdCBiZSBhbiBvYmplY3QiKTtyZXR1cm4gcyhBKSxlfXZhciBPPVpJO2Z1bmN0aW9uIFplKEEpe2xldCBlPXsiISI6IiUyMSIsIiciOiIlMjciLCIoIjoiJTI4IiwiKSI6IiUyOSIsIn4iOiIlN0UiLCIlMjAiOiIrIiwiJTAwIjoiXDAifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLGZ1bmN0aW9uKEkpe3JldHVybiBlW0ldfSl9ZnVuY3Rpb24gVmUoQSxlKXt0aGlzLl9wYWlycz1bXSxBJiZPKEEsdGhpcyxlKX12YXIgWGU9VmUucHJvdG90eXBlO1hlLmFwcGVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX3BhaXJzLnB1c2goW2UsdF0pfTtYZS50b1N0cmluZz1mdW5jdGlvbihlKXtsZXQgdD1lP2Z1bmN0aW9uKEkpe3JldHVybiBlLmNhbGwodGhpcyxJLFplKX06WmU7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gdChyWzBdKSsiPSIrdChyWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIGtBPVZlO2Z1bmN0aW9uIFZJKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfWZ1bmN0aW9uIG9BKEEsZSx0KXtpZighZSlyZXR1cm4gQTtsZXQgST10JiZ0LmVuY29kZXx8Vkk7bi5pc0Z1bmN0aW9uKHQpJiYodD17c2VyaWFsaXplOnR9KTtsZXQgcj10JiZ0LnNlcmlhbGl6ZSxnO2lmKHI/Zz1yKGUsdCk6Zz1uLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcga0EoZSx0KS50b1N0cmluZyhJKSxnKXtsZXQgaT1BLmluZGV4T2YoIiMiKTtpIT09LTEmJihBPUEuc2xpY2UoMCxpKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrZ31yZXR1cm4gQX12YXIgJEE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQsSSl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpJP0kuc3luY2hyb25vdXM6ITEscnVuV2hlbjpJP0kucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe24uZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKEkpe0khPT1udWxsJiZlKEkpfSl9fSxBZT0kQTt2YXIgVUE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciBfZT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6a0E7dmFyIHplPXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgJGU9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgQXQ9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6X2UsRm9ybURhdGE6emUsQmxvYjokZX0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciBJZT17fTtQdChJZSx7aGFzQnJvd3NlckVudjooKT0+dGUsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5YSSxoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9Pl9JLG5hdmlnYXRvcjooKT0+ZWUsb3JpZ2luOigpPT56SX0pO3ZhciB0ZT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixlZT10eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yfHx2b2lkIDAsWEk9dGUmJighZWV8fFsiUmVhY3ROYXRpdmUiLCJOYXRpdmVTY3JpcHQiLCJOUyJdLmluZGV4T2YoZWUucHJvZHVjdCk8MCksX0k9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLHpJPXRlJiZ3aW5kb3cubG9jYXRpb24uaHJlZnx8Imh0dHA6Ly9sb2NhbGhvc3QiO3ZhciB5PXsuLi5JZSwuLi5BdH07ZnVuY3Rpb24gcmUoQSxlKXtyZXR1cm4gTyhBLG5ldyB5LmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLE9iamVjdC5hc3NpZ24oe3Zpc2l0b3I6ZnVuY3Rpb24odCxJLHIsZyl7cmV0dXJuIHkuaXNOb2RlJiZuLmlzQnVmZmVyKHQpPyh0aGlzLmFwcGVuZChJLHQudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6Zy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxlKSl9ZnVuY3Rpb24gJEkoQSl7cmV0dXJuIG4ubWF0Y2hBbGwoL1x3K3xcWyhcdyopXS9nLEEpLm1hcChlPT5lWzBdPT09IltdIj8iIjplWzFdfHxlWzBdKX1mdW5jdGlvbiBBcihBKXtsZXQgZT17fSx0PU9iamVjdC5rZXlzKEEpLEkscj10Lmxlbmd0aCxnO2ZvcihJPTA7STxyO0krKylnPXRbSV0sZVtnXT1BW2ddO3JldHVybiBlfWZ1bmN0aW9uIGVyKEEpe2Z1bmN0aW9uIGUodCxJLHIsZyl7bGV0IGk9dFtnKytdO2lmKGk9PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgQz1OdW1iZXIuaXNGaW5pdGUoK2kpLEU9Zz49dC5sZW5ndGg7cmV0dXJuIGk9IWkmJm4uaXNBcnJheShyKT9yLmxlbmd0aDppLEU/KG4uaGFzT3duUHJvcChyLGkpP3JbaV09W3JbaV0sSV06cltpXT1JLCFDKTooKCFyW2ldfHwhbi5pc09iamVjdChyW2ldKSkmJihyW2ldPVtdKSxlKHQsSSxyW2ldLGcpJiZuLmlzQXJyYXkocltpXSkmJihyW2ldPUFyKHJbaV0pKSwhQyl9aWYobi5pc0Zvcm1EYXRhKEEpJiZuLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IHQ9e307cmV0dXJuIG4uZm9yRWFjaEVudHJ5KEEsKEkscik9PntlKCRJKEkpLHIsdCwwKX0pLHR9cmV0dXJuIG51bGx9dmFyIE5BPWVyO2Z1bmN0aW9uIHRyKEEsZSx0KXtpZihuLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkoQSksbi50cmltKEEpfWNhdGNoKEkpe2lmKEkubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgSX1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBnZT17dHJhbnNpdGlvbmFsOlVBLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIiwiZmV0Y2giXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe2xldCBJPXQuZ2V0Q29udGVudFR5cGUoKXx8IiIscj1JLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxnPW4uaXNPYmplY3QoZSk7aWYoZyYmbi5pc0hUTUxGb3JtKGUpJiYoZT1uZXcgRm9ybURhdGEoZSkpLG4uaXNGb3JtRGF0YShlKSlyZXR1cm4gcj9KU09OLnN0cmluZ2lmeShOQShlKSk6ZTtpZihuLmlzQXJyYXlCdWZmZXIoZSl8fG4uaXNCdWZmZXIoZSl8fG4uaXNTdHJlYW0oZSl8fG4uaXNGaWxlKGUpfHxuLmlzQmxvYihlKXx8bi5pc1JlYWRhYmxlU3RyZWFtKGUpKXJldHVybiBlO2lmKG4uaXNBcnJheUJ1ZmZlclZpZXcoZSkpcmV0dXJuIGUuYnVmZmVyO2lmKG4uaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBDO2lmKGcpe2lmKEkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIHJlKGUsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoQz1uLmlzRmlsZUxpc3QoZSkpfHxJLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IEU9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBPKEM/eyJmaWxlc1tdIjplfTplLEUmJm5ldyBFLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gZ3x8cj8odC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLHRyKGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe2xldCB0PXRoaXMudHJhbnNpdGlvbmFsfHxnZS50cmFuc2l0aW9uYWwsST10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLHI9dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYobi5pc1Jlc3BvbnNlKGUpfHxuLmlzUmVhZGFibGVTdHJlYW0oZSkpcmV0dXJuIGU7aWYoZSYmbi5pc1N0cmluZyhlKSYmKEkmJiF0aGlzLnJlc3BvbnNlVHlwZXx8cikpe2xldCBpPSEodCYmdC5zaWxlbnRKU09OUGFyc2luZykmJnI7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKEMpe2lmKGkpdGhyb3cgQy5uYW1lPT09IlN5bnRheEVycm9yIj9wLmZyb20oQyxwLkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOkN9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTp5LmNsYXNzZXMuRm9ybURhdGEsQmxvYjp5LmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e2dlLmhlYWRlcnNbQV09e319KTt2YXIgej1nZTt2YXIgSXI9bi50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSxldD1BPT57bGV0IGU9e30sdCxJLHI7cmV0dXJuIEEmJkEuc3BsaXQoYApgKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe3I9aS5pbmRleE9mKCI6IiksdD1pLnN1YnN0cmluZygwLHIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLEk9aS5zdWJzdHJpbmcocisxKS50cmltKCksISghdHx8ZVt0XSYmSXJbdF0pJiYodD09PSJzZXQtY29va2llIj9lW3RdP2VbdF0ucHVzaChJKTplW3RdPVtJXTplW3RdPWVbdF0/ZVt0XSsiLCAiK0k6SSl9KSxlfTt2YXIgdHQ9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBuQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEdBKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTpuLmlzQXJyYXkoQSk/QS5tYXAoR0EpOlN0cmluZyhBKX1mdW5jdGlvbiBycihBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZyxJO2Zvcig7ST10LmV4ZWMoQSk7KWVbSVsxXV09SVsyXTtyZXR1cm4gZX12YXIgZ3I9QT0+L15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24gaWUoQSxlLHQsSSxyKXtpZihuLmlzRnVuY3Rpb24oSSkpcmV0dXJuIEkuY2FsbCh0aGlzLGUsdCk7aWYociYmKGU9dCksISFuLmlzU3RyaW5nKGUpKXtpZihuLmlzU3RyaW5nKEkpKXJldHVybiBlLmluZGV4T2YoSSkhPT0tMTtpZihuLmlzUmVnRXhwKEkpKXJldHVybiBJLnRlc3QoZSl9fWZ1bmN0aW9uIGlyKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKGUsdCxJKT0+dC50b1VwcGVyQ2FzZSgpK0kpfWZ1bmN0aW9uIG9yKEEsZSl7bGV0IHQ9bi50b0NhbWVsQ2FzZSgiICIrZSk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKEk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxJK3Qse3ZhbHVlOmZ1bmN0aW9uKHIsZyxpKXtyZXR1cm4gdGhpc1tJXS5jYWxsKHRoaXMsZSxyLGcsaSl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyICQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxJKXtsZXQgcj10aGlzO2Z1bmN0aW9uIGcoQyxFLEIpe2xldCBvPW5BKEUpO2lmKCFvKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgYT1uLmZpbmRLZXkocixvKTsoIWF8fHJbYV09PT12b2lkIDB8fEI9PT0hMHx8Qj09PXZvaWQgMCYmclthXSE9PSExKSYmKHJbYXx8RV09R0EoQykpfWxldCBpPShDLEUpPT5uLmZvckVhY2goQywoQixvKT0+ZyhCLG8sRSkpO2lmKG4uaXNQbGFpbk9iamVjdChlKXx8ZSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpaShlLHQpO2Vsc2UgaWYobi5pc1N0cmluZyhlKSYmKGU9ZS50cmltKCkpJiYhZ3IoZSkpaShldChlKSx0KTtlbHNlIGlmKG4uaXNIZWFkZXJzKGUpKWZvcihsZXRbQyxFXW9mIGUuZW50cmllcygpKWcoRSxDLEkpO2Vsc2UgZSE9bnVsbCYmZyh0LGUsSSk7cmV0dXJuIHRoaXN9Z2V0KGUsdCl7aWYoZT1uQShlKSxlKXtsZXQgST1uLmZpbmRLZXkodGhpcyxlKTtpZihJKXtsZXQgcj10aGlzW0ldO2lmKCF0KXJldHVybiByO2lmKHQ9PT0hMClyZXR1cm4gcnIocik7aWYobi5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxyLEkpO2lmKG4uaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhyKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1uQShlKSxlKXtsZXQgST1uLmZpbmRLZXkodGhpcyxlKTtyZXR1cm4hIShJJiZ0aGlzW0ldIT09dm9pZCAwJiYoIXR8fGllKHRoaXMsdGhpc1tJXSxJLHQpKSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7bGV0IEk9dGhpcyxyPSExO2Z1bmN0aW9uIGcoaSl7aWYoaT1uQShpKSxpKXtsZXQgQz1uLmZpbmRLZXkoSSxpKTtDJiYoIXR8fGllKEksSVtDXSxDLHQpKSYmKGRlbGV0ZSBJW0NdLHI9ITApfX1yZXR1cm4gbi5pc0FycmF5KGUpP2UuZm9yRWFjaChnKTpnKGUpLHJ9Y2xlYXIoZSl7bGV0IHQ9T2JqZWN0LmtleXModGhpcyksST10Lmxlbmd0aCxyPSExO2Zvcig7SS0tOyl7bGV0IGc9dFtJXTsoIWV8fGllKHRoaXMsdGhpc1tnXSxnLGUsITApKSYmKGRlbGV0ZSB0aGlzW2ddLHI9ITApfXJldHVybiByfW5vcm1hbGl6ZShlKXtsZXQgdD10aGlzLEk9e307cmV0dXJuIG4uZm9yRWFjaCh0aGlzLChyLGcpPT57bGV0IGk9bi5maW5kS2V5KEksZyk7aWYoaSl7dFtpXT1HQShyKSxkZWxldGUgdFtnXTtyZXR1cm59bGV0IEM9ZT9pcihnKTpTdHJpbmcoZykudHJpbSgpO0MhPT1nJiZkZWxldGUgdFtnXSx0W0NdPUdBKHIpLElbQ109ITB9KSx0aGlzfWNvbmNhdCguLi5lKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi5lKX10b0pTT04oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gbi5mb3JFYWNoKHRoaXMsKEkscik9PntJIT1udWxsJiZJIT09ITEmJih0W3JdPWUmJm4uaXNBcnJheShJKT9JLmpvaW4oIiwgIik6SSl9KSx0fVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtlLHRdKT0+ZSsiOiAiK3QpLmpvaW4oYApgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOm5ldyB0aGlzKGUpfXN0YXRpYyBjb25jYXQoZSwuLi50KXtsZXQgST1uZXcgdGhpcyhlKTtyZXR1cm4gdC5mb3JFYWNoKHI9Pkkuc2V0KHIpKSxJfXN0YXRpYyBhY2Nlc3NvcihlKXtsZXQgST0odGhpc1t0dF09dGhpc1t0dF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxyPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIGcoaSl7bGV0IEM9bkEoaSk7SVtDXXx8KG9yKHIsaSksSVtDXT0hMCl9cmV0dXJuIG4uaXNBcnJheShlKT9lLmZvckVhY2goZyk6ZyhlKSx0aGlzfX07JC5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7bi5yZWR1Y2VEZXNjcmlwdG9ycygkLnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQoSSl7dGhpc1t0XT1JfX19KTtuLmZyZWV6ZU1ldGhvZHMoJCk7dmFyIFM9JDtmdW5jdGlvbiBhQShBLGUpe2xldCB0PXRoaXN8fHosST1lfHx0LHI9Uy5mcm9tKEkuaGVhZGVycyksZz1JLmRhdGE7cmV0dXJuIG4uZm9yRWFjaChBLGZ1bmN0aW9uKEMpe2c9Qy5jYWxsKHQsZyxyLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLHIubm9ybWFsaXplKCksZ31mdW5jdGlvbiBzQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIEl0KEEsZSx0KXtwLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLHAuRVJSX0NBTkNFTEVELGUsdCksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1uLmluaGVyaXRzKEl0LHAse19fQ0FOQ0VMX186ITB9KTt2YXIgSj1JdDtmdW5jdGlvbiBDQShBLGUsdCl7bGV0IEk9dC5jb25maWcudmFsaWRhdGVTdGF0dXM7IXQuc3RhdHVzfHwhSXx8SSh0LnN0YXR1cyk/QSh0KTplKG5ldyBwKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMsW3AuRVJSX0JBRF9SRVFVRVNULHAuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcih0LnN0YXR1cy8xMDApLTRdLHQuY29uZmlnLHQucmVxdWVzdCx0KSl9ZnVuY3Rpb24gb2UoQSl7bGV0IGU9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoQSk7cmV0dXJuIGUmJmVbMV18fCIifWZ1bmN0aW9uIG5yKEEsZSl7QT1BfHwxMDtsZXQgdD1uZXcgQXJyYXkoQSksST1uZXcgQXJyYXkoQSkscj0wLGc9MCxpO3JldHVybiBlPWUhPT12b2lkIDA/ZToxZTMsZnVuY3Rpb24oRSl7bGV0IEI9RGF0ZS5ub3coKSxvPUlbZ107aXx8KGk9QiksdFtyXT1FLElbcl09QjtsZXQgYT1nLGw9MDtmb3IoO2EhPT1yOylsKz10W2ErK10sYT1hJUE7aWYocj0ocisxKSVBLHI9PT1nJiYoZz0oZysxKSVBKSxCLWk8ZSlyZXR1cm47bGV0IHM9byYmQi1vO3JldHVybiBzP01hdGgucm91bmQobCoxZTMvcyk6dm9pZCAwfX12YXIgcnQ9bnI7ZnVuY3Rpb24gYXIoQSxlKXtsZXQgdD0wLEk9MWUzL2UscixnLGk9KEIsbz1EYXRlLm5vdygpKT0+e3Q9byxyPW51bGwsZyYmKGNsZWFyVGltZW91dChnKSxnPW51bGwpLEEuYXBwbHkobnVsbCxCKX07cmV0dXJuWyguLi5CKT0+e2xldCBvPURhdGUubm93KCksYT1vLXQ7YT49ST9pKEIsbyk6KHI9QixnfHwoZz1zZXRUaW1lb3V0KCgpPT57Zz1udWxsLGkocil9LEktYSkpKX0sKCk9PnImJmkocildfXZhciBndD1hcjt2YXIgQUE9KEEsZSx0PTMpPT57bGV0IEk9MCxyPXJ0KDUwLDI1MCk7cmV0dXJuIGd0KGc9PntsZXQgaT1nLmxvYWRlZCxDPWcubGVuZ3RoQ29tcHV0YWJsZT9nLnRvdGFsOnZvaWQgMCxFPWktSSxCPXIoRSksbz1pPD1DO0k9aTtsZXQgYT17bG9hZGVkOmksdG90YWw6Qyxwcm9ncmVzczpDP2kvQzp2b2lkIDAsYnl0ZXM6RSxyYXRlOkJ8fHZvaWQgMCxlc3RpbWF0ZWQ6QiYmQyYmbz8oQy1pKS9COnZvaWQgMCxldmVudDpnLGxlbmd0aENvbXB1dGFibGU6QyE9bnVsbCxbZT8iZG93bmxvYWQiOiJ1cGxvYWQiXTohMH07QShhKX0sdCl9LG5lPShBLGUpPT57bGV0IHQ9QSE9bnVsbDtyZXR1cm5bST0+ZVswXSh7bGVuZ3RoQ29tcHV0YWJsZTp0LHRvdGFsOkEsbG9hZGVkOkl9KSxlWzFdXX0sYWU9QT0+KC4uLmUpPT5uLmFzYXAoKCk9PkEoLi4uZSkpO3ZhciBpdD15Lmhhc1N0YW5kYXJkQnJvd3NlckVudj8oKEEsZSk9PnQ9Pih0PW5ldyBVUkwodCx5Lm9yaWdpbiksQS5wcm90b2NvbD09PXQucHJvdG9jb2wmJkEuaG9zdD09PXQuaG9zdCYmKGV8fEEucG9ydD09PXQucG9ydCkpKShuZXcgVVJMKHkub3JpZ2luKSx5Lm5hdmlnYXRvciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdCh5Lm5hdmlnYXRvci51c2VyQWdlbnQpKTooKT0+ITA7dmFyIG90PXkuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLGUsdCxJLHIsZyl7bGV0IGk9W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudChlKV07bi5pc051bWJlcih0KSYmaS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUodCkudG9HTVRTdHJpbmcoKSksbi5pc1N0cmluZyhJKSYmaS5wdXNoKCJwYXRoPSIrSSksbi5pc1N0cmluZyhyKSYmaS5wdXNoKCJkb21haW49IityKSxnPT09ITAmJmkucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWkuam9pbigiOyAiKX0scmVhZChBKXtsZXQgZT1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrQSsiKT0oW147XSopIikpO3JldHVybiBlP2RlY29kZVVSSUNvbXBvbmVudChlWzNdKTpudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlKCl7fSxyZWFkKCl7cmV0dXJuIG51bGx9LHJlbW92ZSgpe319O2Z1bmN0aW9uIHNlKEEpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoQSl9ZnVuY3Rpb24gQ2UoQSxlKXtyZXR1cm4gZT9BLnJlcGxhY2UoL1wvP1wvJC8sIiIpKyIvIitlLnJlcGxhY2UoL15cLysvLCIiKTpBfWZ1bmN0aW9uIEJBKEEsZSl7cmV0dXJuIEEmJiFzZShlKT9DZShBLGUpOmV9dmFyIG50PUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIGIoQSxlKXtlPWV8fHt9O2xldCB0PXt9O2Z1bmN0aW9uIEkoQixvLGEsbCl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChCKSYmbi5pc1BsYWluT2JqZWN0KG8pP24ubWVyZ2UuY2FsbCh7Y2FzZWxlc3M6bH0sQixvKTpuLmlzUGxhaW5PYmplY3Qobyk/bi5tZXJnZSh7fSxvKTpuLmlzQXJyYXkobyk/by5zbGljZSgpOm99ZnVuY3Rpb24gcihCLG8sYSxsKXtpZihuLmlzVW5kZWZpbmVkKG8pKXtpZighbi5pc1VuZGVmaW5lZChCKSlyZXR1cm4gSSh2b2lkIDAsQixhLGwpfWVsc2UgcmV0dXJuIEkoQixvLGEsbCl9ZnVuY3Rpb24gZyhCLG8pe2lmKCFuLmlzVW5kZWZpbmVkKG8pKXJldHVybiBJKHZvaWQgMCxvKX1mdW5jdGlvbiBpKEIsbyl7aWYobi5pc1VuZGVmaW5lZChvKSl7aWYoIW4uaXNVbmRlZmluZWQoQikpcmV0dXJuIEkodm9pZCAwLEIpfWVsc2UgcmV0dXJuIEkodm9pZCAwLG8pfWZ1bmN0aW9uIEMoQixvLGEpe2lmKGEgaW4gZSlyZXR1cm4gSShCLG8pO2lmKGEgaW4gQSlyZXR1cm4gSSh2b2lkIDAsQil9bGV0IEU9e3VybDpnLG1ldGhvZDpnLGRhdGE6ZyxiYXNlVVJMOmksdHJhbnNmb3JtUmVxdWVzdDppLHRyYW5zZm9ybVJlc3BvbnNlOmkscGFyYW1zU2VyaWFsaXplcjppLHRpbWVvdXQ6aSx0aW1lb3V0TWVzc2FnZTppLHdpdGhDcmVkZW50aWFsczppLHdpdGhYU1JGVG9rZW46aSxhZGFwdGVyOmkscmVzcG9uc2VUeXBlOmkseHNyZkNvb2tpZU5hbWU6aSx4c3JmSGVhZGVyTmFtZTppLG9uVXBsb2FkUHJvZ3Jlc3M6aSxvbkRvd25sb2FkUHJvZ3Jlc3M6aSxkZWNvbXByZXNzOmksbWF4Q29udGVudExlbmd0aDppLG1heEJvZHlMZW5ndGg6aSxiZWZvcmVSZWRpcmVjdDppLHRyYW5zcG9ydDppLGh0dHBBZ2VudDppLGh0dHBzQWdlbnQ6aSxjYW5jZWxUb2tlbjppLHNvY2tldFBhdGg6aSxyZXNwb25zZUVuY29kaW5nOmksdmFsaWRhdGVTdGF0dXM6QyxoZWFkZXJzOihCLG8sYSk9PnIobnQoQiksbnQobyksYSwhMCl9O3JldHVybiBuLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLGUpKSxmdW5jdGlvbihvKXtsZXQgYT1FW29dfHxyLGw9YShBW29dLGVbb10sbyk7bi5pc1VuZGVmaW5lZChsKSYmYSE9PUN8fCh0W29dPWwpfSksdH12YXIgYkE9QT0+e2xldCBlPWIoe30sQSkse2RhdGE6dCx3aXRoWFNSRlRva2VuOkkseHNyZkhlYWRlck5hbWU6cix4c3JmQ29va2llTmFtZTpnLGhlYWRlcnM6aSxhdXRoOkN9PWU7ZS5oZWFkZXJzPWk9Uy5mcm9tKGkpLGUudXJsPW9BKEJBKGUuYmFzZVVSTCxlLnVybCksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxDJiZpLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgoQy51c2VybmFtZXx8IiIpKyI6IisoQy5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoQy5wYXNzd29yZCkpOiIiKSkpO2xldCBFO2lmKG4uaXNGb3JtRGF0YSh0KSl7aWYoeS5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fHkuaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KWkuc2V0Q29udGVudFR5cGUodm9pZCAwKTtlbHNlIGlmKChFPWkuZ2V0Q29udGVudFR5cGUoKSkhPT0hMSl7bGV0W0IsLi4ub109RT9FLnNwbGl0KCI7IikubWFwKGE9PmEudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik6W107aS5zZXRDb250ZW50VHlwZShbQnx8Im11bHRpcGFydC9mb3JtLWRhdGEiLC4uLm9dLmpvaW4oIjsgIikpfX1pZih5Lmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKEkmJm4uaXNGdW5jdGlvbihJKSYmKEk9SShlKSksSXx8SSE9PSExJiZpdChlLnVybCkpKXtsZXQgQj1yJiZnJiZvdC5yZWFkKGcpO0ImJmkuc2V0KHIsQil9cmV0dXJuIGV9O3ZhciBzcj10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLGF0PXNyJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxJKXtsZXQgcj1iQShBKSxnPXIuZGF0YSxpPVMuZnJvbShyLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6QyxvblVwbG9hZFByb2dyZXNzOkUsb25Eb3dubG9hZFByb2dyZXNzOkJ9PXIsbyxhLGwscyxRO2Z1bmN0aW9uIGYoKXtzJiZzKCksUSYmUSgpLHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobyksci5zaWduYWwmJnIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixvKX1sZXQgYz1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vcGVuKHIubWV0aG9kLnRvVXBwZXJDYXNlKCksci51cmwsITApLGMudGltZW91dD1yLnRpbWVvdXQ7ZnVuY3Rpb24gdSgpe2lmKCFjKXJldHVybjtsZXQgRD1TLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjJiZjLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxSPXtkYXRhOiFDfHxDPT09InRleHQifHxDPT09Impzb24iP2MucmVzcG9uc2VUZXh0OmMucmVzcG9uc2Usc3RhdHVzOmMuc3RhdHVzLHN0YXR1c1RleHQ6Yy5zdGF0dXNUZXh0LGhlYWRlcnM6RCxjb25maWc6QSxyZXF1ZXN0OmN9O0NBKGZ1bmN0aW9uKFcpe3QoVyksZigpfSxmdW5jdGlvbihXKXtJKFcpLGYoKX0sUiksYz1udWxsfSJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWN8fGMucmVhZHlTdGF0ZSE9PTR8fGMuc3RhdHVzPT09MCYmIShjLnJlc3BvbnNlVVJMJiZjLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dCh1KX0sYy5vbmFib3J0PWZ1bmN0aW9uKCl7YyYmKEkobmV3IHAoIlJlcXVlc3QgYWJvcnRlZCIscC5FQ09OTkFCT1JURUQsQSxjKSksYz1udWxsKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7SShuZXcgcCgiTmV0d29yayBFcnJvciIscC5FUlJfTkVUV09SSyxBLGMpKSxjPW51bGx9LGMub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IE49ci50aW1lb3V0PyJ0aW1lb3V0IG9mICIrci50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLFI9ci50cmFuc2l0aW9uYWx8fFVBO3IudGltZW91dEVycm9yTWVzc2FnZSYmKE49ci50aW1lb3V0RXJyb3JNZXNzYWdlKSxJKG5ldyBwKE4sUi5jbGFyaWZ5VGltZW91dEVycm9yP3AuRVRJTUVET1VUOnAuRUNPTk5BQk9SVEVELEEsYykpLGM9bnVsbH0sZz09PXZvaWQgMCYmaS5zZXRDb250ZW50VHlwZShudWxsKSwic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZuLmZvckVhY2goaS50b0pTT04oKSxmdW5jdGlvbihOLFIpe2Muc2V0UmVxdWVzdEhlYWRlcihSLE4pfSksbi5pc1VuZGVmaW5lZChyLndpdGhDcmVkZW50aWFscyl8fChjLndpdGhDcmVkZW50aWFscz0hIXIud2l0aENyZWRlbnRpYWxzKSxDJiZDIT09Impzb24iJiYoYy5yZXNwb25zZVR5cGU9ci5yZXNwb25zZVR5cGUpLEImJihbbCxRXT1BQShCLCEwKSxjLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixsKSksRSYmYy51cGxvYWQmJihbYSxzXT1BQShFKSxjLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsYSksYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVuZCIscykpLChyLmNhbmNlbFRva2VufHxyLnNpZ25hbCkmJihvPUQ9PntjJiYoSSghRHx8RC50eXBlP25ldyBKKG51bGwsQSxjKTpEKSxjLmFib3J0KCksYz1udWxsKX0sci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobyksci5zaWduYWwmJihyLnNpZ25hbC5hYm9ydGVkP28oKTpyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbykpKTtsZXQgaD1vZShyLnVybCk7aWYoaCYmeS5wcm90b2NvbHMuaW5kZXhPZihoKT09PS0xKXtJKG5ldyBwKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2grIjoiLHAuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59Yy5zZW5kKGd8fG51bGwpfSl9O3ZhciBDcj0oQSxlKT0+e2xldHtsZW5ndGg6dH09QT1BP0EuZmlsdGVyKEJvb2xlYW4pOltdO2lmKGV8fHQpe2xldCBJPW5ldyBBYm9ydENvbnRyb2xsZXIscixnPWZ1bmN0aW9uKEIpe2lmKCFyKXtyPSEwLEMoKTtsZXQgbz1CIGluc3RhbmNlb2YgRXJyb3I/Qjp0aGlzLnJlYXNvbjtJLmFib3J0KG8gaW5zdGFuY2VvZiBwP286bmV3IEoobyBpbnN0YW5jZW9mIEVycm9yP28ubWVzc2FnZTpvKSl9fSxpPWUmJnNldFRpbWVvdXQoKCk9PntpPW51bGwsZyhuZXcgcChgdGltZW91dCAke2V9IG9mIG1zIGV4Y2VlZGVkYCxwLkVUSU1FRE9VVCkpfSxlKSxDPSgpPT57QSYmKGkmJmNsZWFyVGltZW91dChpKSxpPW51bGwsQS5mb3JFYWNoKEI9PntCLnVuc3Vic2NyaWJlP0IudW5zdWJzY3JpYmUoZyk6Qi5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZyl9KSxBPW51bGwpfTtBLmZvckVhY2goQj0+Qi5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZykpO2xldHtzaWduYWw6RX09STtyZXR1cm4gRS51bnN1YnNjcmliZT0oKT0+bi5hc2FwKEMpLEV9fSxzdD1Dcjt2YXIgQnI9ZnVuY3Rpb24qKEEsZSl7bGV0IHQ9QS5ieXRlTGVuZ3RoO2lmKCFlfHx0PGUpe3lpZWxkIEE7cmV0dXJufWxldCBJPTAscjtmb3IoO0k8dDspcj1JK2UseWllbGQgQS5zbGljZShJLHIpLEk9cn0sUXI9YXN5bmMgZnVuY3Rpb24qKEEsZSl7Zm9yIGF3YWl0KGxldCB0IG9mIEVyKEEpKXlpZWxkKkJyKHQsZSl9LEVyPWFzeW5jIGZ1bmN0aW9uKihBKXtpZihBW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSl7eWllbGQqQTtyZXR1cm59bGV0IGU9QS5nZXRSZWFkZXIoKTt0cnl7Zm9yKDs7KXtsZXR7ZG9uZTp0LHZhbHVlOkl9PWF3YWl0IGUucmVhZCgpO2lmKHQpYnJlYWs7eWllbGQgSX19ZmluYWxseXthd2FpdCBlLmNhbmNlbCgpfX0sQmU9KEEsZSx0LEkpPT57bGV0IHI9UXIoQSxlKSxnPTAsaSxDPUU9PntpfHwoaT0hMCxJJiZJKEUpKX07cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7YXN5bmMgcHVsbChFKXt0cnl7bGV0e2RvbmU6Qix2YWx1ZTpvfT1hd2FpdCByLm5leHQoKTtpZihCKXtDKCksRS5jbG9zZSgpO3JldHVybn1sZXQgYT1vLmJ5dGVMZW5ndGg7aWYodCl7bGV0IGw9Zys9YTt0KGwpfUUuZW5xdWV1ZShuZXcgVWludDhBcnJheShvKSl9Y2F0Y2goQil7dGhyb3cgQyhCKSxCfX0sY2FuY2VsKEUpe3JldHVybiBDKEUpLHIucmV0dXJuKCl9fSx7aGlnaFdhdGVyTWFyazoyfSl9O3ZhciBKQT10eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJnR5cGVvZiBSZXF1ZXN0PT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2U9PSJmdW5jdGlvbiIsQnQ9SkEmJnR5cGVvZiBSZWFkYWJsZVN0cmVhbT09ImZ1bmN0aW9uIixjcj1KQSYmKHR5cGVvZiBUZXh0RW5jb2Rlcj09ImZ1bmN0aW9uIj8oQT0+ZT0+QS5lbmNvZGUoZSkpKG5ldyBUZXh0RW5jb2Rlcik6YXN5bmMgQT0+bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKEEpLmFycmF5QnVmZmVyKCkpKSxRdD0oQSwuLi5lKT0+e3RyeXtyZXR1cm4hIUEoLi4uZSl9Y2F0Y2h7cmV0dXJuITF9fSxscj1CdCYmUXQoKCk9PntsZXQgQT0hMSxlPW5ldyBSZXF1ZXN0KHkub3JpZ2luLHtib2R5Om5ldyBSZWFkYWJsZVN0cmVhbSxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gQT0hMCwiaGFsZiJ9fSkuaGVhZGVycy5oYXMoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBBJiYhZX0pLEN0PTY0KjEwMjQsUWU9QnQmJlF0KCgpPT5uLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCIiKS5ib2R5KSksTEE9e3N0cmVhbTpRZSYmKEE9PkEuYm9keSl9O0pBJiYoQT0+e1sidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaChlPT57IUxBW2VdJiYoTEFbZV09bi5pc0Z1bmN0aW9uKEFbZV0pP3Q9PnRbZV0oKToodCxJKT0+e3Rocm93IG5ldyBwKGBSZXNwb25zZSB0eXBlICcke2V9JyBpcyBub3Qgc3VwcG9ydGVkYCxwLkVSUl9OT1RfU1VQUE9SVCxJKX0pfSl9KShuZXcgUmVzcG9uc2UpO3ZhciBmcj1hc3luYyBBPT57aWYoQT09bnVsbClyZXR1cm4gMDtpZihuLmlzQmxvYihBKSlyZXR1cm4gQS5zaXplO2lmKG4uaXNTcGVjQ29tcGxpYW50Rm9ybShBKSlyZXR1cm4oYXdhaXQgbmV3IFJlcXVlc3QoeS5vcmlnaW4se21ldGhvZDoiUE9TVCIsYm9keTpBfSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KEEpfHxuLmlzQXJyYXlCdWZmZXIoQSkpcmV0dXJuIEEuYnl0ZUxlbmd0aDtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKEEpJiYoQT1BKyIiKSxuLmlzU3RyaW5nKEEpKXJldHVybihhd2FpdCBjcihBKSkuYnl0ZUxlbmd0aH0sdXI9YXN5bmMoQSxlKT0+e2xldCB0PW4udG9GaW5pdGVOdW1iZXIoQS5nZXRDb250ZW50TGVuZ3RoKCkpO3JldHVybiB0Pz9mcihlKX0sRXQ9SkEmJihhc3luYyBBPT57bGV0e3VybDplLG1ldGhvZDp0LGRhdGE6SSxzaWduYWw6cixjYW5jZWxUb2tlbjpnLHRpbWVvdXQ6aSxvbkRvd25sb2FkUHJvZ3Jlc3M6QyxvblVwbG9hZFByb2dyZXNzOkUscmVzcG9uc2VUeXBlOkIsaGVhZGVyczpvLHdpdGhDcmVkZW50aWFsczphPSJzYW1lLW9yaWdpbiIsZmV0Y2hPcHRpb25zOmx9PWJBKEEpO0I9Qj8oQisiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IHM9c3QoW3IsZyYmZy50b0Fib3J0U2lnbmFsKCldLGkpLFEsZj1zJiZzLnVuc3Vic2NyaWJlJiYoKCk9PntzLnVuc3Vic2NyaWJlKCl9KSxjO3RyeXtpZihFJiZsciYmdCE9PSJnZXQiJiZ0IT09ImhlYWQiJiYoYz1hd2FpdCB1cihvLEkpKSE9PTApe2xldCBSPW5ldyBSZXF1ZXN0KGUse21ldGhvZDoiUE9TVCIsYm9keTpJLGR1cGxleDoiaGFsZiJ9KSxUO2lmKG4uaXNGb3JtRGF0YShJKSYmKFQ9Ui5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikpJiZvLnNldENvbnRlbnRUeXBlKFQpLFIuYm9keSl7bGV0W1csdUFdPW5lKGMsQUEoYWUoRSkpKTtJPUJlKFIuYm9keSxDdCxXLHVBKX19bi5pc1N0cmluZyhhKXx8KGE9YT8iaW5jbHVkZSI6Im9taXQiKTtsZXQgdT0iY3JlZGVudGlhbHMiaW4gUmVxdWVzdC5wcm90b3R5cGU7UT1uZXcgUmVxdWVzdChlLHsuLi5sLHNpZ25hbDpzLG1ldGhvZDp0LnRvVXBwZXJDYXNlKCksaGVhZGVyczpvLm5vcm1hbGl6ZSgpLnRvSlNPTigpLGJvZHk6SSxkdXBsZXg6ImhhbGYiLGNyZWRlbnRpYWxzOnU/YTp2b2lkIDB9KTtsZXQgaD1hd2FpdCBmZXRjaChRKSxEPVFlJiYoQj09PSJzdHJlYW0ifHxCPT09InJlc3BvbnNlIik7aWYoUWUmJihDfHxEJiZmKSl7bGV0IFI9e307WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiaGVhZGVycyJdLmZvckVhY2gobWU9PntSW21lXT1oW21lXX0pO2xldCBUPW4udG9GaW5pdGVOdW1iZXIoaC5oZWFkZXJzLmdldCgiY29udGVudC1sZW5ndGgiKSksW1csdUFdPUMmJm5lKFQsQUEoYWUoQyksITApKXx8W107aD1uZXcgUmVzcG9uc2UoQmUoaC5ib2R5LEN0LFcsKCk9Pnt1QSYmdUEoKSxmJiZmKCl9KSxSKX1CPUJ8fCJ0ZXh0IjtsZXQgTj1hd2FpdCBMQVtuLmZpbmRLZXkoTEEsQil8fCJ0ZXh0Il0oaCxBKTtyZXR1cm4hRCYmZiYmZigpLGF3YWl0IG5ldyBQcm9taXNlKChSLFQpPT57Q0EoUixULHtkYXRhOk4saGVhZGVyczpTLmZyb20oaC5oZWFkZXJzKSxzdGF0dXM6aC5zdGF0dXMsc3RhdHVzVGV4dDpoLnN0YXR1c1RleHQsY29uZmlnOkEscmVxdWVzdDpRfSl9KX1jYXRjaCh1KXt0aHJvdyBmJiZmKCksdSYmdS5uYW1lPT09IlR5cGVFcnJvciImJi9mZXRjaC9pLnRlc3QodS5tZXNzYWdlKT9PYmplY3QuYXNzaWduKG5ldyBwKCJOZXR3b3JrIEVycm9yIixwLkVSUl9ORVRXT1JLLEEsUSkse2NhdXNlOnUuY2F1c2V8fHV9KTpwLmZyb20odSx1JiZ1LmNvZGUsQSxRKX19KTt2YXIgRWU9e2h0dHA6UkEseGhyOmF0LGZldGNoOkV0fTtuLmZvckVhY2goRWUsKEEsZSk9PntpZihBKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsIm5hbWUiLHt2YWx1ZTplfSl9Y2F0Y2h7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJhZGFwdGVyTmFtZSIse3ZhbHVlOmV9KX19KTt2YXIgY3Q9QT0+YC0gJHtBfWAscHI9QT0+bi5pc0Z1bmN0aW9uKEEpfHxBPT09bnVsbHx8QT09PSExLE1BPXtnZXRBZGFwdGVyOkE9PntBPW4uaXNBcnJheShBKT9BOltBXTtsZXR7bGVuZ3RoOmV9PUEsdCxJLHI9e307Zm9yKGxldCBnPTA7ZzxlO2crKyl7dD1BW2ddO2xldCBpO2lmKEk9dCwhcHIodCkmJihJPUVlWyhpPVN0cmluZyh0KSkudG9Mb3dlckNhc2UoKV0sST09PXZvaWQgMCkpdGhyb3cgbmV3IHAoYFVua25vd24gYWRhcHRlciAnJHtpfSdgKTtpZihJKWJyZWFrO3JbaXx8IiMiK2ddPUl9aWYoIUkpe2xldCBnPU9iamVjdC5lbnRyaWVzKHIpLm1hcCgoW0MsRV0pPT5gYWRhcHRlciAke0N9IGArKEU9PT0hMT8iaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQiOiJpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCIpKSxpPWU/Zy5sZW5ndGg+MT9gc2luY2UgOgpgK2cubWFwKGN0KS5qb2luKGAKYCk6IiAiK2N0KGdbMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IHAoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIitpLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gSX0sYWRhcHRlcnM6RWV9O2Z1bmN0aW9uIGNlKEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBKKG51bGwsQSl9ZnVuY3Rpb24gSEEoQSl7cmV0dXJuIGNlKEEpLEEuaGVhZGVycz1TLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9YUEuY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLE1BLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHx6LmFkYXB0ZXIpKEEpLnRoZW4oZnVuY3Rpb24oSSl7cmV0dXJuIGNlKEEpLEkuZGF0YT1hQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJKSxJLmhlYWRlcnM9Uy5mcm9tKEkuaGVhZGVycyksSX0sZnVuY3Rpb24oSSl7cmV0dXJuIHNBKEkpfHwoY2UoQSksSSYmSS5yZXNwb25zZSYmKEkucmVzcG9uc2UuZGF0YT1hQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJLnJlc3BvbnNlKSxJLnJlc3BvbnNlLmhlYWRlcnM9Uy5mcm9tKEkucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChJKX0pfXZhciBZQT0iMS43LjkiO3ZhciBxQT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKEEsZSk9PntxQVtBXT1mdW5jdGlvbihJKXtyZXR1cm4gdHlwZW9mIEk9PT1BfHwiYSIrKGU8MT8ibiAiOiIgIikrQX19KTt2YXIgbHQ9e307cUEudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxJKXtmdW5jdGlvbiByKGcsaSl7cmV0dXJuIltBeGlvcyB2IitZQSsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2crIiciK2krKEk/Ii4gIitJOiIiKX1yZXR1cm4oZyxpLEMpPT57aWYoZT09PSExKXRocm93IG5ldyBwKHIoaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkscC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIHQmJiFsdFtpXSYmKGx0W2ldPSEwLGNvbnNvbGUud2FybihyKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKGcsaSxDKTohMH19O3FBLnNwZWxsaW5nPWZ1bmN0aW9uKGUpe3JldHVybih0LEkpPT4oY29uc29sZS53YXJuKGAke0l9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7ZX1gKSwhMCl9O2Z1bmN0aW9uIGRyKEEsZSx0KXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IHAoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLHAuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCBJPU9iamVjdC5rZXlzKEEpLHI9SS5sZW5ndGg7Zm9yKDtyLS0gPjA7KXtsZXQgZz1JW3JdLGk9ZVtnXTtpZihpKXtsZXQgQz1BW2ddLEU9Qz09PXZvaWQgMHx8aShDLGcsQSk7aWYoRSE9PSEwKXRocm93IG5ldyBwKCJvcHRpb24gIitnKyIgbXVzdCBiZSAiK0UscC5FUlJfQkFEX09QVElPTl9WQUxVRSk7Y29udGludWV9aWYodCE9PSEwKXRocm93IG5ldyBwKCJVbmtub3duIG9wdGlvbiAiK2cscC5FUlJfQkFEX09QVElPTil9fXZhciBRQT17YXNzZXJ0T3B0aW9uczpkcix2YWxpZGF0b3JzOnFBfTt2YXIgTT1RQS52YWxpZGF0b3JzLGVBPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgQWUscmVzcG9uc2U6bmV3IEFlfX1hc3luYyByZXF1ZXN0KGUsdCl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGUsdCl9Y2F0Y2goSSl7aWYoSSBpbnN0YW5jZW9mIEVycm9yKXtsZXQgcj17fTtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShyKTpyPW5ldyBFcnJvcjtsZXQgZz1yLnN0YWNrP3Iuc3RhY2sucmVwbGFjZSgvXi4rXG4vLCIiKToiIjt0cnl7SS5zdGFjaz9nJiYhU3RyaW5nKEkuc3RhY2spLmVuZHNXaXRoKGcucmVwbGFjZSgvXi4rXG4uK1xuLywiIikpJiYoSS5zdGFjays9YApgK2cpOkkuc3RhY2s9Z31jYXRjaHt9fXRocm93IEl9fV9yZXF1ZXN0KGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sdD1iKHRoaXMuZGVmYXVsdHMsdCk7bGV0e3RyYW5zaXRpb25hbDpJLHBhcmFtc1NlcmlhbGl6ZXI6cixoZWFkZXJzOmd9PXQ7SSE9PXZvaWQgMCYmUUEuYXNzZXJ0T3B0aW9ucyhJLHtzaWxlbnRKU09OUGFyc2luZzpNLnRyYW5zaXRpb25hbChNLmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOk0udHJhbnNpdGlvbmFsKE0uYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpNLnRyYW5zaXRpb25hbChNLmJvb2xlYW4pfSwhMSksciE9bnVsbCYmKG4uaXNGdW5jdGlvbihyKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpyfTpRQS5hc3NlcnRPcHRpb25zKHIse2VuY29kZTpNLmZ1bmN0aW9uLHNlcmlhbGl6ZTpNLmZ1bmN0aW9ufSwhMCkpLFFBLmFzc2VydE9wdGlvbnModCx7YmFzZVVybDpNLnNwZWxsaW5nKCJiYXNlVVJMIiksd2l0aFhzcmZUb2tlbjpNLnNwZWxsaW5nKCJ3aXRoWFNSRlRva2VuIil9LCEwKSx0Lm1ldGhvZD0odC5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgaT1nJiZuLm1lcmdlKGcuY29tbW9uLGdbdC5tZXRob2RdKTtnJiZuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sUT0+e2RlbGV0ZSBnW1FdfSksdC5oZWFkZXJzPVMuY29uY2F0KGksZyk7bGV0IEM9W10sRT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oZil7dHlwZW9mIGYucnVuV2hlbj09ImZ1bmN0aW9uIiYmZi5ydW5XaGVuKHQpPT09ITF8fChFPUUmJmYuc3luY2hyb25vdXMsQy51bnNoaWZ0KGYuZnVsZmlsbGVkLGYucmVqZWN0ZWQpKX0pO2xldCBCPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oZil7Qi5wdXNoKGYuZnVsZmlsbGVkLGYucmVqZWN0ZWQpfSk7bGV0IG8sYT0wLGw7aWYoIUUpe2xldCBRPVtIQS5iaW5kKHRoaXMpLHZvaWQgMF07Zm9yKFEudW5zaGlmdC5hcHBseShRLEMpLFEucHVzaC5hcHBseShRLEIpLGw9US5sZW5ndGgsbz1Qcm9taXNlLnJlc29sdmUodCk7YTxsOylvPW8udGhlbihRW2ErK10sUVthKytdKTtyZXR1cm4gb31sPUMubGVuZ3RoO2xldCBzPXQ7Zm9yKGE9MDthPGw7KXtsZXQgUT1DW2ErK10sZj1DW2ErK107dHJ5e3M9UShzKX1jYXRjaChjKXtmLmNhbGwodGhpcyxjKTticmVha319dHJ5e289SEEuY2FsbCh0aGlzLHMpfWNhdGNoKFEpe3JldHVybiBQcm9taXNlLnJlamVjdChRKX1mb3IoYT0wLGw9Qi5sZW5ndGg7YTxsOylvPW8udGhlbihCW2ErK10sQlthKytdKTtyZXR1cm4gb31nZXRVcmkoZSl7ZT1iKHRoaXMuZGVmYXVsdHMsZSk7bGV0IHQ9QkEoZS5iYXNlVVJMLGUudXJsKTtyZXR1cm4gb0EodCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpfX07bi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtlQS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxJKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGIoSXx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KEl8fHt9KS5kYXRhfSkpfX0pO24uZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoSSl7cmV0dXJuIGZ1bmN0aW9uKGcsaSxDKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGIoQ3x8e30se21ldGhvZDplLGhlYWRlcnM6ST97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6ZyxkYXRhOml9KSl9fWVBLnByb3RvdHlwZVtlXT10KCksZUEucHJvdG90eXBlW2UrIkZvcm0iXT10KCEwKX0pO3ZhciBFQT1lQTt2YXIgbGU9Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXtpZih0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7bGV0IHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGcpe3Q9Z30pO2xldCBJPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4ocj0+e2lmKCFJLl9saXN0ZW5lcnMpcmV0dXJuO2xldCBnPUkuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKDtnLS0gPjA7KUkuX2xpc3RlbmVyc1tnXShyKTtJLl9saXN0ZW5lcnM9bnVsbH0pLHRoaXMucHJvbWlzZS50aGVuPXI9PntsZXQgZyxpPW5ldyBQcm9taXNlKEM9PntJLnN1YnNjcmliZShDKSxnPUN9KS50aGVuKHIpO3JldHVybiBpLmNhbmNlbD1mdW5jdGlvbigpe0kudW5zdWJzY3JpYmUoZyl9LGl9LGUoZnVuY3Rpb24oZyxpLEMpe0kucmVhc29ufHwoSS5yZWFzb249bmV3IEooZyxpLEMpLHQoSS5yZWFzb24pKX0pfXRocm93SWZSZXF1ZXN0ZWQoKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn1zdWJzY3JpYmUoZSl7aWYodGhpcy5yZWFzb24pe2UodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2goZSk6dGhpcy5fbGlzdGVuZXJzPVtlXX11bnN1YnNjcmliZShlKXtpZighdGhpcy5fbGlzdGVuZXJzKXJldHVybjtsZXQgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX10b0Fib3J0U2lnbmFsKCl7bGV0IGU9bmV3IEFib3J0Q29udHJvbGxlcix0PUk9PntlLmFib3J0KEkpfTtyZXR1cm4gdGhpcy5zdWJzY3JpYmUodCksZS5zaWduYWwudW5zdWJzY3JpYmU9KCk9PnRoaXMudW5zdWJzY3JpYmUodCksZS5zaWduYWx9c3RhdGljIHNvdXJjZSgpe2xldCBlO3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihyKXtlPXJ9KSxjYW5jZWw6ZX19fSxmdD1sZTtmdW5jdGlvbiBmZShBKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEEuYXBwbHkobnVsbCx0KX19ZnVuY3Rpb24gdWUoQSl7cmV0dXJuIG4uaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIHBlPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhwZSkuZm9yRWFjaCgoW0EsZV0pPT57cGVbZV09QX0pO3ZhciB1dD1wZTtmdW5jdGlvbiBwdChBKXtsZXQgZT1uZXcgRUEoQSksdD1yQShFQS5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gbi5leHRlbmQodCxFQS5wcm90b3R5cGUsZSx7YWxsT3duS2V5czohMH0pLG4uZXh0ZW5kKHQsZSxudWxsLHthbGxPd25LZXlzOiEwfSksdC5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIHB0KGIoQSxyKSl9LHR9dmFyIHc9cHQoeik7dy5BeGlvcz1FQTt3LkNhbmNlbGVkRXJyb3I9Sjt3LkNhbmNlbFRva2VuPWZ0O3cuaXNDYW5jZWw9c0E7dy5WRVJTSU9OPVlBO3cudG9Gb3JtRGF0YT1PO3cuQXhpb3NFcnJvcj1wO3cuQ2FuY2VsPXcuQ2FuY2VsZWRFcnJvcjt3LmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9O3cuc3ByZWFkPWZlO3cuaXNBeGlvc0Vycm9yPXVlO3cubWVyZ2VDb25maWc9Yjt3LkF4aW9zSGVhZGVycz1TO3cuZm9ybVRvSlNPTj1BPT5OQShuLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO3cuZ2V0QWRhcHRlcj1NQS5nZXRBZGFwdGVyO3cuSHR0cFN0YXR1c0NvZGU9dXQ7dy5kZWZhdWx0PXc7dmFyIHRBPXc7dmFye0F4aW9zOkJuLEF4aW9zRXJyb3I6UW4sQ2FuY2VsZWRFcnJvcjpFbixpc0NhbmNlbDpjbixDYW5jZWxUb2tlbjpsbixWRVJTSU9OOmZuLGFsbDp1bixDYW5jZWw6cG4saXNBeGlvc0Vycm9yOmRuLHNwcmVhZDpobix0b0Zvcm1EYXRhOkRuLEF4aW9zSGVhZGVyczp5bixIdHRwU3RhdHVzQ29kZTp3bixmb3JtVG9KU09OOm1uLGdldEFkYXB0ZXI6U24sbWVyZ2VDb25maWc6Rm59PXRBO2FzeW5jIGZ1bmN0aW9uIGhyKEEsZSl7bGV0IHQ9QSxJPW51bGw7aWYodD09bnVsbClJPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgcj1hd2FpdCB0QS5nZXQodCx7cmVzcG9uc2VUeXBlOiJibG9iIixwYXJhbXM6ZX0pLGc9VVJMLmNyZWF0ZU9iamVjdFVSTChyLmRhdGEpO0k9bmV3IFdvcmtlcihnLHt0eXBlOiJtb2R1bGUifSl9ZWxzZSBJPW5ldyBXb3JrZXIodCx7dHlwZToibW9kdWxlIn0pO3JldHVybiBJfXZhciBjQT1ocjtmdW5jdGlvbiBkdChBKXtsZXQgZT12QShBKSx0PUE7cmV0dXJuIHQudGVybWluYXRlZD0hMSx0LndvcmtlclByb3h5PWUsdC5vcmlnaW5hbFRlcm1pbmF0ZT10LnRlcm1pbmF0ZSx0LnRlcm1pbmF0ZT0oKT0+e3QudGVybWluYXRlZD0hMCx0LndvcmtlclByb3h5W2pBXSgpLHQub3JpZ2luYWxUZXJtaW5hdGUoKX0se3dvcmtlclByb3h5OmUsd29ya2VyOnR9fWFzeW5jIGZ1bmN0aW9uIERyKEEsZSx0KXtsZXQgSTtpZihBIT1udWxsKXtsZXQgZz1BO3JldHVybiBnLndvcmtlclByb3h5IT09dm9pZCAwPyhJPWcud29ya2VyUHJveHkse3dvcmtlclByb3h5Okksd29ya2VyOmd9KTpkdChBKX1sZXQgcj1hd2FpdCBjQShlLHQpO3JldHVybiBkdChyKX12YXIgaHQ9RHI7dmFyIGxBLFksaGUsZGU9e2Vudjp7ZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDpmdW5jdGlvbihBKXtoZT1uZXcgVWludDhBcnJheShZLmV4cG9ydHMubWVtb3J5LmJ1ZmZlcil9fX0sVEE9Y2xhc3N7aW5pdCgpe3JldHVybiBsQXx8KHR5cGVvZiBmZXRjaDwidSI/bEE9ZmV0Y2goImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsIitEdCkudGhlbihlPT5lLmFycmF5QnVmZmVyKCkpLnRoZW4oZT0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSxkZSkpLnRoZW4odGhpcy5faW5pdCk6bEE9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoQnVmZmVyLmZyb20oRHQsImJhc2U2NCIpLGRlKS50aGVuKHRoaXMuX2luaXQpLGxBKX1faW5pdChlKXtZPWUuaW5zdGFuY2UsZGUuZW52LmVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgoMCl9ZGVjb2RlKGUsdD0wKXtpZighWSl0aHJvdyBuZXcgRXJyb3IoIlpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy4iKTtsZXQgST1lLmJ5dGVMZW5ndGgscj1ZLmV4cG9ydHMubWFsbG9jKEkpO2hlLnNldChlLHIpLHQ9dHx8TnVtYmVyKFkuZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKHIsSSkpO2xldCBnPVkuZXhwb3J0cy5tYWxsb2ModCksaT1ZLmV4cG9ydHMuWlNURF9kZWNvbXByZXNzKGcsdCxyLEkpLEM9aGUuc2xpY2UoZyxnK2kpO3JldHVybiBZLmV4cG9ydHMuZnJlZShyKSxZLmV4cG9ydHMuZnJlZShnKSxDfX0sRHQ9IkFHRnpiUUVBQUFBQmJnNWdBMzkvZndGL1lBRi9BWDlnQW45L0FHQUJmd0JnQlg5L2YzOS9BWDlnQTM5L2Z3QmdCSDkvZjM4QmYyQUFBWDlnQW45L0FYOWdCMzkvZjM5L2YzOEJmMkFDZjM4QmZtQUlmMzkvZjM5L2YzOEJmMkFGZjM5L2YzOEFZQTUvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9BaWNCQTJWdWRoOWxiWE5qY21sd2RHVnVYMjV2ZEdsbWVWOXRaVzF2Y25sZlozSnZkM1JvQUFNREl5SUhBQUFCQVFNSEF3RUFDUVFBQlFFSUNBRUZCZ1FFQkFNR0FBQUtBQVVMREEwR0JBVUJjQUVCQVFVSEFRR0FBb0NBQWdZSUFYOEJRWUNqQkFzSHJnRUxCbTFsYlc5eWVRSUFCbTFoYkd4dll3QUZCR1p5WldVQUJneGFVMVJFWDJselJYSnliM0lBRWhsYVUxUkVYMlpwYm1SRVpXTnZiWEJ5WlhOelpXUlRhWHBsQUJ3UFdsTlVSRjlrWldOdmJYQnlaWE56QUNJWlgxOXBibVJwY21WamRGOW1kVzVqZEdsdmJsOTBZV0pzWlFFQUVGOWZaWEp5Ym05ZmJHOWpZWFJwYjI0QUFRbHpkR0ZqYTFOaGRtVUFCd3h6ZEdGamExSmxjM1J2Y21VQUNBcHpkR0ZqYTBGc2JHOWpBQWtLaS9JQklnVUFRWVFmQ3pNQkFYOGdBZ1JBSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FEUVFGcUlRTWdBVUVCYWlFQklBSkJBV3NpQWcwQUN3c2dBQXNwQVFGL0lBSUVRQ0FBSVFNRFFDQURJQUU2QUFBZ0EwRUJhaUVESUFKQkFXc2lBZzBBQ3dzZ0FBdHNBUUovUVlBZktBSUFJZ0VnQUVFSGFrRjRjU0lDYWlFQUFrQWdBa0VBSUFBZ0FVMGJEUUFnQUQ4QVFSQjBTd1JBSUFBL0FFRVFkR3RCLy84RGFrRVFka0FBUVg5R0JIOUJBQVZCQUJBQVFRRUxSUTBCQzBHQUh5QUFOZ0lBSUFFUEMwR0VIMEV3TmdJQVFYOEx1U2NCQzM4akFFRVFheUlLSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkI5QUZOQkVCQmlCOG9BZ0FpQmtFUUlBQkJDMnBCZUhFZ0FFRUxTUnNpQlVFRGRpSUFkaUlCUVFOeEJFQUNRQ0FCUVg5elFRRnhJQUJxSWdKQkEzUWlBVUd3SDJvaUFDQUJRYmdmYWlnQ0FDSUJLQUlJSWdSR0JFQkJpQjhnQmtGK0lBSjNjVFlDQUF3QkN5QUVJQUEyQWd3Z0FDQUVOZ0lJQ3lBQlFRaHFJUUFnQVNBQ1FRTjBJZ0pCQTNJMkFnUWdBU0FDYWlJQklBRW9BZ1JCQVhJMkFnUU1Ed3NnQlVHUUh5Z0NBQ0lIVFEwQklBRUVRQUpBUVFJZ0FIUWlBa0VBSUFKcmNpQUJJQUIwY1dnaUFVRURkQ0lBUWJBZmFpSUNJQUJCdUI5cUtBSUFJZ0FvQWdnaUJFWUVRRUdJSHlBR1FYNGdBWGR4SWdZMkFnQU1BUXNnQkNBQ05nSU1JQUlnQkRZQ0NBc2dBQ0FGUVFOeU5nSUVJQUFnQldvaUNDQUJRUU4wSWdFZ0JXc2lCRUVCY2pZQ0JDQUFJQUZxSUFRMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFGQm5COG9BZ0FoQWdKL0lBWkJBU0FIUVFOMmRDSURjVVVFUUVHSUh5QURJQVp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBeUFCSUFJMkFnZ2dBeUFDTmdJTUlBSWdBVFlDRENBQ0lBTTJBZ2dMSUFCQkNHb2hBRUdjSHlBSU5nSUFRWkFmSUFRMkFnQU1Ed3RCakI4b0FnQWlDMFVOQVNBTGFFRUNkRUc0SVdvb0FnQWlBaWdDQkVGNGNTQUZheUVESUFJaEFRTkFBa0FnQVNnQ0VDSUFSUVJBSUFFb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBRmF5SUJJQU1nQVNBRFNTSUJHeUVESUFBZ0FpQUJHeUVDSUFBaEFRd0JDd3NnQWlnQ0dDRUpJQUlnQWlnQ0RDSUVSd1JBUVpnZktBSUFHaUFDS0FJSUlnQWdCRFlDRENBRUlBQTJBZ2dNRGdzZ0FrRVVhaUlCS0FJQUlnQkZCRUFnQWlnQ0VDSUFSUTBESUFKQkVHb2hBUXNEUUNBQklRZ2dBQ0lFUVJScUlnRW9BZ0FpQUEwQUlBUkJFR29oQVNBRUtBSVFJZ0FOQUFzZ0NFRUFOZ0lBREEwTFFYOGhCU0FBUWI5L1N3MEFJQUJCQzJvaUFFRjRjU0VGUVl3ZktBSUFJZ2hGRFFCQkFDQUZheUVEQWtBQ1FBSkFBbjlCQUNBRlFZQUNTUTBBR2tFZklBVkIvLy8vQjBzTkFCb2dCVUVtSUFCQkNIWm5JZ0JyZGtFQmNTQUFRUUYwYTBFK2Fnc2lCMEVDZEVHNElXb29BZ0FpQVVVRVFFRUFJUUFNQVF0QkFDRUFJQVZCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VDQTBBQ1FDQUJLQUlFUVhoeElBVnJJZ1lnQTA4TkFDQUJJUVFnQmlJRERRQkJBQ0VESUFFaEFBd0RDeUFBSUFFb0FoUWlCaUFHSUFFZ0FrRWRka0VFY1dvb0FoQWlBVVliSUFBZ0Joc2hBQ0FDUVFGMElRSWdBUTBBQ3dzZ0FDQUVja1VFUUVFQUlRUkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUdoQkFuUkJ1Q0ZxS0FJQUlRQUxJQUJGRFFFTEEwQWdBQ2dDQkVGNGNTQUZheUlDSUFOSklRRWdBaUFESUFFYklRTWdBQ0FFSUFFYklRUWdBQ2dDRUNJQkJIOGdBUVVnQUNnQ0ZBc2lBQTBBQ3dzZ0JFVU5BQ0FEUVpBZktBSUFJQVZyVHcwQUlBUW9BaGdoQnlBRUlBUW9BZ3dpQWtjRVFFR1lIeWdDQUJvZ0JDZ0NDQ0lBSUFJMkFnd2dBaUFBTmdJSURBd0xJQVJCRkdvaUFTZ0NBQ0lBUlFSQUlBUW9BaEFpQUVVTkF5QUVRUkJxSVFFTEEwQWdBU0VHSUFBaUFrRVVhaUlCS0FJQUlnQU5BQ0FDUVJCcUlRRWdBaWdDRUNJQURRQUxJQVpCQURZQ0FBd0xDeUFGUVpBZktBSUFJZ1JOQkVCQm5COG9BZ0FoQUFKQUlBUWdCV3NpQVVFUVR3UkFJQUFnQldvaUFpQUJRUUZ5TmdJRUlBQWdCR29nQVRZQ0FDQUFJQVZCQTNJMkFnUU1BUXNnQUNBRVFRTnlOZ0lFSUFBZ0JHb2lBU0FCS0FJRVFRRnlOZ0lFUVFBaEFrRUFJUUVMUVpBZklBRTJBZ0JCbkI4Z0FqWUNBQ0FBUVFocUlRQU1EUXNnQlVHVUh5Z0NBQ0lDU1FSQVFaUWZJQUlnQldzaUFUWUNBRUdnSDBHZ0h5Z0NBQ0lBSUFWcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0JVRURjallDQkNBQVFRaHFJUUFNRFF0QkFDRUFJQVZCTDJvaUF3Si9RZUFpS0FJQUJFQkI2Q0lvQWdBTUFRdEI3Q0pDZnpjQ0FFSGtJa0tBb0lDQWdJQUVOd0lBUWVBaUlBcEJER3BCY0hGQjJLclZxZ1Z6TmdJQVFmUWlRUUEyQWdCQnhDSkJBRFlDQUVHQUlBc2lBV29pQmtFQUlBRnJJZ2h4SWdFZ0JVME5ERUhBSWlnQ0FDSUVCRUJCdUNJb0FnQWlCeUFCYWlJSklBZE5JQVFnQ1VseURRMExBa0JCeENJdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVHZ0h5Z0NBQ0lFQkVCQnlDSWhBQU5BSUFRZ0FDZ0NBQ0lIVHdSQUlBY2dBQ2dDQkdvZ0JFc05Bd3NnQUNnQ0NDSUFEUUFMQzBFQUVBUWlBa0YvUmcwRElBRWhCa0hrSWlnQ0FDSUFRUUZySWdRZ0FuRUVRQ0FCSUFKcklBSWdCR3BCQUNBQWEzRnFJUVlMSUFVZ0JrOE5BMEhBSWlnQ0FDSUFCRUJCdUNJb0FnQWlCQ0FHYWlJSUlBUk5JQUFnQ0VseURRUUxJQVlRQkNJQUlBSkhEUUVNQlFzZ0JpQUNheUFJY1NJR0VBUWlBaUFBS0FJQUlBQW9BZ1JxUmcwQklBSWhBQXNnQUVGL1JnMEJJQVZCTUdvZ0JrMEVRQ0FBSVFJTUJBdEI2Q0lvQWdBaUFpQURJQVpyYWtFQUlBSnJjU0lDRUFSQmYwWU5BU0FDSUFacUlRWWdBQ0VDREFNTElBSkJmMGNOQWd0QnhDSkJ4Q0lvQWdCQkJISTJBZ0FMSUFFUUJDSUNRWDlHUVFBUUJDSUFRWDlHY2lBQUlBSk5jZzBGSUFBZ0Ftc2lCaUFGUVNocVRRMEZDMEc0SWtHNElpZ0NBQ0FHYWlJQU5nSUFRYndpS0FJQUlBQkpCRUJCdkNJZ0FEWUNBQXNDUUVHZ0h5Z0NBQ0lEQkVCQnlDSWhBQU5BSUFJZ0FDZ0NBQ0lCSUFBb0FnUWlCR3BHRFFJZ0FDZ0NDQ0lBRFFBTERBUUxRWmdmS0FJQUlnQkJBQ0FBSUFKTkcwVUVRRUdZSHlBQ05nSUFDMEVBSVFCQnpDSWdCallDQUVISUlpQUNOZ0lBUWFnZlFYODJBZ0JCckI5QjRDSW9BZ0EyQWdCQjFDSkJBRFlDQUFOQUlBQkJBM1FpQVVHNEgyb2dBVUd3SDJvaUJEWUNBQ0FCUWJ3ZmFpQUVOZ0lBSUFCQkFXb2lBRUVnUncwQUMwR1VIeUFHUVNocklnQkJlQ0FDYTBFSGNTSUJheUlFTmdJQVFhQWZJQUVnQW1vaUFUWUNBQ0FCSUFSQkFYSTJBZ1FnQUNBQ2FrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBUUxJQUlnQTAwZ0FTQURTM0lOQWlBQUtBSU1RUWh4RFFJZ0FDQUVJQVpxTmdJRVFhQWZJQU5CZUNBRGEwRUhjU0lBYWlJQk5nSUFRWlFmUVpRZktBSUFJQVpxSWdJZ0FHc2lBRFlDQUNBQklBQkJBWEkyQWdRZ0FpQURha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQU1MUVFBaEJBd0tDMEVBSVFJTUNBdEJtQjhvQWdBZ0Frc0VRRUdZSHlBQ05nSUFDeUFDSUFacUlRRkJ5Q0loQUFKQUFrQUNRQU5BSUFFZ0FDZ0NBRWNFUUNBQUtBSUlJZ0FOQVF3Q0N3c2dBQzBBREVFSWNVVU5BUXRCeUNJaEFBTkFJQU1nQUNnQ0FDSUJUd1JBSUFFZ0FDZ0NCR29pQkNBRFN3MERDeUFBS0FJSUlRQU1BQXNBQ3lBQUlBSTJBZ0FnQUNBQUtBSUVJQVpxTmdJRUlBSkJlQ0FDYTBFSGNXb2lCeUFGUVFOeU5nSUVJQUZCZUNBQmEwRUhjV29pQmlBRklBZHFJZ1ZySVFBZ0F5QUdSZ1JBUWFBZklBVTJBZ0JCbEI5QmxCOG9BZ0FnQUdvaUFEWUNBQ0FGSUFCQkFYSTJBZ1FNQ0F0Qm5COG9BZ0FnQmtZRVFFR2NIeUFGTmdJQVFaQWZRWkFmS0FJQUlBQnFJZ0EyQWdBZ0JTQUFRUUZ5TmdJRUlBQWdCV29nQURZQ0FBd0lDeUFHS0FJRUlnTkJBM0ZCQVVjTkJpQURRWGh4SVFrZ0EwSC9BVTBFUUNBR0tBSU1JZ0VnQmlnQ0NDSUNSZ1JBUVlnZlFZZ2ZLQUlBUVg0Z0EwRURkbmR4TmdJQURBY0xJQUlnQVRZQ0RDQUJJQUkyQWdnTUJnc2dCaWdDR0NFSUlBWWdCaWdDRENJQ1J3UkFJQVlvQWdnaUFTQUNOZ0lNSUFJZ0FUWUNDQXdGQ3lBR1FSUnFJZ0VvQWdBaUEwVUVRQ0FHS0FJUUlnTkZEUVFnQmtFUWFpRUJDd05BSUFFaEJDQURJZ0pCRkdvaUFTZ0NBQ0lERFFBZ0FrRVFhaUVCSUFJb0FoQWlBdzBBQ3lBRVFRQTJBZ0FNQkF0QmxCOGdCa0VvYXlJQVFYZ2dBbXRCQjNFaUFXc2lDRFlDQUVHZ0h5QUJJQUpxSWdFMkFnQWdBU0FJUVFGeU5nSUVJQUFnQW1wQktEWUNCRUdrSDBId0lpZ0NBRFlDQUNBRElBUkJKeUFFYTBFSGNXcEJMMnNpQUNBQUlBTkJFR3BKR3lJQlFSczJBZ1FnQVVIUUlpa0NBRGNDRUNBQlFjZ2lLUUlBTndJSVFkQWlJQUZCQ0dvMkFnQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFkUWlRUUEyQWdBZ0FVRVlhaUVBQTBBZ0FFRUhOZ0lFSUFCQkNHb2dBRUVFYWlFQUlBUkpEUUFMSUFFZ0EwWU5BQ0FCSUFFb0FnUkJmbkUyQWdRZ0F5QUJJQU5ySWdKQkFYSTJBZ1FnQVNBQ05nSUFJQUpCL3dGTkJFQWdBa0Y0Y1VHd0gyb2hBQUovUVlnZktBSUFJZ0ZCQVNBQ1FRTjJkQ0lDY1VVRVFFR0lIeUFCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQVNBQUlBTTJBZ2dnQVNBRE5nSU1JQU1nQURZQ0RDQURJQUUyQWdnTUFRdEJIeUVBSUFKQi8vLy9CMDBFUUNBQ1FTWWdBa0VJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBTWdBRFlDSENBRFFnQTNBaEFnQUVFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUJFRUJJQUIwSWdaeFJRUkFRWXdmSUFRZ0JuSTJBZ0FnQVNBRE5nSUFEQUVMSUFKQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQkFOQUlBUWlBU2dDQkVGNGNTQUNSZzBDSUFCQkhYWWhCQ0FBUVFGMElRQWdBU0FFUVFSeGFpSUdLQUlRSWdRTkFBc2dCaUFETmdJUUN5QURJQUUyQWhnZ0F5QUROZ0lNSUFNZ0F6WUNDQXdCQ3lBQktBSUlJZ0FnQXpZQ0RDQUJJQU0yQWdnZ0EwRUFOZ0lZSUFNZ0FUWUNEQ0FESUFBMkFnZ0xRWlFmS0FJQUlnQWdCVTBOQUVHVUh5QUFJQVZySWdFMkFnQkJvQjlCb0I4b0FnQWlBQ0FGYWlJQ05nSUFJQUlnQVVFQmNqWUNCQ0FBSUFWQkEzSTJBZ1FnQUVFSWFpRUFEQWdMUVlRZlFUQTJBZ0JCQUNFQURBY0xRUUFoQWdzZ0NFVU5BQUpBSUFZb0Fod2lBVUVDZEVHNElXb2lCQ2dDQUNBR1JnUkFJQVFnQWpZQ0FDQUNEUUZCakI5QmpCOG9BZ0JCZmlBQmQzRTJBZ0FNQWdzZ0NFRVFRUlFnQ0NnQ0VDQUdSaHRxSUFJMkFnQWdBa1VOQVFzZ0FpQUlOZ0lZSUFZb0FoQWlBUVJBSUFJZ0FUWUNFQ0FCSUFJMkFoZ0xJQVlvQWhRaUFVVU5BQ0FDSUFFMkFoUWdBU0FDTmdJWUN5QUFJQWxxSVFBZ0JpQUphaUlHS0FJRUlRTUxJQVlnQTBGK2NUWUNCQ0FGSUFCQkFYSTJBZ1FnQUNBRmFpQUFOZ0lBSUFCQi93Rk5CRUFnQUVGNGNVR3dIMm9oQVFKL1FZZ2ZLQUlBSWdKQkFTQUFRUU4yZENJQWNVVUVRRUdJSHlBQUlBSnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQVUyQWdnZ0FDQUZOZ0lNSUFVZ0FUWUNEQ0FGSUFBMkFnZ01BUXRCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQVVnQXpZQ0hDQUZRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlBa0VCSUFOMElnUnhSUVJBUVl3ZklBSWdCSEkyQWdBZ0FTQUZOZ0lBREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFnTkFJQUlpQVNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQWlBRFFRRjBJUU1nQVNBQ1FRUnhhaUlFS0FJUUlnSU5BQXNnQkNBRk5nSVFDeUFGSUFFMkFoZ2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUJLQUlJSWdBZ0JUWUNEQ0FCSUFVMkFnZ2dCVUVBTmdJWUlBVWdBVFlDRENBRklBQTJBZ2dMSUFkQkNHb2hBQXdDQ3dKQUlBZEZEUUFDUUNBRUtBSWNJZ0JCQW5SQnVDRnFJZ0VvQWdBZ0JFWUVRQ0FCSUFJMkFnQWdBZzBCUVl3ZklBaEJmaUFBZDNFaUNEWUNBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBUkdHMm9nQWpZQ0FDQUNSUTBCQ3lBQ0lBYzJBaGdnQkNnQ0VDSUFCRUFnQWlBQU5nSVFJQUFnQWpZQ0dBc2dCQ2dDRkNJQVJRMEFJQUlnQURZQ0ZDQUFJQUkyQWhnTEFrQWdBMEVQVFFSQUlBUWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0JHb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBUWdCVUVEY2pZQ0JDQUVJQVZxSWdJZ0EwRUJjallDQkNBQ0lBTnFJQU0yQWdBZ0EwSC9BVTBFUUNBRFFYaHhRYkFmYWlFQUFuOUJpQjhvQWdBaUFVRUJJQU5CQTNaMElnTnhSUVJBUVlnZklBRWdBM0kyQWdBZ0FBd0JDeUFBS0FJSUN5RUJJQUFnQWpZQ0NDQUJJQUkyQWd3Z0FpQUFOZ0lNSUFJZ0FUWUNDQXdCQzBFZklRQWdBMEgvLy84SFRRUkFJQU5CSmlBRFFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hBQXNnQWlBQU5nSWNJQUpDQURjQ0VDQUFRUUowUWJnaGFpRUJBa0FDUUNBSVFRRWdBSFFpQm5GRkJFQkJqQjhnQmlBSWNqWUNBQ0FCSUFJMkFnQU1BUXNnQTBFWklBQkJBWFpyUVFBZ0FFRWZSeHQwSVFBZ0FTZ0NBQ0VGQTBBZ0JTSUJLQUlFUVhoeElBTkdEUUlnQUVFZGRpRUdJQUJCQVhRaEFDQUJJQVpCQkhGcUlnWW9BaEFpQlEwQUN5QUdJQUkyQWhBTElBSWdBVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFFb0FnZ2lBQ0FDTmdJTUlBRWdBallDQ0NBQ1FRQTJBaGdnQWlBQk5nSU1JQUlnQURZQ0NBc2dCRUVJYWlFQURBRUxBa0FnQ1VVTkFBSkFJQUlvQWh3aUFFRUNkRUc0SVdvaUFTZ0NBQ0FDUmdSQUlBRWdCRFlDQUNBRURRRkJqQjhnQzBGK0lBQjNjVFlDQUF3Q0N5QUpRUkJCRkNBSktBSVFJQUpHRzJvZ0JEWUNBQ0FFUlEwQkN5QUVJQWsyQWhnZ0FpZ0NFQ0lBQkVBZ0JDQUFOZ0lRSUFBZ0JEWUNHQXNnQWlnQ0ZDSUFSUTBBSUFRZ0FEWUNGQ0FBSUFRMkFoZ0xBa0FnQTBFUFRRUkFJQUlnQXlBRmFpSUFRUU55TmdJRUlBQWdBbW9pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUlnQlVFRGNqWUNCQ0FDSUFWcUlnUWdBMEVCY2pZQ0JDQURJQVJxSUFNMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFCQm5COG9BZ0FoQVFKL1FRRWdCMEVEZG5RaUJTQUdjVVVFUUVHSUh5QUZJQVp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCaUFBSUFFMkFnZ2dCaUFCTmdJTUlBRWdBRFlDRENBQklBWTJBZ2dMUVp3ZklBUTJBZ0JCa0I4Z0F6WUNBQXNnQWtFSWFpRUFDeUFLUVJCcUpBQWdBQXZTQ3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQm1COG9BZ0JKRFFFZ0FDQUJhaUVBQWtBQ1FFR2NIeWdDQUNBQ1J3UkFJQUZCL3dGTkJFQWdBVUVEZGlFRUlBSW9BZ3dpQVNBQ0tBSUlJZ05HQkVCQmlCOUJpQjhvQWdCQmZpQUVkM0UyQWdBTUJRc2dBeUFCTmdJTUlBRWdBellDQ0F3RUN5QUNLQUlZSVFZZ0FpQUNLQUlNSWdGSEJFQWdBaWdDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFKQkZHb2lCQ2dDQUNJRFJRUkFJQUlvQWhBaUEwVU5BaUFDUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRktBSUVJZ0ZCQTNGQkEwY05Ba0dRSHlBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQlNBQU5nSUFEd3RCQUNFQkN5QUdSUTBBQWtBZ0FpZ0NIQ0lEUVFKMFFiZ2hhaUlFS0FJQUlBSkdCRUFnQkNBQk5nSUFJQUVOQVVHTUgwR01IeWdDQUVGK0lBTjNjVFlDQUF3Q0N5QUdRUkJCRkNBR0tBSVFJQUpHRzJvZ0FUWUNBQ0FCUlEwQkN5QUJJQVkyQWhnZ0FpZ0NFQ0lEQkVBZ0FTQUROZ0lRSUFNZ0FUWUNHQXNnQWlnQ0ZDSURSUTBBSUFFZ0F6WUNGQ0FESUFFMkFoZ0xJQUlnQlU4TkFDQUZLQUlFSWdGQkFYRkZEUUFDUUFKQUFrQUNRQ0FCUVFKeFJRUkFRYUFmS0FJQUlBVkdCRUJCb0I4Z0FqWUNBRUdVSDBHVUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FDUVp3ZktBSUFSdzBHUVpBZlFRQTJBZ0JCbkI5QkFEWUNBQThMUVp3ZktBSUFJQVZHQkVCQm5COGdBallDQUVHUUgwR1FIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQUlBSnFJQUEyQWdBUEN5QUJRWGh4SUFCcUlRQWdBVUgvQVUwRVFDQUJRUU4ySVFRZ0JTZ0NEQ0lCSUFVb0FnZ2lBMFlFUUVHSUgwR0lIeWdDQUVGK0lBUjNjVFlDQUF3RkN5QURJQUUyQWd3Z0FTQUROZ0lJREFRTElBVW9BaGdoQmlBRklBVW9BZ3dpQVVjRVFFR1lIeWdDQUJvZ0JTZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQVZCRkdvaUJDZ0NBQ0lEUlFSQUlBVW9BaEFpQTBVTkFpQUZRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGSUFGQmZuRTJBZ1FnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUF3REMwRUFJUUVMSUFaRkRRQUNRQ0FGS0FJY0lnTkJBblJCdUNGcUlnUW9BZ0FnQlVZRVFDQUVJQUUyQWdBZ0FRMEJRWXdmUVl3ZktBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0JVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FGS0FJUUlnTUVRQ0FCSUFNMkFoQWdBeUFCTmdJWUN5QUZLQUlVSWdORkRRQWdBU0FETmdJVUlBTWdBVFlDR0FzZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FDQUNRWndmS0FJQVJ3MEFRWkFmSUFBMkFnQVBDeUFBUWY4QlRRUkFJQUJCZUhGQnNCOXFJUUVDZjBHSUh5Z0NBQ0lEUVFFZ0FFRURkblFpQUhGRkJFQkJpQjhnQUNBRGNqWUNBQ0FCREFFTElBRW9BZ2dMSVFBZ0FTQUNOZ0lJSUFBZ0FqWUNEQ0FDSUFFMkFnd2dBaUFBTmdJSUR3dEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBSWdBellDSENBQ1FnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQUNRRUdNSHlnQ0FDSUVRUUVnQTNRaUIzRkZCRUJCakI4Z0JDQUhjallDQUNBQklBSTJBZ0FnQWlBQk5nSVlEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQVFOQUlBRWlCQ2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBU0FEUVFGMElRTWdCQ0FCUVFSeGFpSUhRUkJxS0FJQUlnRU5BQXNnQnlBQ05nSVFJQUlnQkRZQ0dBc2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUVLQUlJSWdBZ0FqWUNEQ0FFSUFJMkFnZ2dBa0VBTmdJWUlBSWdCRFlDRENBQ0lBQTJBZ2dMUWFnZlFhZ2ZLQUlBUVFGcklnQkJmeUFBR3pZQ0FBc0xCQUFqQUFzR0FDQUFKQUFMRUFBakFDQUFhMEZ3Y1NJQUpBQWdBQXRLQVFGL0lBQWdBVWtFUUNBQUlBRWdBaEFDRHdzZ0FnUkFJQUFnQW1vaEF5QUJJQUpxSVFFRFFDQURRUUZySWdNZ0FVRUJheUlCTFFBQU9nQUFJQUpCQVdzaUFnMEFDd3NnQUF2OURnSVJmd0YrSXdCQk1Hc2lCeVFBUWJoL0lRZ0NRQ0FGUlEwQUlBUXNBQUFpQ1VIL0FYRWhDd0pBSUFsQkFFZ0VRQ0FMUWY0QWEwRUJkaUlHSUFWUERRSkJiQ0VJSUF0Qi93QnJJZ3RCL3dGTERRSWdCRUVCYWlFSVFRQWhCUU5BSUFVZ0MwOEVRQ0FMSVFnZ0JpRUxEQU1GSUFBZ0JXb2dDQ0FGUVFGMmFpSUVMUUFBUVFSMk9nQUFJQUFnQlVFQmNtb2dCQzBBQUVFUGNUb0FBQ0FGUVFKcUlRVU1BUXNBQ3dBTElBVWdDMDBOQVNBSFFmOEJOZ0lFSUFZZ0IwRUVhaUFIUVFocUlBUkJBV29pRGlBTEVBd2lCRUdJZjBzRVFDQUVJUWdNQWd0QlZDRUlJQWNvQWdnaUVFRUdTdzBCSUFjb0FnUWlFVUVCZENJSlFRSnFyVUlCSUJDdGhpSVlRUUVnRUhRaURVRUJhaUlGclVJQ2hueDhRZ3Q4UXZ6Ly8vLy8vLy8vL3dDRFF1UUNWZzBCUVZJaENDQVJRZjhCU3cwQklBMUJmM05CQW5SQjVBSnFyU0FSUVFGcUloVkJBWFN0SUJoOFFnaDhWQTBCSUFzZ0JHc2hGaUFFSUE1cUlSY2dCa0dBQkdvaUVpQUZRUUowYWlJUklBbHFRUUpxSVE0Z0JrR0VCR29oRTBHQWdBSWdFSFJCRUhZaENVRUFJUVZCQVNFUElBMUJBV3NpRkNFS0EwQWdCU0FWUmtVRVFBSkFJQVlnQlVFQmRDSUlhaThCQUNJRVFmLy9BMFlFUUNBVElBcEJBblJxSUFVNkFBSWdDa0VCYXlFS1FRRWhCQXdCQ3lBUFFRQWdDU0FFd1VvYklROExJQWdnRVdvZ0JEc0JBQ0FGUVFGcUlRVU1BUXNMSUFZZ0R6c0JnZ1FnQmlBUU93R0FCQUpBSUFvZ0ZFWUVRQ0FOUVFOMklRaENBQ0VZUVFBaER3TkFJQXdnRlVZRVFDQUlJQTFCQVhacVFRTnFJZ2xCQVhRaENFRUFJUVJCQUNFS0EwQkJBQ0VGSUFvZ0RVOE5CQU5BSUFWQkFrWkZCRUFnRXlBRklBbHNJQVJxSUJSeFFRSjBhaUFPSUFVZ0NtcHFMUUFBT2dBQ0lBVkJBV29oQlF3QkN3c2dDa0VDYWlFS0lBUWdDR29nRkhFaEJBd0FDd0FGSUFZZ0RFRUJkR291QVFBaENTQU9JQTlxSWdRZ0dEY0FBRUVJSVFVRFFDQUZJQWxPUlFSQUlBUWdCV29nR0RjQUFDQUZRUWhxSVFVTUFRc0xJQmhDZ1lLRWlKQ2d3SUFCZkNFWUlBeEJBV29oRENBSklBOXFJUThNQVFzQUN3QUxJQTFCQTNZZ0RVRUJkbXBCQTJvaENFRUFJUVVEUUNBTUlCVkdSUVJBUVFBaENTQUdJQXhCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQUpSa1VFUUNBVElBVkJBblJxSUF3NkFBSURRQ0FGSUFocUlCUnhJZ1VnQ2tzTkFBc2dDVUVCYWlFSkRBRUxDeUFNUVFGcUlRd01BUXNMUVg4aENDQUZEUUlMSUJCQkFXb2hDRUVBSVFVRFFDQUZJQTFHUlFSQUlCRWdFeUFGUVFKMGFpSU9MUUFDUVFGMGFpSUVJQVF2QVFBaUNVRUJhanNCQUNBT0lBZ2dDV2RCWUhOcUlnUTZBQU1nRGlBSklBUjBJQTFyT3dFQUlBVkJBV29oQlF3QkN3c0NRQUpBSUFZdkFZSUVCRUFnQjBFY2FpSUVJQmNnRmhBTklnaEJpSDlMRFFJZ0IwRVVhaUFFSUJJUURpQUhRUXhxSUFRZ0VoQU9RUUFoQlFOQUlBZEJIR29pQkJBUElBVkIrd0ZMY2cwQ0lBQWdCV29pQmlBSFFSUnFJQVFRRURvQUFDQUdJQWRCREdvZ0JCQVFPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVTUF3VWdBQ0FFYWlBSFFSUnFJQWRCSEdvaUJCQVFPZ0FBSUFZZ0IwRU1haUFFRUJBNkFBTWdCVUVFYWlFRkRBRUxBQXNBQ3lBSFFSeHFJZ1FnRnlBV0VBMGlDRUdJZjBzTkFTQUhRUlJxSUFRZ0VoQU9JQWRCREdvZ0JDQVNFQTVCQUNFRkEwQWdCMEVjYWlJRUVBOGdCVUg3QVV0eVJRUkFJQUFnQldvaUJpQUhRUlJxSUFRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVUZJQUFnQkdvZ0IwRVVhaUFIUVJ4cUlnUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQURJQVZCQkdvaEJRd0NDd3NMQW44RFFFRzZmeUVJSUFWQi9RRkxEUU1nQUNBRmFpSUdJQWRCRkdvZ0IwRWNhaUlKRUJFNkFBQWdCa0VCYWlFRUlBa1FEMEVEUmdSQUlBZEJER29oQ0VFQ0RBSUxJQVZCL0FGTERRTWdCaUFIUVF4cUlBZEJIR29pQkJBUk9nQUJJQVZCQW1vaEJTQUVFQTlCQTBjTkFBc2dBQ0FGYWlFRUlBZEJGR29oQ0VFREN5QUVJQWdnQjBFY2FoQVJPZ0FBSUFacUlBQnJJUWdNQVFzQ2Z3TkFRYnAvSVFnZ0JVSDlBVXNOQWlBQUlBVnFJZ1lnQjBFVWFpQUhRUnhxSWdrUUVEb0FBQ0FHUVFGcUlRUWdDUkFQUVFOR0JFQWdCMEVNYWlFSVFRSU1BZ3NnQlVIOEFVc05BaUFHSUFkQkRHb2dCMEVjYWlJRUVCQTZBQUVnQlVFQ2FpRUZJQVFRRDBFRFJ3MEFDeUFBSUFWcUlRUWdCMEVVYWlFSVFRTUxJQVFnQ0NBSFFSeHFFQkE2QUFBZ0Jtb2dBR3NoQ0FzZ0NFR0lmMHNOQVFzZ0NDRUVRUUFoQlNBQlFRQkJOQkFESVFsQkFDRUtBMEFnQkNBRlJ3UkFJQUFnQldvaUJpMEFBQ0lCUVF0TEJFQkJiQ0VJREFNRklBa2dBVUVDZEdvaUFTQUJLQUlBUVFGcU5nSUFJQVZCQVdvaEJVRUJJQVl0QUFCMFFRRjFJQXBxSVFvTUFnc0FDd3RCYkNFSUlBcEZEUUFnQ21jaUJVRWZjeUlCUVF0TERRQWdBMEVnSUFWck5nSUFRUUZCQWlBQmRDQUtheUlEWjBFZmN5SUJkQ0FEUncwQUlBQWdCR29nQVVFQmFpSUFPZ0FBSUFrZ0FFRUNkR29pQUNBQUtBSUFRUUZxTmdJQUlBa29BZ1FpQUVFQ1NTQUFRUUZ4Y2cwQUlBSWdCRUVCYWpZQ0FDQUxRUUZxSVFnTElBZEJNR29rQUNBSUM2QUZBUXgvSXdCQkVHc2lEQ1FBQW44Z0JFRUhUUVJBSUF4Q0FEY0RDQ0FNUVFocUlnVWdBeUFFRUFJYVFXd2dBQ0FCSUFJZ0JVRUlFQXdpQUNBQUlBUkxHeUFBSUFCQmlYOUpHd3dCQ3lBQVFRQWdBU2dDQUVFQmFpSU5RUUYwRUFNaEQwRlVJQU1vQUFBaUJrRVBjU0lBUVFwTERRQWFJQUlnQUVFRmFqWUNBQ0FESUFScUlnSkJCR3NoQnlBQ1FRZHJJUXNnQUVFR2FpRU9RUVFoQWlBR1FRUjJJUVZCSUNBQWRDSUlRUUZ5SVFsQkFDRUFRUUVoQmlBRElRUURRQUpBSUFaQkFYRkZCRUFEUUNBRlFYOXpRWUNBZ0lCNGNtZ2lCa0VZU1VVRVFDQUFRU1JxSVFBZ0JDQUxUUVIvSUFSQkEyb0ZJQVFnQzJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTElBSWdCa0VlY1NJS2FrRUNhaUVDSUFaQkFYWkJBMndnQUdvZ0JTQUtka0VEY1dvaUFDQU5UdzBCQW44Z0JDQUxTeUFDUVFOMklBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFRZ0IydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTElBVWdDRUVCYTNFaUJpQUlRUUYwUVFGcklnb2dDV3NpRUVrRWZ5QU9RUUZyQlNBRklBcHhJZ1VnRUVFQUlBVWdDRTRiYXlFR0lBNExJUVVnRHlBQVFRRjBhaUFHUVFGcklnbzdBUUFnQUVFQmFpRUFJQUlnQldvaEFpQUlRUUVnQm1zZ0NpQUdRUUJLR3lBSmFpSUpTZ1JBSUFsQkFrZ05BVUVnSUFsbklnVnJJUTVCQVNBRlFSOXpkQ0VJQ3lBQUlBMVBEUUFnQ2tFQVJ5RUdBbjhnQkNBTFN5QUNRUU4xSUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQUlnQkNBSGEwRURkR3BCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTFFXd2dDVUVCUncwQUdrRlFJQUFnRFVzTkFCcEJiQ0FDUVNCS0RRQWFJQUVnQUVFQmF6WUNBQ0FFSUFKQkIycEJBM1ZxSUFOckN5QU1RUkJxSkFBTDhnRUJBWDhnQWtVRVFDQUFRZ0EzQWdBZ0FFRUFOZ0lRSUFCQ0FEY0NDRUc0Znc4TElBQWdBVFlDRENBQUlBRkJCR28yQWhBZ0FrRUVUd1JBSUFBZ0FTQUNhaUlCUVFScklnTTJBZ2dnQUNBREtBQUFOZ0lBSUFGQkFXc3RBQUFpQVFSQUlBQWdBV2RCRjJzMkFnUWdBZzhMSUFCQkFEWUNCRUYvRHdzZ0FDQUJOZ0lJSUFBZ0FTMEFBQ0lETmdJQUFrQUNRQUpBSUFKQkFtc09BZ0VBQWdzZ0FDQUJMUUFDUVJCMElBTnlJZ00yQWdBTElBQWdBUzBBQVVFSWRDQURhallDQUFzZ0FTQUNha0VCYXkwQUFDSUJSUVJBSUFCQkFEWUNCRUZzRHdzZ0FDQUJaeUFDUVFOMGEwRUphallDQkNBQ0MwUUJBbjhnQVNBQ0x3RUFJZ01nQVNnQ0JHb2lCRFlDQkNBQUlBTkJBblJCb0IxcUtBSUFJQUVvQWdCQkFDQUVhM1p4TmdJQUlBRVFEeG9nQUNBQ1FRUnFOZ0lFQzU4QkFRUi9RUU1oQVNBQUtBSUVJZ0pCSUUwRVFDQUFLQUlJSWdFZ0FDZ0NFRThFUUNBQUlBSkJCM0UyQWdRZ0FDQUJJQUpCQTNacklnSTJBZ2dnQUNBQ0tBQUFOZ0lBUVFBUEN5QUFLQUlNSWdNZ0FVWUVRRUVCUVFJZ0FrRWdTUnNQQ3lBQUlBRWdBU0FEYXlBQ1FRTjJJZ1FnQVNBRWF5QURTU0lCR3lJRGF5SUVOZ0lJSUFBZ0FpQURRUU4wYXpZQ0JDQUFJQVFvQUFBMkFnQUxJQUVMU0FFRWZ5QUFLQUlFSUFBb0FnQkJBblJxSWdJdEFBSWdBaThCQUNFRUlBRWdBU2dDQkNJRklBSXRBQU1pQW1vMkFnUWdBQ0FFSUFFb0FnQWdCWFJCQUNBQ2EzWnFOZ0lBQzFJQkJIOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJQUl2QVFBaEJDQUJJQUl0QUFNaUFpQUJLQUlFYWlJRk5nSUVJQUFnQkNBQ1FRSjBRYUFkYWlnQ0FDQUJLQUlBUVFBZ0JXdDJjV28yQWdBTENBQWdBRUdJZjBzTEdnQWdBQVJBSUFFRVFDQUNJQUFnQVJFQ0FBOExJQUFRQmdzTHBnZ0NEWDhCZmlNQVFSQnJJZ2trQUNBSlFRQTJBZ3dnQ1VFQU5nSUlBbjhDUUNBRFFlZ0phaUFESUFsQkNHb2dDVUVNYWlBQklBSWdBMEdBQVdvUUN5SVBRWWgvU3cwQVFWUWdDU2dDRENJRUlBQW9BZ0FpQVVIL0FYRkJBV3BMRFFFYUlBQkJCR29oQ3lBQUlBRkIvNEdBZUhFZ0JFRVFkRUdBZ1B3SGNYSTJBZ0JCZnlBRUlBUkJBRWdiUVFGcUlRQkJBQ0VCSUFrb0FnZ2hCVUVBSVFJRFFDQUFJQUpHQkVBZ0JVRURheUVCUVFBaEFBTkFBa0JCQUNFQ0lBQWdBVTRFUUFOQUlBQWdCVTROQWlBRElBQWdBMnBCNkFscUxRQUFRUUowYWtGQWF5SUJJQUVvQWdBaUFVRUJhallDQUNBQklBTnFJQUE2QU9nSElBQkJBV29oQUF3QUN3QUZBMEFnQWtFRVJrVUVRQ0FESUFNZ0FDQUNhaUlIYWtIb0NXb3RBQUJCQW5ScVFVQnJJZ2dnQ0NnQ0FDSUlRUUZxTmdJQUlBTWdDR29nQnpvQTZBY2dBa0VCYWlFQ0RBRUxDeUFBUVFScUlRQU1BZ3NBQ3dzZ0JFRUJhaUVPSUFNb0FnQWhCMEVBSVFCQkFTRUlBMEFnQ0NBT1JnMERJQTRnQ0dzaEJDQURJQWhCQW5ScUtBSUFJUVVDUUFKQUFrQUNRQUpBQWtCQkFTQUlkRUVCZFNJTlFRRnJEZ2dBQVFRQ0JBUUVBd1FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFBSVFFRFFDQUNJQVpHRFFVZ0F5QUNJQWRxYWkwQTZBY2hDaUFMSUFGQkFYUnFJZ3dnQkRvQUFTQU1JQW82QUFBZ0FrRUJhaUVDSUFGQkFXb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQ2lBQUlRRURRQ0FDSUFwR0RRUWdDeUFCUVFGMGFpSUdJQU1nQWlBSGFtb3RBT2dISWd3NkFBSWdCaUFFT2dBQklBWWdERG9BQUNBR0lBUTZBQU1nQWtFQmFpRUNJQUZCQW1vaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFFUVFoMFFZRCtBM0VoQkNBQUlRRURRQ0FDSUFaR0RRTWdDeUFCUVFGMGFpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK053QUFJQUpCQVdvaEFpQUJRUVJxSVFFTUFBc0FDMEVBSVFJZ0JVRUFJQVZCQUVvYklRWWdCRUVJZEVHQS9nTnhJUVFnQUNFQkEwQWdBaUFHUmcwQ0lBc2dBVUVCZEdvaUNpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0loRTNBQWdnQ2lBUk53QUFJQUpCQVdvaEFpQUJRUWhxSVFFTUFBc0FDMEVBSVFFZ0JVRUFJQVZCQUVvYklRb2dCRUVJZEVHQS9nTnhJUXdnQUNFRUEwQWdBU0FLUmcwQklBc2dCRUVCZEdvaEVDQU1JQU1nQVNBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0lSRkJBQ0VDQTBBZ0FpQU5Ua1VFUUNBUUlBSkJBWFJxSWdZZ0VUY0FHQ0FHSUJFM0FCQWdCaUFSTndBSUlBWWdFVGNBQUNBQ1FSQnFJUUlNQVFzTElBRkJBV29oQVNBRUlBMXFJUVFNQUFzQUN5QUlRUUZxSVFnZ0JTQUhhaUVISUFVZ0RXd2dBR29oQUF3QUN3QUZJQU1nQWtFQ2RHb2lCMEZBYXlBQk5nSUFJQUpCQVdvaEFpQUhLQUlBSUFGcUlRRU1BUXNBQ3dBTElBOExJQWxCRUdva0FBdnlBZ0VHZnlNQVFTQnJJZ1VrQUNBRUtBSUFJUVlnQlVFTWFpQUNJQU1RRFNJRFFZaC9UUVJBSUFSQkJHb2hBaUFBSUFGcUlnbEJBMnNoQkVFQUlBWkJFSFpyUVI5eElRTURRQ0FGUVF4cUVBOGdBQ0FFVDNKRkJFQWdBaUFGS0FJTUlnWWdCU2dDRUNJSGRDQURka0VCZEdvaUNDMEFBU0VLSUFBZ0NDMEFBRG9BQUNBQ0lBWWdCeUFLYWlJR2RDQURka0VCZEdvaUJ5MEFBQ0VJSUFVZ0JpQUhMUUFCYWpZQ0VDQUFJQWc2QUFFZ0FFRUNhaUVBREFFTEN3TkFJQVZCREdvUUR5RUhJQVVvQWd3aEJpQUZLQUlRSVFRZ0FDQUpUeUFIY2tVRVFDQUNJQVlnQkhRZ0EzWkJBWFJxSWdZdEFBQWhCeUFGSUFRZ0JpMEFBV28yQWhBZ0FDQUhPZ0FBSUFCQkFXb2hBQXdCQ3dzRFFDQUFJQWxQUlFSQUlBSWdCaUFFZENBRGRrRUJkR29pQnkwQUFTRUlJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdCQ0FJYWlFRURBRUxDMEZzUVd3Z0FTQUZLQUlVSUFVb0FoaEhHeUFFUVNCSEd5RURDeUFGUVNCcUpBQWdBd3ZQRkFFamZ5TUFRZEFBYXlJRkpBQkJiQ0VKQWtBZ0EwRUtTUTBBQWtBZ0F5QUNMd0FFSWdjZ0FpOEFBQ0lJSUFJdkFBSWlEV3BxUVFacUlneEpEUUFnQkM4QkFpRUdJQVZCUEdvZ0FrRUdhaUlDSUFnUURTSUpRWWgvU3cwQklBVkJLR29nQWlBSWFpSUNJQTBRRFNJSlFZaC9TdzBCSUFWQkZHb2dBaUFOYWlJQ0lBY1FEU0lKUVloL1N3MEJJQVVnQWlBSGFpQURJQXhyRUEwaUNVR0lmMHNOQVNBRVFRUnFJUW9nQUNBQmFpSWZRUU5ySVNCQkFDQUdhMEVmY1NFTElBVW9BZ2doRVNBRktBSWNJUklnQlNnQ01DRVRJQVVvQWtRaEZDQUZLQUlFSVFrZ0JTZ0NHQ0VOSUFVb0Fpd2hEQ0FGS0FKQUlRWWdCU2dDRUNFaElBVW9BaVFoSWlBRktBSTRJU01nQlNnQ1RDRWtJQVVvQWdBaEZTQUZLQUlVSVJZZ0JTZ0NLQ0VYSUFVb0Fqd2hHRUVCSVE4Z0FDQUJRUU5xUVFKMklnUnFJZ01nQkdvaUFpQUVhaUlaSVFRZ0FpRUlJQU1oQndOQUlBOUJBWEZGSUFRZ0lFOXlSUVJBSUFBZ0NpQVlJQVowSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEdpQU9MUUFESVJBZ0J5QUtJQmNnREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnRGkwQUFpRWJJQTR0QUFNaER5QUlJQW9nRmlBTmRDQUxka0VDZEdvaURpOEJBRHNBQUNBT0xRQUNJUndnRGkwQUF5RWRJQVFnQ2lBVklBbDBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloSGlBT0xRQURJUTRnQUNBUWFpSWxJQW9nR0NBR0lCcHFJZ1owSUF0MlFRSjBhaUlRTHdFQU93QUFJQkF0QUFJZ0VDMEFBeUVtSUFjZ0Qyb2lKeUFLSUJjZ0RDQWJhaUlhZENBTGRrRUNkR29pQnk4QkFEc0FBQ0FITFFBQ0lRd2dCeTBBQXlFUUlBZ2dIV29pR3lBS0lCWWdEU0FjYWlJUGRDQUxka0VDZEdvaUNDOEJBRHNBQUNBSUxRQUNJUTBnQ0MwQUF5RWNJQVFnRG1vaUhTQUtJQlVnQ1NBZWFpSU9kQ0FMZGtFQ2RHb2lDUzhCQURzQUFDQUdhaUVBUVFNaEJ3Si9JQlFnSkVrRVFDQUFJUVpCQXd3QkN5QUFRUWR4SVFZZ0ZDQUFRUU4yYXlJVUtBQUFJUmhCQUFzZ0NTMEFBeUVlSUFrdEFBSWhDQ0FNSUJwcUlRQWdFeUFqU1FSL0lBQUZJQk1nQUVFRGRtc2lFeWdBQUNFWFFRQWhCeUFBUVFkeEN5RU1JQTBnRDJvaEFDQUhjaUVKUVFNaER3Si9JQklnSWtrRVFDQUFJUTFCQXd3QkN5QUFRUWR4SVEwZ0VpQUFRUU4yYXlJU0tBQUFJUlpCQUFzZ0NDQU9haUVBSUFseUlCRWdJVWtFZnlBQUJTQVJJQUJCQTNackloRW9BQUFoRlVFQUlROGdBRUVIY1FzaENTQWxJQ1pxSVFBZ0VDQW5haUVISUJzZ0hHb2hDQ0FkSUI1cUlRUWdEM0pGSVE4TUFRc0xJQVVnRERZQ0xDQUZJQVkyQWtBZ0JTQU5OZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFJZ0Iwa2dBQ0FEUzNJTkFFRnNJUWtnQ0NBWlN3MEJJQU5CQTJzaENRTkFJQVZCUEdvUUQwVWdBQ0FKU1hFRVFDQUFJQW9nQlNnQ1BDSU5JQVVvQWtBaURIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0FDQU9MUUFEYWlJR0lBb2dEU0FNSUE0dEFBSnFJZ0IwSUF0MlFRSjBhaUlNTHdFQU93QUFJQVVnQUNBTUxRQUNhallDUUNBR0lBd3RBQU5xSVFBTUFRVWdBMEVDYXlFTUEwQWdCVUU4YWhBUElRWWdCU2dDUENFTklBVW9Ba0FoQ1NBQUlBeExJQVp5UlFSQUlBQWdDaUFOSUFsMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0NTQUdMUUFDYWpZQ1FDQUFJQVl0QUFOcUlRQU1BUXNMQTBBZ0FDQU1TMFVFUUNBQUlBb2dEU0FKZENBTGRrRUNkR29pQmk4QkFEc0FBQ0FBSUFZdEFBTnFJUUFnQ1NBR0xRQUNhaUVKREFFTEN3SkFJQUFnQTA4TkFDQUFJQW9nRFNBSmRDQUxkaUlBUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUpJQU10QUFKcUlRa01BUXNnQ1VFZlN3MEFRU0FnQ1NBS0lBQkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRa0xJQUpCQTJzaERBTkFJQVZCS0dvUUQwVWdCeUFNU1hFRVFDQUhJQW9nQlNnQ0tDSUdJQVVvQWl3aUFIUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0J5QU5MUUFEYWlJRElBb2dCaUFBSUEwdEFBSnFJZ0IwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQUNBR0xRQUNhallDTENBRElBWXRBQU5xSVFjTUFRVWdBa0VDYXlFR0EwQWdCVUVvYWhBUElRTWdCU2dDS0NFTUlBVW9BaXdoQUNBR0lBZEpJQU55UlFSQUlBY2dDaUFNSUFCMElBdDJRUUowYWlJREx3RUFPd0FBSUFVZ0FDQURMUUFDYWpZQ0xDQUhJQU10QUFOcUlRY01BUXNMQTBBZ0JpQUhTVVVFUUNBSElBb2dEQ0FBZENBTGRrRUNkR29pQXk4QkFEc0FBQ0FISUFNdEFBTnFJUWNnQUNBRExRQUNhaUVBREFFTEN3SkFJQUlnQjAwTkFDQUhJQW9nRENBQWRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUFJQU10QUFKcUlRQU1BUXNnQUVFZlN3MEFRU0FnQUNBS0lBSkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRQUxJQmxCQTJzaERBTkFJQVZCRkdvUUQwVWdDQ0FNU1hFRVFDQUlJQW9nQlNnQ0ZDSUdJQVVvQWhnaUFuUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0NDQU5MUUFEYWlJRElBb2dCaUFDSUEwdEFBSnFJZ0owSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQWlBR0xRQUNhallDR0NBRElBWXRBQU5xSVFnTUFRVWdHVUVDYXlFREEwQWdCVUVVYWhBUElRSWdCU2dDRkNFR0lBVW9BaGdoQnlBRElBaEpJQUp5UlFSQUlBZ2dDaUFHSUFkMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFVZ0J5QUNMUUFDYWpZQ0dDQUlJQUl0QUFOcUlRZ01BUXNMQTBBZ0F5QUlTVVVFUUNBSUlBb2dCaUFIZENBTGRrRUNkR29pQWk4QkFEc0FBQ0FJSUFJdEFBTnFJUWdnQnlBQ0xRQUNhaUVIREFFTEN3SkFJQWdnR1U4TkFDQUlJQW9nQmlBSGRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUhJQU10QUFKcUlRY01BUXNnQjBFZlN3MEFRU0FnQnlBS0lBSkJBblJxTFFBQ2FpSUNJQUpCSUU4YklRY0xBMEFnQlJBUFJTQUVJQ0JKY1FSQUlBUWdDaUFGS0FJQUlnWWdCU2dDQkNJQ2RDQUxka0VDZEdvaURDOEJBRHNBQUNBRUlBd3RBQU5xSWdNZ0NpQUdJQUlnREMwQUFtb2lBblFnQzNaQkFuUnFJZ1F2QVFBN0FBQWdCU0FDSUFRdEFBSnFOZ0lFSUFNZ0JDMEFBMm9oQkF3QkJTQWZRUUpySVFNRFFDQUZFQThoQWlBRktBSUFJUVlnQlNnQ0JDRUlJQU1nQkVrZ0FuSkZCRUFnQkNBS0lBWWdDSFFnQzNaQkFuUnFJZ0l2QVFBN0FBQWdCU0FJSUFJdEFBSnFOZ0lFSUFRZ0FpMEFBMm9oQkF3QkN3c0RRQ0FESUFSSlJRUkFJQVFnQ2lBR0lBaDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBUWdBaTBBQTJvaEJDQUlJQUl0QUFKcUlRZ01BUXNMQWtBZ0JDQWZUdzBBSUFRZ0NpQUdJQWgwSUF0MklnSkJBblJxSWdNdEFBQTZBQUFnQXkwQUEwRUJSZ1JBSUFnZ0F5MEFBbW9oQ0F3QkN5QUlRUjlMRFFCQklDQUlJQW9nQWtFQ2RHb3RBQUpxSWdJZ0FrRWdUeHNoQ0F0QmJFRnNRV3hCYkVGc1FXeEJiRUZzSUFFZ0NFRWdSeHNnQlNnQ0NDQUZLQUlNUnhzZ0IwRWdSeHNnQlNnQ0hDQUZLQUlnUnhzZ0FFRWdSeHNnQlNnQ01DQUZLQUkwUnhzZ0NVRWdSeHNnQlNnQ1JDQUZLQUpJUnhzaENRd0pDd0FMQUFzQUN3QUxBQXNBQ3dBTEFBdEJiQ0VKQ3lBRlFkQUFhaVFBSUFrTDdCQUJIbjhqQUVIUUFHc2lCU1FBUVd3aENRSkFJQU5CQ2trTkFBSkFJQU1nQWk4QUJDSUdJQUl2QUFBaUJ5QUNMd0FDSWdocWFrRUdhaUlPU1EwQUlBUXZBUUloRHlBRlFUeHFJQUpCQm1vaUFpQUhFQTBpQ1VHSWYwc05BU0FGUVNocUlBSWdCMm9pQWlBSUVBMGlDVUdJZjBzTkFTQUZRUlJxSUFJZ0NHb2lBaUFHRUEwaUNVR0lmMHNOQVNBRklBSWdCbW9nQXlBT2F4QU5JZ2xCaUg5TERRRWdCRUVFYWlFS0lBQWdBV29pSEVFRGF5RWRRUUFnRDJ0QkgzRWhDeUFGS0FJSUlSRWdCU2dDSENFU0lBVW9BakFoRXlBRktBSkVJUlFnQlNnQ0JDRUpJQVVvQWhnaEJpQUZLQUlzSVFjZ0JTZ0NRQ0VJSUFVb0FoQWhIaUFGS0FJa0lSOGdCU2dDT0NFZ0lBVW9Ba3doSVNBRktBSUFJUlVnQlNnQ0ZDRVdJQVVvQWlnaEZ5QUZLQUk4SVJoQkFTRU5JQUFnQVVFRGFrRUNkaUlDYWlJT0lBSnFJZzhnQW1vaUdTRUVJQThoQWlBT0lRTURRQ0FOUlNBRUlCMVBja1VFUUNBS0lCZ2dDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBQWdDaUFYSUFkMElBdDJRUUYwYWlJTUxRQUJJUkFnQXlBTUxRQUFPZ0FBSUFvZ0ZpQUdkQ0FMZGtFQmRHb2lEQzBBQVNFYUlBSWdEQzBBQURvQUFDQUtJQlVnQ1hRZ0MzWkJBWFJxSWd3dEFBRWhHeUFFSUF3dEFBQTZBQUFnQ2lBWUlBZ2dEV29pQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUVnQ2lBWElBY2dFR29pQjNRZ0MzWkJBWFJxSWd3dEFBRWhFQ0FESUF3dEFBQTZBQUVnQ2lBV0lBWWdHbW9pREhRZ0MzWkJBWFJxSWdZdEFBRWhHaUFDSUFZdEFBQTZBQUVnQ2lBVklBa2dHMm9pRzNRZ0MzWkJBWFJxSWdrdEFBRWhJaUFFSUFrdEFBQTZBQUVnQ0NBTmFpRUdRUU1oQ1FKL0lCUWdJVWtFUUVFRElRMGdCZ3dCQ3lBVUlBWkJBM1pySWhRb0FBQWhHRUVBSVEwZ0JrRUhjUXNoQ0NBSElCQnFJUVlnRXlBZ1NRUi9JQVlGSUJNZ0JrRURkbXNpRXlnQUFDRVhRUUFoQ1NBR1FRZHhDeUVISUF3Z0dtb2hEQ0FKSUExeUlSQkJBeUVOQW44Z0VpQWZTUVJBSUF3aEJrRUREQUVMSUF4QkIzRWhCaUFTSUF4QkEzWnJJaElvQUFBaEZrRUFDeUFiSUNKcUlRd2dFSEloRUNBUklCNUpCSDhnREFVZ0VTQU1RUU4yYXlJUktBQUFJUlZCQUNFTklBeEJCM0VMSVFrZ0JFRUNhaUVFSUFKQkFtb2hBaUFEUVFKcUlRTWdBRUVDYWlFQUlBMGdFSEpGSVEwTUFRc0xJQVVnQnpZQ0xDQUZJQWcyQWtBZ0JTQUdOZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFBZ0Rrc2dBeUFQUzNJTkFFRnNJUWtnQWlBWlN3MEJJQTVCQTJzaENRTkFJQVZCUEdvUUR5QUFJQWxQY2tVRVFDQUtJQVVvQWp3aUJpQUZLQUpBSWdkMElBdDJRUUYwYWlJSUxRQUJJUXdnQUNBSUxRQUFPZ0FBSUFvZ0JpQUhJQXhxSWdaMElBdDJRUUYwYWlJSExRQUFJUWdnQlNBR0lBY3RBQUZxTmdKQUlBQWdDRG9BQVNBQVFRSnFJUUFNQVFzTEEwQWdCVUU4YWhBUElRY2dCU2dDUENFR0lBVW9Ba0FoQ1NBQUlBNVBJQWR5UlFSQUlBb2dCaUFKZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQ1NBR0xRQUJhallDUUNBQUlBYzZBQUFnQUVFQmFpRUFEQUVMQ3dOQUlBQWdEazlGQkVBZ0NpQUdJQWwwSUF0MlFRRjBhaUlITFFBQklBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0NXb2hDUXdCQ3dzZ0QwRURheUVBQTBBZ0JVRW9haEFQSUFBZ0EwMXlSUVJBSUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQURJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaXdnQXlBSU9nQUJJQU5CQW1vaEF3d0JDd3NEUUNBRlFTaHFFQThoQnlBRktBSW9JUVlnQlNnQ0xDRUFJQU1nRDA4Z0IzSkZCRUFnQ2lBR0lBQjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQUFJQVl0QUFGcU5nSXNJQU1nQnpvQUFDQURRUUZxSVFNTUFRc0xBMEFnQXlBUFQwVUVRQ0FLSUFZZ0FIUWdDM1pCQVhScUlnY3RBQUVoQ0NBRElBY3RBQUE2QUFBZ0EwRUJhaUVESUFBZ0NHb2hBQXdCQ3dzZ0dVRURheUVEQTBBZ0JVRVVhaEFQSUFJZ0EwOXlSUVJBSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQUNJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaGdnQWlBSU9nQUJJQUpCQW1vaEFnd0JDd3NEUUNBRlFSUnFFQThoQnlBRktBSVVJUVlnQlNnQ0dDRURJQUlnR1U4Z0IzSkZCRUFnQ2lBR0lBTjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQURJQVl0QUFGcU5nSVlJQUlnQnpvQUFDQUNRUUZxSVFJTUFRc0xBMEFnQWlBWlQwVUVRQ0FLSUFZZ0EzUWdDM1pCQVhScUlnY3RBQUVoQ0NBQ0lBY3RBQUE2QUFBZ0FrRUJhaUVDSUFNZ0NHb2hBd3dCQ3dzRFFDQUZFQThnQkNBZFQzSkZCRUFnQ2lBRktBSUFJZ0lnQlNnQ0JDSUdkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUtJQUlnQmlBSWFpSUNkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdBaUFHTFFBQmFqWUNCQ0FFSUFjNkFBRWdCRUVDYWlFRURBRUxDd05BSUFVUUR5RUhJQVVvQWdBaEJpQUZLQUlFSVFJZ0JDQWNUeUFIY2tVRVFDQUtJQVlnQW5RZ0MzWkJBWFJxSWdZdEFBQWhCeUFGSUFJZ0JpMEFBV28yQWdRZ0JDQUhPZ0FBSUFSQkFXb2hCQXdCQ3dzRFFDQUVJQnhQUlFSQUlBb2dCaUFDZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FFUVFGcUlRUWdBaUFJYWlFQ0RBRUxDMEZzUVd4QmJFRnNRV3hCYkVGc1FXd2dBU0FDUVNCSEd5QUZLQUlJSUFVb0FneEhHeUFEUVNCSEd5QUZLQUljSUFVb0FpQkhHeUFBUVNCSEd5QUZLQUl3SUFVb0FqUkhHeUFKUVNCSEd5QUZLQUpFSUFVb0FraEhHeUVKREFFTFFXd2hDUXNnQlVIUUFHb2tBQ0FKQzFnQkEzOENRQ0FBS0FLUTZ3RWlBVVVOQUNBQktBSUFJQUZCdE5VQmFpZ0NBQ0lDSUFGQnVOVUJhaWdDQUNJREVCTWdBZ1JBSUFNZ0FTQUNFUUlBREFFTElBRVFCZ3NnQUVFQU5nS2c2d0VnQUVJQU53T1E2d0VMNlFNQ0JIOENmaUFBUVFCQktCQURJUVFnQWtFQlFRVWdBeHNpQUVrRVFDQUFEd3NnQVVVRVFFRi9Ed3RCQVNFR0FrQUNRQ0FEUVFGR0RRQWdBeUVHSUFFb0FBQWlCVUdvNnI1cFJnMEFRWFloQXlBRlFYQnhRZERVdE1JQlJ3MEJRUWdoQXlBQ1FRaEpEUUVnQVRVQUJDRUlJQVJCQVRZQ0ZDQUVJQWczQXdCQkFBOExJQUVnQWlBR0VCb2lBeUFDU3cwQUlBUWdBellDR0VGeUlRTWdBQ0FCYWlJRlFRRnJMUUFBSWdKQkNIRU5BQ0FDUVNCeElnWkZCRUJCY0NFRElBVXRBQUFpQlVHbkFVc05BU0FGUVFkeHJVSUJJQVZCQTNaQkNtcXRoaUlJUWdPSWZpQUlmQ0VKSUFCQkFXb2hBQXNnQWtFR2RpRUZJQUpCQW5aQkFDRURBa0FDUUFKQUFrQWdBa0VEY1VFQmF3NERBQUVDQXdzZ0FDQUJhaTBBQUNFRElBQkJBV29oQUF3Q0N5QUFJQUZxTHdBQUlRTWdBRUVDYWlFQURBRUxJQUFnQVdvb0FBQWhBeUFBUVFScUlRQUxRUUZ4SVFJQ2ZnSkFBa0FDUUFKQUlBVkJBV3NPQXdFQ0F3QUxRbjhnQmtVTkF4b2dBQ0FCYWpFQUFBd0RDeUFBSUFGcU13QUFRb0FDZkF3Q0N5QUFJQUZxTlFBQURBRUxJQUFnQVdvcEFBQUxJUWdnQkNBQ05nSWdJQVFnQXpZQ0hDQUVJQWczQXdCQkFDRURJQVJCQURZQ0ZDQUVJQWdnQ1NBR0d5SUlOd01JSUFSQ2dJQUlJQWdnQ0VLQWdBaGFHejRDRUFzZ0F3dGZBUUYvUWJoL0lRTWdBVUVCUVFVZ0Foc2lBazhFZnlBQUlBSnFRUUZyTFFBQUlnQkJBM0ZCQW5SQm9CNXFLQUlBSUFKcUlBQkJCSFpCREhGQnNCNXFLQUlBYWlBQVFTQnhJZ0ZGYWlBQlFRVjJJQUJCd0FCSmNXb0ZRYmgvQ3dzTUFDQUFJQUVnQWtFQUVCa0xsd01DQlg4Q2ZpTUFRVUJxSWdRa0FBSkFBMEFnQVVFRlR3UkFBa0FnQUNnQUFFRndjVUhRMUxUQ0FVWUVRRUorSVFjZ0FVRUlTUTBFSUFBb0FBUWlBa0YzU3cwRUlBSkJDR29pQXlBQlN3MEVJQUpCZ1g5SkRRRU1CQXNnQkVFWWFpQUFJQUVRR3lFQ1FuNGdCQ2tER0VJQUlBUW9BaXhCQVVjYklBSWJJZ2RDZlZZTkF5QUhJQWg4SWdnZ0IxUkNmaUVIRFFNQ1FBSkFJQUZCQ0VrTkFDQUFLQUFBUVhCeFFkRFV0TUlCUncwQUlBQW9BQVFpQWtGM1N3MEZRYmgvSUFKQkNHb2lBaUFCSUFKSkd5RUREQUVMSUFSQkdHb2dBQ0FCRUJzaUFrR0lmMHNFUUNBQ0lRTU1BUXRCdUg4aEF5QUNEUUFnQVNBRUtBSXdJZ0pySVFVZ0FDQUNhaUVHQTBBZ0JpQUZJQVJCREdvUUhTSURRWWgvU3cwQklBTkJBMm9pQWlBRlN3UkFRYmgvSVFNTUFnc2dCU0FDYXlFRklBSWdCbW9oQmlBRUtBSVFSUTBBQ3lBRUtBSTRCSDlCdUg4aEF5QUZRUVJKRFFFZ0JrRUVhZ1VnQmdzZ0FHc2hBd3NnQTBHSWYwc05Bd3NnQVNBRGF5RUJJQUFnQTJvaEFBd0JDd3RDZmlBSUlBRWJJUWNMSUFSQlFHc2tBQ0FIQzJRQkFYOUJ1SDhoQXdKQUlBRkJBMGtOQUNBQUxRQUNJUUVnQWlBQUx3QUFJZ0JCQVhFMkFnUWdBaUFBUVFGMlFRTnhJZ00yQWdBZ0FpQUFJQUZCRUhSeVFRTjJJZ0EyQWdnQ1FBSkFJQU5CQVdzT0F3SUJBQUVMUVd3UEN5QUFJUU1MSUFNTFJBRUNmeUFCSUFJb0FnUWlBeUFCS0FJRWFpSUVOZ0lFSUFBZ0EwRUNkRUdnSFdvb0FnQWdBU2dDQUVFQUlBUnJkbkUyQWdBZ0FSQVBHaUFBSUFKQkNHbzJBZ1FMemdFQkJuOUJ1bjhoQ2dKQUlBSW9BZ1FpQ0NBQ0tBSUFJZ2xxSWcwZ0FTQUFhMHNOQUVGc0lRb2dDU0FFSUFNb0FnQWlDMnRMRFFBZ0FDQUphaUlFSUFJb0FnZ2lER3NoQWlBQUlBRkJJR3NpQUNBTElBbEJBQkFnSUFNZ0NTQUxhallDQUFKQUFrQWdCQ0FGYXlBTVR3UkFJQUloQlF3QkN5QU1JQVFnQm10TERRSWdCeUFISUFJZ0JXc2lBbW9pQVNBSWFrOEVRQ0FFSUFFZ0NCQUtHZ3dDQ3lBQ0lBaHFJUWdnQkNBQlFRQWdBbXNRQ2lBQ2F5RUVDeUFFSUFBZ0JTQUlRUUVRSUFzZ0RTRUtDeUFLQzhjRUFRSi9JQUFnQTJvaEJnSkFJQU5CQjB3RVFBTkFJQUFnQms4TkFpQUFJQUl0QUFBNkFBQWdBRUVCYWlFQUlBSkJBV29oQWd3QUN3QUxJQVJCQVVZRVFBSkFJQUFnQW1zaUJVRUhUUVJBSUFBZ0FpMEFBRG9BQUNBQUlBSXRBQUU2QUFFZ0FDQUNMUUFDT2dBQ0lBQWdBaTBBQXpvQUF5QUFJQUlnQlVFQ2RDSUZRY0FlYWlnQ0FHb2lBaWdBQURZQUJDQUNJQVZCNEI1cUtBSUFheUVDREFFTElBQWdBaWtBQURjQUFBc2dBa0VJYWlFQ0lBQkJDR29oQUFzZ0FTQUdUd1JBSUFBZ0Eyb2hBU0FFUVFGSElBQWdBbXRCRDBweVJRUkFBMEFnQUNBQ0tRQUFOd0FBSUFKQkNHb2hBaUFBUVFocUlnQWdBVWtOQUF3REN3QUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQTBFUlNRMEJJQUJCRUdvaEFBTkFJQUFnQWlrQUVEY0FBQ0FBSUFJcEFCZzNBQWdnQUNBQ0tRQWdOd0FRSUFBZ0Fpa0FLRGNBR0NBQ1FTQnFJUUlnQUVFZ2FpSUFJQUZKRFFBTERBRUxBa0FnQUNBQlN3UkFJQUFoQVF3QkN5QUJJQUJySVFVQ1FDQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUlBSWhBd05BSUFBZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQUVFSWFpSUFJQUZKRFFBTERBRUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQlVFUlNBMEFJQUJCRUdvaEFDQUNJUU1EUUNBQUlBTXBBQkEzQUFBZ0FDQURLUUFZTndBSUlBQWdBeWtBSURjQUVDQUFJQU1wQUNnM0FCZ2dBMEVnYWlFRElBQkJJR29pQUNBQlNRMEFDd3NnQWlBRmFpRUNDd05BSUFFZ0JrOE5BU0FCSUFJdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaEFnd0FDd0FMQzY0SEFnVi9BWDRqQUVHQUFXc2lFU1FBSUJFZ0F6WUNmRUYvSVE4Q1FBSkFBa0FDUUFKQUlBSU9CQUVBQXdJRUN5QUdSUVJBUWJoL0lROE1CQXRCYkNFUElBVXRBQUFpQWlBRFN3MERJQWdnQWtFQ2RDSUNhaWdDQUNFRElBSWdCMm9vQWdBaEFpQUFRUUE2QUFzZ0FFSUFOd0lBSUFBZ0FqWUNEQ0FBSUFNNkFBb2dBRUVBT3dFSUlBRWdBRFlDQUVFQklROE1Bd3NnQVNBSk5nSUFRUUFoRHd3Q0N5QUtSUVJBUVd3aER3d0NDMEVBSVE4Z0MwVWdERUVaU0hJTkFVRUlJQVIwUVFocUlRQkJBQ0VEQTBBZ0FDQURUUTBDSUFOQlFHc2hBd3dBQ3dBTFFXd2hEeUFSSUJGQi9BQnFJQkZCK0FCcUlBVWdCaEFNSWdOQmlIOUxEUUFnRVNnQ2VDSUNJQVJMRFFBZ0VTZ0NmRUVCYWlFSklBQkJDR29oQzBHQWdBSWdBblJCRUhVaEJVRUJJUkJCQVNBQ2RDSVBRUUZySWdvaEVnTkFJQWtnRGtjRVFBSkFJQkVnRGtFQmRDSUVhaThCQUNJTVFmLy9BMFlFUUNBTElCSkJBM1JxSUE0MkFnUWdFa0VCYXlFU1FRRWhEQXdCQ3lBUVFRQWdCU0FNd1VvYklSQUxJQVFnRFdvZ0REc0JBQ0FPUVFGcUlRNE1BUXNMSUFBZ0FqWUNCQ0FBSUJBMkFnQUNRQ0FLSUJKR0JFQWdEVUhxQUdvaEJrRUFJUkJCQUNFTUEwQWdDU0FRUmdSQUlBOUJBM1lnRDBFQmRtcEJBMm9pQlVFQmRDRUVRUUFoREVFQUlSSURRRUVBSVE0Z0R5QVNUUTBFQTBBZ0RrRUNSd1JBSUFzZ0JTQU9iQ0FNYWlBS2NVRURkR29nQmlBT0lCSnFhaTBBQURZQ0JDQU9RUUZxSVE0TUFRc0xJQkpCQW1vaEVpQUVJQXhxSUFweElRd01BQXNBQlNBUklCQkJBWFJxTGdFQUlRVWdCaUFNYWlJRUlCTTNBQUJCQ0NFT0EwQWdCU0FPU2dSQUlBUWdEbW9nRXpjQUFDQU9RUWhxSVE0TUFRc0xJQk5DZ1lLRWlKQ2d3SUFCZkNFVElCQkJBV29oRUNBRklBeHFJUXdNQVFzQUN3QUxJQTlCQTNZZ0QwRUJkbXBCQTJvaEJVRUFJUkJCQUNFT0EwQWdDU0FRUmcwQlFRQWhEQ0FSSUJCQkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FNUndSQUlBc2dEa0VEZEdvZ0VEWUNCQU5BSUFVZ0Rtb2dDbkVpRGlBU1N3MEFDeUFNUVFGcUlRd01BUXNMSUJCQkFXb2hFQXdBQ3dBTElBSkJBV29oQlVFQUlRd0RRQ0FNSUE5SEJFQWdEU0FMSUF4QkEzUnFJZ2tvQWdRaUJFRUJkR29pQWlBQ0x3RUFJZ1pCQVdvN0FRQWdDU0FGSUFablFXQnphaUlDT2dBRElBa2dCaUFDZENBUGF6c0JBQ0FKSUFnZ0JFRUNkQ0lDYWlnQ0FEb0FBaUFKSUFJZ0Iyb29BZ0EyQWdRZ0RFRUJhaUVNREFFTEN5QUJJQUEyQWdBZ0F5RVBDeUFSUVlBQmFpUUFJQThMN1ZvQ08zOEdmaU1BUWVBQmF5SUVKQUFDUUVHdzdBa1FCU0lGUlFSQVFVQWhCd3dCQ3lBRlFnQTNBdlRxQVNBRlFRQTJBc1RyQVNBRlFRQTJBclRyQVNBRlFnQTNBcHpyQVNBRlFRQTJBcmpwQVNBRlFRQTJBcXpzQ1NBRlFnQTNBdFRyQVNBRlFnQTNBcXpyQVNBRlFnQTNBNGpyQVNBRlFnQTNBdVRxQVNBRlFnQTNBdVRyQVNBRlFZR0FnTUFBTmdLODZ3RWdCVUlBTndLazZ3RWdCVUg4NmdGcVFRQTJBZ0FnQlVHUTZ3RnFRZ0EzQXdBZ0JSQVlJQVZCck5VQmFpRVVJQVZCK09zQmFpRWNJQVZCc09vQmFpRWlJQVZCb0RCcUlTb2dCVUdZSUdvaEt5QUZRYWpRQUdvaEhpQUZRUkJxSVN3Z0JVRUlhaUVvSUFWQkJHb2hMU0FGUWNEcEFXb2hLU0FGUVlqckFXb2dCRUdVQVdvaEx5QUVRWXdCYWlFd0lBUkJoQUZxSVRFZ0JFSGNBR29oTWlBRVFkUUFhaUV6SUFSQnpBQnFJVFFnQUNFZEFrQUNRQUpBQWtBQ1FBTkFRUUZCQlNBRktBTGs2Z0ViSVFZQ1FBTkFJQU1nQmtrTkFTQUNLQUFBUVhCeFFkRFV0TUlCUmdSQVFiaC9JUWNnQTBFSVNRMElJQUlvQUFRaURrRjNTd1JBUVhJaEJ3d0pDeUFESUE1QkNHb2lDVWtOQ0NBT1FZQi9Td1JBSUFraEJ3d0pDeUFESUFscklRTWdBaUFKYWlFQ0RBRUxDeUFGUWdBM0FxenBBU0FGUWdBM0EranBBU0FGUVFBMkFwanJBU0FGUWdBM0E0RHFBU0FGUWdNM0EvanBBU0FGUWJUcEFXcENBRGNDQUNBRlFmRHBBV3BDQURjREFDQUZRYWpRQUdvaUNVR01nSURnQURZQ0FDQUZRYXpRQVdwQjRCSXBBZ0EzQWdBZ0JVRzAwQUZxUWVnU0tBSUFOZ0lBSUFVZ0JVRVFhallDQUNBRklBVkJvREJxTmdJRUlBVWdCVUdZSUdvMkFnZ2dCU0FKTmdJTUlBVkJBVUVGSUFVb0F1VHFBUnMyQXJ6cEFRSkFJQUZGRFFBZ0JTZ0NyT2tCSWdrZ0hVWU5BQ0FGSUFrMkFyanBBU0FGSUIwMkFxenBBU0FGS0FLdzZRRWhEaUFGSUIwMkFyRHBBU0FGSUIwZ0RpQUphMm8yQXJUcEFRdEJ1SDhoQ1NBRFFRVkJDU0FGS0FMazZnRWlCaHRKRFFVZ0FrRUJRUVVnQmhzZ0JoQWFJZzVCaUg5TEJFQWdEaUVKREFVTElBTWdEa0VEYWtrTkJTQXBJQUlnRGlBR0VCa2lCa0dJZjBzRVFDQUdJUWtNQlFzZ0JnMEZBa0FDUUNBRktBS282d0ZCQVVjTkFDQUZLQUtrNndFaUNVVU5BQ0FGS0FLVTZ3RkZEUUFnQ1NnQ0JFRUJheUlISUFVb0F0enBBU0lLclVLSGxhK3ZtTGJlbTU1L2ZrTEp6OW15OGVXNjZpZUZRaGVKUXMvVzA3N1N4NnZaUW41QytmUGQ4Wm4ybWFzV2ZDSS9RaUdJSUQrRlFzL1cwNzdTeDZ2WlFuNGlQMElkaUNBL2hVTDU4OTN4bWZhWnF4WitJajlDSUlnZ1A0V25jU0VHSUFrb0FnQWhGUU5BUVFBaENBSkFJQlVnQmtFQ2RHb29BZ0FpQ1VVTkFDQUpLQUlJUVFoSkRRQWdDU2dDQkNJU0tBQUFRYmZJd3VGK1J3MEFJQklvQUFRaENBc2dDQ0FLUndSQUlBWWdCM0ZCQVdvaEJpQUlEUUVMQ3lBSlJRMEFJQVVRR0NBRlFYODJBcURyQVNBRklBazJBcFRyQVNBRklBVW9BdHpwQVNJSU5nS1k2d0VNQVFzZ0JTZ0MzT2tCSVFnTEFrQWdDRVVOQUNBRktBS1k2d0VnQ0VZTkFFRmdJUWtNQmdzQ1FDQUZLQUxnNlFFRVFDQUZJQVVvQXVqcUFTSUpSVFlDN09vQklBa05BU0FGUXZucTBORG55YUhrNFFBM0E2anFBU0FGUWdBM0E2RHFBU0FGUXMvVzA3N1N4NnZaUWpjRG1Pb0JJQVZDMXV1Qzd1cjlpZlhnQURjRGtPb0JJQVZDQURjRGlPb0JJQ0pCQUVFb0VBTWFEQUVMSUFWQkFEWUM3T29CQ3lBQklCMXFJU1VnQlNBRktRUG82UUVnRHExOE53UG82UUVnQXlBT2F5RURJQUlnRG1vaEFpQWRJUTREUUNBQ0lBTWdCRUVzYWhBZEloVkJpSDlMQkVBZ0ZTRUpEQVlMSUFOQkEyc2lOU0FWU1EwRUlBSkJBMm9oRzBGc0lRa0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRUtBSXNEZ01DQVFBVkN5QVZRZi8vQjBzTkV5QVZRUU5KRFJJZ0JTa0R5T2tCSVQ4Q1FBSkFJQnN0QUFBaUNVRURjU0lhUVFGckRnTUdBUUFIQ3lBRktBS0E2Z0VOQUVGaUlRa01GUXNnRlVFRlNRMFNJQnNvQUFBaEF3Si9Ba0FDUUFKQUlBbEJBblpCQTNFaUNVRUNhdzRDQVFJQUN5QUpRUUJISVFjZ0EwRUVka0gvQjNFaEMwRURJUVlnQTBFT2RrSC9CM0VNQWd0QkJDRUdJQU5CQkhaQi8vOEFjU0VMUVFFaEJ5QURRUkoyREFFTElBTkJCSFpCLy84UGNTSUxRWUNBQ0VzTkUwRUJJUWRCQlNFR0lBSXRBQWRCQ25RZ0EwRVdkbklMSWdnZ0Jtb2lDU0FWU3cwU0FrQWdDMEdCQmtrTkFDQUZLQUtjNndGRkRRQkJBQ0VEQTBBZ0EwR0RnQUZMRFFFZ0EwRkFheUVEREFBTEFBc2dCaUFiYWlFUElCcEJBMGNOQmlBRktBSU1JZ0l0QUFGQkNIUWhBeUFIRFFjZ0EwVU5DQ0FFUWZBQWFpQVBJQWdRRFNJRFFZaC9TdzBKSUFKQkJHb2hCaUFMSUJ4cUloSkJBMnNoQ2tFQUlBSXZBUUpyUVI5eElRY2dIQ0VEQTBBZ0JFSHdBR29RRDBVZ0F5QUtTWEVFUUNBRElBWWdCQ2dDY0NJSUlBUW9BblFpRDNRZ0IzWkJBblJxSWdJdkFRQTdBQUFnQXlBQ0xRQURhaUlESUFZZ0NDQVBJQUl0QUFKcUlnaDBJQWQyUVFKMGFpSUNMd0VBT3dBQUlBUWdDQ0FDTFFBQ2FqWUNkQ0FESUFJdEFBTnFJUU1NQVFVZ0VrRUNheUVJQTBBZ0JFSHdBR29RRHlFUElBUW9BbkFoQ2lBRUtBSjBJUUlnQXlBSVN5QVBja1VFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pQ2k4QkFEc0FBQ0FFSUFJZ0NpMEFBbW8yQW5RZ0F5QUtMUUFEYWlFRERBRUxDd05BSUFNZ0NFMEVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lEeThCQURzQUFDQURJQTh0QUFOcUlRTWdBaUFQTFFBQ2FpRUNEQUVMQ3dKQUlBTWdFazhOQUNBRElBWWdDaUFDZENBSGRrRUNkR29pQXkwQUFEb0FBQ0FETFFBRFFRRkdCRUFnQWlBRExRQUNhaUVDREFFTElBSkJIMHNOQUVFZ0lBSWdBeTBBQW1vaUFpQUNRU0JQR3lFQ0MwRnNRV3dnQ3lBRUtBSjRJQVFvQW54SEd5QUNRU0JIR3lFRERBc0xBQXNBQ3lBRUtBSTBJZ0lnSlNBT2Ewc05DaUFPUlFSQVFRQWhDU0FDRFFJTURnc2dEaUFiTFFBQUlBSVFBeG9nQWlFSkRBd0xJQlVnSlNBT2Ewc05DU0FPRFFGQkFDRUpJQlZGRFF3TFFiWi9JUWtNRVFzZ0RpQWJJQlVRQWhvZ0ZTRUpEQW9MSUJ3Z0d3Si9Ba0FDUUFKQUlBbEJBblpCQTNGQkFXc09Bd0VBQWdBTElBbEJBM1loQTBFQkRBSUxJQnN2QUFCQkJIWWhBMEVDREFFTElCVkJCRWtORGlBQ0x3QURJQUl0QUFWQkVIUnlJZ0pCajRDQUFVc05EaUFDUVFSMklRTkJBd3NpQW1vdEFBQWdBMEVnYWhBRElRa2dCU0FETmdLQTZ3RWdCU0FKTmdMdzZnRWdBa0VCYWlFSkRBVUxJQlVDZndKQUFrQUNRQ0FKUVFKMlFRTnhRUUZyRGdNQkFBSUFDeUFKUVFOMklRTkJBUXdDQ3lBYkx3QUFRUVIySVFOQkFnd0JDeUFDTHdBRElBSXRBQVZCRUhSeVFRUjJJUU5CQXdzaUFpQURhaUlKUVNCcVNRUkFJQWtnRlVzTkRTQWNJQUlnRzJvZ0F4QUNJUUlnQlNBRE5nS0E2d0VnQlNBQ05nTHc2Z0VnQWlBRGFpSUNRZ0EzQUJnZ0FrSUFOd0FRSUFKQ0FEY0FDQ0FDUWdBM0FBQU1CUXNnQlNBRE5nS0E2d0VnQlNBQ0lCdHFOZ0x3NmdFTUJBc2dCMFVFUUNBZUlBOGdDQ0FVRUJRaUFrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGU0VEREFNTElBdEZJQWhGY2cwTElBdEJDSFlpQXlBSUlBdEpCSDhnQ0VFRWRDQUxiZ1ZCRHd0QkdHd2lBa0dNQ0dvb0FnQnNJQUpCaUFocUtBSUFhaUlHUVFOMklBWnFJQUpCZ0FocUtBSUFJQUpCaEFocUtBSUFJQU5zYWtrRVFDTUFRUkJySWhBa0FDQWVLQUlBSVFNZ0ZFSHdCR3BCQUVIc0FCQURJUVpCVkNFQ0FrQWdBMEgvQVhFaURFRU1TdzBBQWtBZ0ZFSGNDV29nQmlBUVFRaHFJQkJCREdvZ0R5QUlJQlJCM0F0cUloY1FDeUlTUVloL1N3MEFJQkFvQWd3aUJpQU1TdzBCSUJSQnFBVnFJUTBnRkVHa0JXb2hOaUFlUVFScUlSRWdBMEdBZ0lCNGNTRTNJQVpCQVdvaUV5RUNJQVloQXdOQUlBSWlCMEVCYXlFQ0lBTWlDa0VCYXlFRElCUWdDa0VDZEdvb0F2QUVSUTBBQzBFQklBY2dCMEVCVFJzaEZrRUFJUWRCQVNFQ0EwQWdBaUFXUndSQUlCUWdBa0VDZENJRGFpZ0M4QVFoR0NBRElBMXFJQWMyQWdBZ0FrRUJhaUVDSUFjZ0dHb2hCd3dCQ3dzZ0RTQUhOZ0lBUVFBaEFpQVFLQUlJSVFNRFFDQUNJQU5IQkVBZ0RTQUNJQlJxUWR3SmFpMEFBQ0lZUVFKMGFpSVpJQmtvQWdBaUdVRUJhallDQUNBVUlCbEJBWFJxSWhrZ0dEb0EzUVVnR1NBQ09nRGNCU0FDUVFGcUlRSU1BUXNMUVFBaEF5QU5RUUEyQWdBZ0RDQUdRWDl6YWlFR1FRRWhBZ05BSUFJZ0ZrY0VRQ0FVSUFKQkFuUnFJZzBnQXpZQ0FDQU5LQUx3QkNBQ0lBWnFkQ0FEYWlFRElBSkJBV29oQWd3QkN3c2dEQ0FUSUFwcklnWnJRUUZxSVFvZ0JpRURBMEFnQXlBS1NRUkFJQlFnQTBFMGJHb2hEVUVCSVFJRFFDQUNJQlpIQkVBZ0RTQUNRUUowSWhocUlCUWdHR29vQWdBZ0EzWTJBZ0FnQWtFQmFpRUNEQUVMQ3lBRFFRRnFJUU1NQVFzTElCY2dGRUUwRUFJaE9DQVVRWkFNYWlFNUlCTWdER3NoT2lBVVFkd0ZhaUVYUVFBaENnTkFBa0FDUUNBSElBcEhCRUJCQVNBTUlCTWdGeUFLUVFGMGFpSUNMUUFCSWcxcklnTnJJaGgwSVJrZ0FpMEFBQ0VXSURnZ0RVRUNkR29pSHlnQ0FDRUNJQVlnR0UwRVFDQTJRUUVnQXlBNmFpSU5JQTFCQVV3YklpQkJBblFpSkdvb0FnQWhEU0E1SUJRZ0EwRTBiR3BCTkJBQ0lTRWdEVUVCZENFbUlCRWdBa0VDZEdvaEl5QWdRUUZORFFJZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRWdJQ0VnSkdvb0FnQWhKRUVBSVFJRFFDQUNJQ1JHRFFNZ0l5QUNRUUowYWlBZ05nRUFJQUpCQVdvaEFnd0FDd0FMSUFJZ0FpQVphaUlOSUFJZ0RVc2JJUTBnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFREEwQWdBaUFOUmcwRElCRWdBa0VDZEdvZ0F6WUJBQ0FDUVFGcUlRSU1BQXNBQ3lBZUlBeEJFSFFnTjNJZ0RISkJnQUp5TmdJQURBTUxJQWNnRFdzaEpDQVhJQ1pxSVNaQkFDRU5BMEFnRFNBa1JnMEJRUUVnR0NBVElDWWdEVUVCZEdvaUp5MEFBU0lDYXlJN2EzUWlQQ0FoSUFKQkFuUnFJaUFvQWdBaUFtb2hQU0FESUR0cVFSQjBRWUNBL0FkeElDY3RBQUJCQ0hSeUlCWnlRWUNBZ0JCeUlTY0RRQ0FqSUFKQkFuUnFJQ2MyQVFBZ0FrRUJhaUlDSUQxSkRRQUxJQ0FnSUNnQ0FDQThhallDQUNBTlFRRnFJUTBNQUFzQUN5QWZJQjhvQWdBZ0dXbzJBZ0FnQ2tFQmFpRUtEQUFMQUFzZ0VpRUNDeUFRUVJCcUpBQWdBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRmlFRERBTUxJQjRnRHlBSUlCUVFGQ0lDUVloL1N5QUNJQWhQY2cwTElCd2dDeUFDSUE5cUlBZ2dBbXNnSGhBWElRTU1BZ3NnQXdSQUlCd2dDeUFQSUFnZ0FoQVdJUU1NQWdzZ0hDQUxJQThnQ0NBQ0VCY2hBd3dCQ3lBY0lBc2dEeUFJSUFJUUZTRURDeUFEUVloL1N3MElJQVVnQ3pZQ2dPc0JJQVVnSERZQzhPb0JJQVZCQVRZQ2dPb0JJQnBCQWtZRVFDQUZJQjQyQWd3TElBc2dIR29pQWtJQU53QUFJQUpDQURjQUdDQUNRZ0EzQUJBZ0FrSUFOd0FJSUFsQmlIOUxEUW9MSUFrZ0ZVWU5DQ0FWSUFscklRWWdCU2dDbk9zQklRb0NRQ0FKSUJ0cUlnTXRBQUFpRDBVRVFFRUJJUUpCQUNFUFFiaC9JUWtnQmtFQlJnMEJEQXNMQW44Z0EwRUJhaUFQd0NJQ1FRQk9EUUFhSUFKQmYwWUVRQ0FHUVFOSURRc2dBeThBQVVHQS9nRnFJUThnQTBFRGFnd0JDeUFHUVFKSURRb2dBeTBBQVNBUFFRaDBja0dBZ0FKcklROGdBMEVDYWdzaEVrRzRmeUVKSUJKQkFXb2lBaUFWSUJ0cUlnZExEUW9nTENBRklCSXRBQUFpRWtFR2RrRWpRUWtnQWlBSElBSnJRY0FRUWRBUlFmQVNJQVVvQW9UcUFTQUtJQThnRkJBaElnbEJpSDlMRFFnZ0t5QW9JQkpCQkhaQkEzRkJIMEVJSUFJZ0NXb2lBaUFISUFKclFZQUxRWUFNUVlBWElBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlDRUdJZjBzTkNFRnNJUWtnS2lBdElCSkJBblpCQTNGQk5FRUpJQUlnQ0dvaUFpQUhJQUpyUVlBTlFlQU9RWkFaSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUIwR0lmMHNOQ2lBQ0lBZHFJQU5ySWdJaENTQUNRWWgvU3cwS0N5QU9JQTlCQUV4eURRRUxRYnAvSVFrTUNBc2dKU0FPYXlFSklBWWdBbXNoQmlBQ0lBTnFJUWNDUUFKQUFrQWdDa1VFUUNBUFFRbElJQVVwQThqcEFVS0JnSUFJVkhJTkFpQW9LQUlBSWdKQkNHb2hFaUFDS0FJRUlRcEJBQ0VEUVFBaEFnTkFJQU1nQ25aRkJFQWdBaUFTSUFOQkEzUnFMUUFDUVJaTGFpRUNJQU5CQVdvaEF3d0JDd3NnQlVFQU5nS2M2d0VnQWtFSUlBcHJkRUVVVHcwQkRBTUxJQVZCQURZQ25Pc0JDeUFFSUFVb0F2RHFBU0lETmdMY0FTQUpJQTVxSVJZZ0F5QUZLQUtBNndGcUlSY0NRQ0FQUlFSQUlBNGhCd3dCQ3lBRktBSzQ2UUVoR2lBRktBSzA2UUVoR0NBRktBS3c2UUVoRWlBRlFRRTJBb1RxQVVFQUlRTURRQ0FEUVFOSEJFQWdCQ0FEUVFKMElnSnFJQUlnQldwQnJOQUJhaWdDQURZQ1pDQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFUaHFJZ0lnQnlBR0VBMUJpSDlMRFFOQkNDQVBJQTlCQ0U0YklSOGdOQ0FDSUFVb0FnQVFIaUF6SUFJZ0JTZ0NDQkFlSURJZ0FpQUZLQUlFRUI0Z0RpQVNheUVaUVFBaENBTkFJQVJCT0dvUUQwRURSaUFJSUI5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdkQkVIWWlFVUgvQVhFaEN5QUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZ3hCRUhZaUlVSC9BWEVoRUNBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUVlnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNrSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lLYXlJTklBSWdBaUFOU3hzaUV5QUthallDUENBR0lBUW9BamdnQ25SQkFDQVRhM1lnQWlBVGF5SVRkR29oQ2lBRVFUaHFFQThhSUFJZ0RVME5BU0FFSUFRb0Fqd2lBaUFUYWpZQ1BDQUVLQUk0SUFKMFFRQWdFMnQySUFwcUlRb01BUXNnQkNBQ0lBUW9BandpRFdvMkFqd2dCQ2dDT0NBTmRFRUFJQXByZGlBR2FpRUtJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQW8yQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBREJFQWdCQ2dDWkNFS0RBTUxJQVFvQW1naENnd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQVlnQTBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdaRklBWnFJUW9nQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlBbzJBbVFMcHlFQ0lFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQkJxTmdJOElBUW9BamdnQm5SQkFDQWhhM1lnQW1vaEFnc2dDeUFRYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUF0cU5nSThJQVFvQWpnZ0JuUkJBQ0FSYTNZZ0Eyb2hBd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lCa0VBSUFkQkdIWWlDeUFFS0FJOGFpSVFhM1lnQzBFQ2RFR2dIV29vQWdCeElBZEIvLzhEY1dvMkFrd2dCQ0FRSUF4QkdIWWlCMm9pQ3pZQ1BDQUVJQWRCQW5SQm9CMXFLQUlBSUFaQkFDQUxhM1p4SUF4Qi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ1pCR0hZaUJ5QUVLQUk4YWlJTE5nSThJQVFnQjBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUF0cmRuRWdCa0gvL3dOeGFqWUNWQ0FFUWZBQWFpQUlRUXhzYWlJR0lBbzJBZ2dnQmlBQ05nSUVJQVlnQXpZQ0FDQUlRUUZxSVFnZ0F5QVphaUFDYWlFWkRBRUxDeUFJSUI5SURRTWdGa0VnYXlFaElBNGhCd05BSUFSQk9Hb1FEMEVEUmlBSUlBOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnWkJFSFlpSTBIL0FYRWhDaUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWcxQkVIWWlJRUgvQVhFaEV5QUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFNZ1FVSWdpQ0JBUWlDSXB5RUxBa0FnUWtJUWlLY2lERUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJTWF5SVJJQUlnQWlBUlN4c2lFQ0FNYWpZQ1BDQURJQVFvQWpnZ0RIUkJBQ0FRYTNZZ0FpQVFheUlNZEdvaEVDQUVRVGhxRUE4YUlBSWdFVTBOQVNBRUlBUW9BandpQWlBTWFqWUNQQ0FFS0FJNElBSjBRUUFnREd0MklCQnFJUkFNQVFzZ0JDQUNJQVFvQWp3aUVHbzJBandnQkNnQ09DQVFkRUVBSUF4cmRpQURhaUVRSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUJBMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQUxCRUFnQkNnQ1pDRVFEQU1MSUFRb0FtZ2hFQXdCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFNZ0MwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnTkZJQU5xSVJBZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQkEyQW1RTHB5RU1JRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUJOcU5nSThJQVFvQWpnZ0FuUkJBQ0FnYTNZZ0RHb2hEQXNnQ2lBVGFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lBcHFOZ0k4SUFRb0FqZ2dBblJCQUNBamEzWWdDMm9oQ3dzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQWtFQUlBWkJHSFlpQXlBRUtBSThhaUlLYTNZZ0EwRUNkRUdnSFdvb0FnQnhJQVpCLy84RGNXbzJBa3dnQkNBS0lBMUJHSFlpQTJvaUJqWUNQQ0FFSUFOQkFuUkJvQjFxS0FJQUlBSkJBQ0FHYTNaeElBMUIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdKQkdIWWlBeUFFS0FJOGFpSUdOZ0k4SUFRZ0EwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBWnJkbkVnQWtILy93TnhhallDVkFKQUFrQUNRQ0FFS0FMY0FTSURJQVJCOEFCcUlBaEJCM0ZCREd4cUloTW9BZ0FpRVdvaUl5QVhTdzBBSUFjZ0V5Z0NCQ0lOSUJGcUlncHFJQ0ZMRFFBZ0NrRWdhaUFXSUFkclRRMEJDeUFFSUJNb0FnZzJBaGdnQkNBVEtRSUFOd01RSUFjZ0ZpQUVRUkJxSUFSQjNBRnFJQmNnRWlBWUlCb1FIeUVLREFFTElBY2dFV29oQWlBVEtBSUlJUVlnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0FKQUlCRkJFVWtOQUNBSElBTXBBQkEzQUJBZ0J5QURLUUFZTndBWUlCRkJFR3RCRVVnTkFDQURRUkJxSVFNZ0IwRWdhaUVSQTBBZ0VTQURLUUFRTndBQUlCRWdBeWtBR0RjQUNDQVJJQU1wQUNBM0FCQWdFU0FES1FBb053QVlJQU5CSUdvaEF5QVJRU0JxSWhFZ0Fra05BQXNMSUFJZ0Jtc2hBeUFFSUNNMkF0d0JJQUlnRW1zZ0Jra0VRQ0FHSUFJZ0dHdExEUWNnR2lBYUlBTWdFbXNpQTJvaUVTQU5hazhFUUNBQ0lCRWdEUkFLR2d3Q0N5QURJQTFxSVEwZ0FpQVJRUUFnQTJzUUNpQURheUVDSUJJaEF3c2dCa0VRVHdSQUlBSWdBeWtBQURjQUFDQUNJQU1wQUFnM0FBZ2dEVUVSU0EwQklBSWdEV29oQmlBQ1FSQnFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBR1NRMEFDd3dCQ3dKQUlBWkJCMDBFUUNBQ0lBTXRBQUE2QUFBZ0FpQURMUUFCT2dBQklBSWdBeTBBQWpvQUFpQUNJQU10QUFNNkFBTWdBaUFESUFaQkFuUWlCa0hBSG1vb0FnQnFJZ01vQUFBMkFBUWdBeUFHUWVBZWFpZ0NBR3NoQXd3QkN5QUNJQU1wQUFBM0FBQUxJQTFCQ1VrTkFDQUNJQTFxSVJFZ0FrRUlhaUlHSUFOQkNHb2lBMnRCRDB3RVFBTkFJQVlnQXlrQUFEY0FBQ0FEUVFocUlRTWdCa0VJYWlJR0lCRkpEUUFNQWdzQUN5QUdJQU1wQUFBM0FBQWdCaUFES1FBSU53QUlJQTFCR1VnTkFDQUNRUmhxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQVJTUTBBQ3dzZ0NrR0lmMHNFUUNBS0lRa01CZ1VnRXlBUU5nSUlJQk1nRERZQ0JDQVRJQXMyQWdBZ0NFRUJhaUVJSUFjZ0Ntb2hCeUFMSUJscUlBeHFJUmtNQWdzQUN3c2dDQ0FQU0EwRElBZ2dIMnNoQmdOQUFrQWdCaUFQVGdSQVFRQWhBd05BSUFOQkEwWU5BaUFGSUFOQkFuUWlBbXBCck5BQmFpQUNJQVJxS0FKa05nSUFJQU5CQVdvaEF3d0FDd0FMQWtBQ1FBSkFJQVFvQXR3QklnTWdCRUh3QUdvZ0JrRUhjVUVNYkdvaUNDZ0NBQ0lNYWlJUUlCZExEUUFnQnlBSUtBSUVJZ3NnREdvaUNtb2dJVXNOQUNBS1FTQnFJQllnQjJ0TkRRRUxJQVFnQ0NnQ0NEWUNLQ0FFSUFncEFnQTNBeUFnQnlBV0lBUkJJR29nQkVIY0FXb2dGeUFTSUJnZ0doQWZJUW9NQVFzZ0J5QU1haUVDSUFnb0FnZ2hDQ0FISUFNcEFBQTNBQUFnQnlBREtRQUlOd0FJQWtBZ0RFRVJTUTBBSUFjZ0F5a0FFRGNBRUNBSElBTXBBQmczQUJnZ0RFRVFhMEVSU0EwQUlBTkJFR29oQXlBSFFTQnFJUXdEUUNBTUlBTXBBQkEzQUFBZ0RDQURLUUFZTndBSUlBd2dBeWtBSURjQUVDQU1JQU1wQUNnM0FCZ2dBMEVnYWlFRElBeEJJR29pRENBQ1NRMEFDd3NnQWlBSWF5RURJQVFnRURZQzNBRWdBaUFTYXlBSVNRUkFJQWdnQWlBWWEwc05CeUFhSUJvZ0F5QVNheUlEYWlJTUlBdHFUd1JBSUFJZ0RDQUxFQW9hREFJTElBTWdDMm9oQ3lBQ0lBeEJBQ0FEYXhBS0lBTnJJUUlnRWlFREN5QUlRUkJQQkVBZ0FpQURLUUFBTndBQUlBSWdBeWtBQ0RjQUNDQUxRUkZJRFFFZ0FpQUxhaUVJSUFKQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFJZ0F5MEFBRG9BQUNBQ0lBTXRBQUU2QUFFZ0FpQURMUUFDT2dBQ0lBSWdBeTBBQXpvQUF5QUNJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBSWdBeWtBQURjQUFBc2dDMEVKU1EwQUlBSWdDMm9oRENBQ1FRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0RFa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dDMEVaU0EwQUlBSkJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBeEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0dCU0FHUVFGcUlRWWdCeUFLYWlFSERBSUxBQXNMSUFRb0F0d0JJUU1MUWJwL0lRa2dGeUFEYXlJQ0lCWWdCMnRMRFFJZ0J3Ui9JQWNnQXlBQ0VBSWdBbW9GUVFBTElBNXJJUWtNQWdzZ0JVRUFOZ0tjNndFTElBUWdCU2dDOE9vQklnTTJBdHdCSUFrZ0Rtb2hEQ0FESUFVb0FvRHJBV29oRUFKQUlBOUZCRUFnRGlFR0RBRUxJQVVvQXJqcEFTRU5JQVVvQXJUcEFTRVRJQVVvQXJEcEFTRVNJQVZCQVRZQ2hPb0JRUUFoQXdOQUlBTkJBMGNFUUNBRUlBTkJBblFpQW1vZ0FpQUZha0dzMEFGcUtBSUFOZ0tjQVNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUWZBQWFpSUNJQWNnQmhBTlFZaC9TdzBCSURFZ0FpQUZLQUlBRUI0Z01DQUNJQVVvQWdnUUhpQXZJQUlnQlNnQ0JCQWVJQXhCSUdzaEdDQU9JUVlEUUNBRUtBS0lBU0FFS0FLRUFVRURkR29wQWdBaVFLY2lDa0VRZGlJWlFmOEJjU0VMSUFRb0FwZ0JJQVFvQXBRQlFRTjBhaWtDQUNKQnB5SVdRUkIySWg5Qi93RnhJUm9nQkNnQ2tBRWdCQ2dDakFGQkEzUnFLUUlBSWtKQ0lJaW5JUWNnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NkQ0lJYXlJUklBSWdBaUFSU3hzaUZ5QUlhallDZENBSElBUW9BbkFnQ0hSQkFDQVhhM1lnQWlBWGF5SVhkR29oQ0NBRVFmQUFhaEFQR2lBQ0lCRk5EUUVnQkNBRUtBSjBJZ0lnRjJvMkFuUWdCQ2dDY0NBQ2RFRUFJQmRyZGlBSWFpRUlEQUVMSUFRZ0FpQUVLQUowSWhGcU5nSjBJQVFvQW5BZ0VYUkJBQ0FJYTNZZ0Iyb2hDQ0FFUWZBQWFoQVBHZ3NnQkNrQ25BRWhSQ0FFSUFnMkFwd0JJQVFnUkRjQ29BRU1BUXNDUUNBQ1JRUkFJQU1FUUNBRUtBS2NBU0VJREFNTElBUW9BcUFCSVFnTUFRc2dCQ0FFS0FKMElnSkJBV28yQW5RQ2Z5QUhJQU5GYWlBRUtBSndJQUowUVI5MmFpSUNRUU5HQkVBZ0JDZ0NuQUZCQVdzTUFRc2dBa0VDZENBRWFpZ0NuQUVMSWdkRklBZHFJUWdnQWtFQlJ3UkFJQVFnQkNnQ29BRTJBcVFCQ3dzZ0JDQUVLQUtjQVRZQ29BRWdCQ0FJTmdLY0FRdW5JUUlnUVVLQWdQd0hnMUJGQkVBZ0JDQUVLQUowSWdjZ0dtbzJBblFnQkNnQ2NDQUhkRUVBSUI5cmRpQUNhaUVDQ3lBTElCcHFRUlJQQkVBZ0JFSHdBR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ2RDSUhJQXRxTmdKMElBUW9BbkFnQjNSQkFDQVphM1lnQTJvaEF3c2dCRUh3QUdvUUR4b2dCQ0FFS0FKd0lnZEJBQ0FLUVJoMklnc2dCQ2dDZEdvaUdtdDJJQXRCQW5SQm9CMXFLQUlBY1NBS1FmLy9BM0ZxTmdLRUFTQUVJQm9nRmtFWWRpSUthaUlMTmdKMElBUWdDa0VDZEVHZ0hXb29BZ0FnQjBFQUlBdHJkbkVnRmtILy93TnhhallDbEFFZ0JFSHdBR29RRHhvZ0JDQkNweUlIUVJoMklnb2dCQ2dDZEdvaUN6WUNkQ0FFSUFwQkFuUkJvQjFxS0FJQUlBUW9BbkJCQUNBTGEzWnhJQWRCLy84RGNXbzJBb3dCSUFRZ0F6WUNPQ0FFSUFJMkFqd2dCQ0FJTmdKQUFrQUNRQUpBSUFRb0F0d0JJZ3NnQTJvaUZpQVFTdzBBSUFZZ0FpQURhaUlLYWlBWVN3MEFJQXBCSUdvZ0RDQUdhMDBOQVFzZ0JDQUVRVUJyS0FJQU5nSUlJQVFnQkNrRE9EY0RBQ0FHSUF3Z0JDQUVRZHdCYWlBUUlCSWdFeUFORUI4aENnd0JDeUFESUFacUlRY2dCaUFMS1FBQU53QUFJQVlnQ3lrQUNEY0FDQUpBSUFOQkVVa05BQ0FHSUFzcEFCQTNBQkFnQmlBTEtRQVlOd0FZSUFOQkVHdEJFVWdOQUNBTFFSQnFJUU1nQmtFZ2FpRUxBMEFnQ3lBREtRQVFOd0FBSUFzZ0F5a0FHRGNBQ0NBTElBTXBBQ0EzQUJBZ0N5QURLUUFvTndBWUlBTkJJR29oQXlBTFFTQnFJZ3NnQjBrTkFBc0xJQWNnQ0dzaEF5QUVJQlkyQXR3QklBY2dFbXNnQ0VrRVFDQUlJQWNnRTJ0TERRUWdEU0FOSUFNZ0Vtc2lBMm9pQ3lBQ2FrOEVRQ0FISUFzZ0FoQUtHZ3dDQ3lBSElBdEJBQ0FEYXhBS0lBUWdBaUFEYWlJQ05nSThJQU5ySVFjZ0VpRURDeUFJUVJCUEJFQWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQ0FDUVJGSURRRWdBaUFIYWlFSUlBZEJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBY2dBeTBBQURvQUFDQUhJQU10QUFFNkFBRWdCeUFETFFBQ09nQUNJQWNnQXkwQUF6b0FBeUFISUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQWNnQXlrQUFEY0FBQXNnQWtFSlNRMEFJQUlnQjJvaEN5QUhRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dDMGtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQWtFWlNBMEFJQWRCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXRKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdEQ3lBR0lBcHFJUVlnQkVId0FHb1FEeUVESUE5QkFXc2lEdzBBQzBFQUlRSWdBMEVDU1EwQkEwQWdBa0VEUndSQUlBVWdBa0VDZENJRGFrR3MwQUZxSUFNZ0JHb29BcHdCTmdJQUlBSkJBV29oQWd3QkN3c2dCQ2dDM0FFaEF3dEJ1bjhoQ1NBUUlBTnJJZ0lnRENBR2Ewc05BQ0FHQkg4Z0JpQURJQUlRQWlBQ2FnVkJBQXNnRG1zaENRc2dDVUdJZjBzTkJnc0NRQ0FGS0FMczZnRkZEUUFnQlNBRktRT0k2Z0VnQ2ExOE53T0k2Z0VDUUNBRktBTFE2Z0VpQWlBSmFpSUlRUjlOQkVBZ0RrVU5BU0FDSUNKcUlBNGdDUkFDR2lBRktBTFE2Z0VnQ1dvaENBd0JDeUFPSVFNZ0FnUkFJQUlnSW1vZ0EwRWdJQUpyRUFJYUlBVW9BdERxQVNFQ0lBVkJBRFlDME9vQklBVWdCU2tEa09vQklBVXBBTERxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRGtPb0JJQVVnQlNrRG1Pb0JJQVVwQUxqcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RtT29CSUFVZ0JTa0RvT29CSUFVcEFNRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEb09vQklBVWdCU2tEcU9vQklBVXBBTWpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRHFPb0JJQU1nQW10QklHb2hBd3NnQ1NBT2FpSUNJQU5CSUdwUEJFQWdBa0VnYXlFR0lBVXBBNmpxQVNFL0lBVXBBNkRxQVNGQUlBVXBBNWpxQVNGQklBVXBBNURxQVNGQ0EwQWdBeWtBR0VMUDF0Tyswc2VyMlVKK0lEOThRaCtKUW9lVnI2K1l0dDZibm45K0lUOGdBeWtBRUVMUDF0Tyswc2VyMlVKK0lFQjhRaCtKUW9lVnI2K1l0dDZibm45K0lVQWdBeWtBQ0VMUDF0Tyswc2VyMlVKK0lFRjhRaCtKUW9lVnI2K1l0dDZibm45K0lVRWdBeWtBQUVMUDF0Tyswc2VyMlVKK0lFSjhRaCtKUW9lVnI2K1l0dDZibm45K0lVSWdBMEVnYWlJRElBWk5EUUFMSUFVZ1B6Y0RxT29CSUFVZ1FEY0RvT29CSUFVZ1FUY0RtT29CSUFVZ1FqY0RrT29CQ3lBQ0lBTk5EUUVnSWlBRElBSWdBMnNpQ0JBQ0dnc2dCU0FJTmdMUTZnRUxJRFVnRldzaEF5QVZJQnRxSVFJZ0NTQU9haUVPSUFRb0FqQkZEUUFMSUNrcEF3QWlQMEovVVNBL0lBNGdIV3VzVVhKRkJFQkJiQ0VKREFZTElBVW9BdURwQVFSQVFXb2hDU0FEUVFSSkRRWWdCU2dDNk9vQlJRUkFJQ0lnQlNnQzBPb0JhaUVLQW40Z0JTa0RpT29CSWo5Q0lGb0VRQ0FGS1FPWTZnRWlRRUlIaVNBRktRT1E2Z0VpUVVJQmlYd2dCU2tEb09vQklrSkNESWw4SUFVcEE2anFBU0pEUWhLSmZDQkJRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOUlFQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZvVkNoNVd2cjVpMjNwdWVmMzVDbmFPMTZvT3hqWXI2QUgwZ1FrTFAxdE8rMHNlcjJVSitRaCtKUW9lVnI2K1l0dDZibm45K2hVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNCRFFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5REFFTElBVXBBNkRxQVVMRno5bXk4ZVc2NmlkOEN5QS9mQ0UvSUNJaEJnTkFJQW9nQmtFSWFpSUhUd1JBSUFZcEFBQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUliaVVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0UvSUFjaEJnd0JDd3NDUUNBS0lBWkJCR29pQ0VrRVFDQUdJUWdNQVFzZ0JqVUFBRUtIbGErdm1MYmVtNTUvZmlBL2hVSVhpVUxQMXRPKzBzZXIyVUorUXZuejNmR1o5cG1yRm53aFB3c0RRQ0FJSUFwSkJFQWdDREVBQUVMRno5bXk4ZVc2NmlkK0lEK0ZRZ3VKUW9lVnI2K1l0dDZibm45K0lUOGdDRUVCYWlFSURBRUxDeUFDS0FBQUlEOUNJWWdnUDRWQ3o5YlR2dExIcTlsQ2ZpSS9RaDJJSUQrRlF2bnozZkdaOXBtckZuNGlQMElnaUNBL2hhZEhEUWNMSUFOQkJHc2hBeUFDUVFScUlRSUxJQTRnSFdzaUNVR0pmMDhOQkNBQklBbHJJUUVnQ1NBZGFpRWRRUUVoUGd3QkN3dEJ1SDhoQnlBRERRUWdIU0FBYXlFSERBUUxRV3doQ1F3QkMwRzRmeUVKQzBHNGZ5RUhJQWxCZGtZZ1BuRU5BUXNnQ1NFSEN5Z0NBQTBBSUFWQi9Pb0JhaWdDQUNFQklBVkIrT29CYWlnQ0FDRUFJQVVRR0NBRktBS3c2d0VnQUNBQkVCTWdCVUVBTmdLdzZ3RWdCU2dDcE9zQklnSUVRQUpBQWtBQ1FBSkFJQUlvQWdBaUF3UkFJQUJGRFFJZ0FTQURJQUFSQWdBTUFRc2dBRVVOQWdzZ0FTQUNJQUFSQWdBTUFnc2dBeEFHQ3lBQ0VBWUxJQVZCQURZQ3BPc0JDeUFBQkVBZ0FTQUZJQUFSQWdBTUFRc2dCUkFHQ3lBRVFlQUJhaVFBSUFjTEM2Z1ZDUUJCaUFnTERRRUFBQUFCQUFBQUFnQUFBQUlBUWFBSUM3TUdBUUFBQUFFQUFBQUNBQUFBQWdBQUFDWUFBQUNDQUFBQUlRVUFBRW9BQUFCbkNBQUFKZ0FBQU1BQkFBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUtRQUFBQ3dDQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBTHdBQUFNb0NBQUNBQUFBQWlnVUFBRW9BQUFDRUNRQUFOUUFBQUhNREFBQ0FBQUFBblFVQUFFb0FBQUNnQ1FBQVBRQUFBSUVEQUFDQUFBQUE2d1VBQUVzQUFBQStDZ0FBUkFBQUFKNERBQUNBQUFBQVRRWUFBRXNBQUFDcUNnQUFTd0FBQUxNREFBQ0FBQUFBd1FZQUFFMEFBQUFmRFFBQVRRQUFBRk1FQUFDQUFBQUFJd2dBQUZFQUFBQ21Ed0FBVkFBQUFKa0VBQUNBQUFBQVN3a0FBRmNBQUFDeEVnQUFXQUFBQU5vRUFBQ0FBQUFBYndrQUFGMEFBQUFqRkFBQVZBQUFBRVVGQUFDQUFBQUFWQW9BQUdvQUFBQ01GQUFBYWdBQUFLOEZBQUNBQUFBQWRna0FBSHdBQUFCT0VBQUFmQUFBQU5JQ0FBQ0FBQUFBWXdjQUFKRUFBQUNRQndBQWtnQUFBQUFBQUFBQkFBQUFBUUFBQUFVQUFBQU5BQUFBSFFBQUFEMEFBQUI5QUFBQS9RQUFBUDBCQUFEOUF3QUEvUWNBQVAwUEFBRDlId0FBL1Q4QUFQMS9BQUQ5L3dBQS9mOEJBUDMvQXdEOS93Y0EvZjhQQVAzL0h3RDkvejhBL2Y5L0FQMy8vd0Q5Ly84Qi9mLy9BLzMvL3dmOS8vOFAvZi8vSC8zLy96LzkvLzkvQUFBQUFBRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVJBQUFBRWdBQUFCTUFBQUFVQUFBQUZRQUFBQllBQUFBWEFBQUFHQUFBQUJrQUFBQWFBQUFBR3dBQUFCd0FBQUFkQUFBQUhnQUFBQjhBQUFBREFBQUFCQUFBQUFVQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFCRUFBQUFTQUFBQUV3QUFBQlFBQUFBVkFBQUFGZ0FBQUJjQUFBQVlBQUFBR1FBQUFCb0FBQUFiQUFBQUhBQUFBQjBBQUFBZUFBQUFId0FBQUNBQUFBQWhBQUFBSWdBQUFDTUFBQUFsQUFBQUp3QUFBQ2tBQUFBckFBQUFMd0FBQURNQUFBQTdBQUFBUXdBQUFGTUFBQUJqQUFBQWd3QUFBQU1CQUFBREFnQUFBd1FBQUFNSUFBQURFQUFBQXlBQUFBTkFBQUFEZ0FBQUF3QUJBRUhnRHd0UkFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVVBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBQUFBUUFFSEVFQXVMQVFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBU0FBQUFGQUFBQUJZQUFBQVlBQUFBSEFBQUFDQUFBQUFvQUFBQU1BQUFBRUFBQUFDQUFBQUFBQUVBQUFBQ0FBQUFCQUFBQUFnQUFBQVFBQUFBSUFBQUFFQUFBQUNBQUFBQUFBRUFRWkFTQytZRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBQkFBQUFCQUFBQUFnQUFBQUFBQUFBQVFBQkFRWUFBQUFBQUFBRUFBQUFBQkFBQUFRQUFBQUFJQUFBQlFFQUFBQUFBQUFGQXdBQUFBQUFBQVVFQUFBQUFBQUFCUVlBQUFBQUFBQUZCd0FBQUFBQUFBVUpBQUFBQUFBQUJRb0FBQUFBQUFBRkRBQUFBQUFBQUFZT0FBQUFBQUFCQlJBQUFBQUFBQUVGRkFBQUFBQUFBUVVXQUFBQUFBQUNCUndBQUFBQUFBTUZJQUFBQUFBQUJBVXdBQUFBSUFBR0JVQUFBQUFBQUFjRmdBQUFBQUFBQ0FZQUFRQUFBQUFLQmdBRUFBQUFBQXdHQUJBQUFDQUFBQVFBQUFBQUFBQUFCQUVBQUFBQUFBQUZBZ0FBQUNBQUFBVUVBQUFBQUFBQUJRVUFBQUFnQUFBRkJ3QUFBQUFBQUFVSUFBQUFJQUFBQlFvQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUlBQUJCUkFBQUFBQUFBRUZFZ0FBQUNBQUFRVVdBQUFBQUFBQ0JSZ0FBQUFnQUFNRklBQUFBQUFBQXdVb0FBQUFBQUFHQkVBQUFBQVFBQVlFUUFBQUFDQUFCd1dBQUFBQUFBQUpCZ0FDQUFBQUFBc0dBQWdBQURBQUFBUUFBQUFBRUFBQUJBRUFBQUFnQUFBRkFnQUFBQ0FBQUFVREFBQUFJQUFBQlFVQUFBQWdBQUFGQmdBQUFDQUFBQVVJQUFBQUlBQUFCUWtBQUFBZ0FBQUZDd0FBQUNBQUFBVU1BQUFBQUFBQUJnOEFBQUFnQUFFRkVnQUFBQ0FBQVFVVUFBQUFJQUFDQlJnQUFBQWdBQUlGSEFBQUFDQUFBd1VvQUFBQUlBQUVCVEFBQUFBQUFCQUdBQUFCQUFBQUR3WUFnQUFBQUFBT0JnQkFBQUFBQUEwR0FDQUFRWUFYQzRjQ0FRQUJBUVVBQUFBQUFBQUZBQUFBQUFBQUJnUTlBQUFBQUFBSkJmMEJBQUFBQUE4Ri9YOEFBQUFBRlFYOS94OEFBQUFEQlFVQUFBQUFBQWNFZlFBQUFBQUFEQVg5RHdBQUFBQVNCZjMvQXdBQUFCY0YvZjkvQUFBQUJRVWRBQUFBQUFBSUJQMEFBQUFBQUE0Ri9UOEFBQUFBRkFYOS93OEFBQUFDQlFFQUFBQVFBQWNFZlFBQUFBQUFDd1g5QndBQUFBQVJCZjMvQVFBQUFCWUYvZjgvQUFBQUJBVU5BQUFBRUFBSUJQMEFBQUFBQUEwRi9SOEFBQUFBRXdYOS93Y0FBQUFCQlFFQUFBQVFBQVlFUFFBQUFBQUFDZ1g5QXdBQUFBQVFCZjMvQUFBQUFCd0YvZi8vRHdBQUd3WDkvLzhIQUFBYUJmMy8vd01BQUJrRi9mLy9BUUFBR0FYOS8vOEFRWkFaQzRZRUFRQUJBUVlBQUFBQUFBQUdBd0FBQUFBQUFBUUVBQUFBSUFBQUJRVUFBQUFBQUFBRkJnQUFBQUFBQUFVSUFBQUFBQUFBQlFrQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUFBQUFCaEFBQUFBQUFBQUdFd0FBQUFBQUFBWVdBQUFBQUFBQUJoa0FBQUFBQUFBR0hBQUFBQUFBQUFZZkFBQUFBQUFBQmlJQUFBQUFBQUVHSlFBQUFBQUFBUVlwQUFBQUFBQUNCaThBQUFBQUFBTUdPd0FBQUFBQUJBWlRBQUFBQUFBSEJvTUFBQUFBQUFrR0F3SUFBQkFBQUFRRUFBQUFBQUFBQkFVQUFBQWdBQUFGQmdBQUFBQUFBQVVIQUFBQUlBQUFCUWtBQUFBQUFBQUZDZ0FBQUFBQUFBWU1BQUFBQUFBQUJnOEFBQUFBQUFBR0VnQUFBQUFBQUFZVkFBQUFBQUFBQmhnQUFBQUFBQUFHR3dBQUFBQUFBQVllQUFBQUFBQUFCaUVBQUFBQUFBRUdJd0FBQUFBQUFRWW5BQUFBQUFBQ0Jpc0FBQUFBQUFNR013QUFBQUFBQkFaREFBQUFBQUFGQm1NQUFBQUFBQWdHQXdFQUFDQUFBQVFFQUFBQU1BQUFCQVFBQUFBUUFBQUVCUUFBQUNBQUFBVUhBQUFBSUFBQUJRZ0FBQUFnQUFBRkNnQUFBQ0FBQUFVTEFBQUFBQUFBQmc0QUFBQUFBQUFHRVFBQUFBQUFBQVlVQUFBQUFBQUFCaGNBQUFBQUFBQUdHZ0FBQUFBQUFBWWRBQUFBQUFBQUJpQUFBQUFBQUJBR0F3QUJBQUFBRHdZRGdBQUFBQUFPQmdOQUFBQUFBQTBHQXlBQUFBQUFEQVlERUFBQUFBQUxCZ01JQUFBQUFBb0dBd1FBUWFRZEM5a0JBUUFBQUFNQUFBQUhBQUFBRHdBQUFCOEFBQUEvQUFBQWZ3QUFBUDhBQUFEL0FRQUEvd01BQVA4SEFBRC9Ed0FBL3g4QUFQOC9BQUQvZndBQS8vOEFBUC8vQVFELy93TUEvLzhIQVAvL0R3RC8veDhBLy84L0FQLy9md0QvLy84QS8vLy9BZi8vL3dQLy8vOEgvLy8vRC8vLy94Ly8vLzgvLy8vL2Z3QUFBQUFCQUFBQUFnQUFBQVFBQUFBQUFBQUFBZ0FBQUFRQUFBQUlBQUFBQUFBQUFBRUFBQUFDQUFBQUFRQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBZ0FBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0JCZ0I4TEE0QVJBUT09Ijt2YXIgeXQ9bmV3IFRBLHd0PSExO2FzeW5jIGZ1bmN0aW9uIHlyKEEsZSx0KXtsZXQgST0idW5rbm93biI7dHlwZW9mIEEhPSJzdHJpbmciP0k9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP0k9QTpJPXR5cGVvZiBlPCJ1Ij9gJHtlfS8ke0F9YDpBLEkuZW5kc1dpdGgoIi5qcyIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTMpKSxJLmVuZHNXaXRoKCIud2FzbSIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTUpKSxJLmVuZHNXaXRoKCIud2FzbS56c3QiKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC05KSk7bGV0IHI9YCR7SX0ud2FzbWAsZz1hd2FpdCB0QS5nZXQoYCR7cn0uenN0YCx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KTt3dHx8KGF3YWl0IHl0LmluaXQoKSx3dD0hMCk7bGV0IEM9eXQuZGVjb2RlKG5ldyBVaW50OEFycmF5KGcuZGF0YSkpLmJ1ZmZlcjtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke0l9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6Q30pfXZhciBtdD15cjt2YXIgU3Q9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIGt0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLEZ0PW5ldyBUZXh0RW5jb2RlcixSdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gd3IoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxJPUEuZnNfb3BlbihlLHQuZmxhZ3MpLGc9QS5mc19zdGF0KGUpLnNpemUsaT1udWxsO2t0P2k9bmV3IFNoYXJlZEFycmF5QnVmZmVyKGcpOmk9bmV3IEFycmF5QnVmZmVyKGcpO2xldCBDPW5ldyBVaW50OEFycmF5KGkpO3JldHVybiBBLmZzX3JlYWQoSSxDLDAsZywwKSxBLmZzX2Nsb3NlKEkpLEN9ZnVuY3Rpb24gVXQoQSxlLHQpe2xldCBJPW51bGw7a3Q/ST1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6ST1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoSSksZz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gci5zZXQoZykscn1mdW5jdGlvbiBtKEEsZSx0LEkpe2xldCByPTA7cmV0dXJuIGUhPT1udWxsJiYocj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LEksZS5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShlLmJ1ZmZlcikscikpLHJ9ZnVuY3Rpb24gSyhBLGUsdCl7bGV0IEk9SlNPTi5zdHJpbmdpZnkoZSkscj1BLmxlbmd0aEJ5dGVzVVRGOChJKSsxLGc9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LHJdKTtBLnN0cmluZ1RvVVRGOChJLGcscil9ZnVuY3Rpb24gRihBLGUsdCxJKXtsZXQgcj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxnPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLGk9VXQoQSxyLGcpO3JldHVybiBMKEksaS5idWZmZXIpfWZ1bmN0aW9uIGZBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSksST1BLlVURjhUb1N0cmluZyh0KTtyZXR1cm4gSlNPTi5wYXJzZShJKX1mdW5jdGlvbiBtcihBLGUsdCxJKXtJIT1udWxsJiZJLmxlbmd0aD4wJiZJLmZvckVhY2goZnVuY3Rpb24oQixvKXtzd2l0Y2goQi50eXBlKXtjYXNlIGQuVGV4dFN0cmVhbTp7bGV0IGE9RnQuZW5jb2RlKEIuZGF0YS5kYXRhKSxsPW0oQSxhLG8sMCkscz17c2l6ZTphLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWB9O0soQSxzLG8pO2JyZWFrfWNhc2UgZC5Kc29uQ29tcGF0aWJsZTp7bGV0IGE9RnQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEIuZGF0YSkpLGw9bShBLGEsbywwKSxzPXtzaXplOmEuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YH07SyhBLHMsbyk7YnJlYWt9Y2FzZSBkLkJpbmFyeVN0cmVhbTp7bGV0IGE9Qi5kYXRhLmRhdGEsbD1tKEEsYSxvLDApLHM9e3NpemU6YS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gfTtLKEEscyxvKTticmVha31jYXNlIGQuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEIuZGF0YS5wYXRoLEIuZGF0YS5kYXRhKTticmVha31jYXNlIGQuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQi5kYXRhLnBhdGgsQi5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgZC5JbWFnZTp7bGV0IGE9Qi5kYXRhLGw9bShBLGEuZGF0YSxvLDApLHM9bShBLGEuZGlyZWN0aW9uLG8sMSksUT10eXBlb2YgYS5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShhLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sZj17aW1hZ2VUeXBlOmEuaW1hZ2VUeXBlLG5hbWU6YS5uYW1lLG9yaWdpbjphLm9yaWdpbixzcGFjaW5nOmEuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsc2l6ZTphLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCxtZXRhZGF0YTpRfTtLKEEsZixvKTticmVha31jYXNlIGQuTWVzaDp7bGV0IGE9Qi5kYXRhLGw9bShBLGEucG9pbnRzLG8sMCkscz1tKEEsYS5jZWxscyxvLDEpLFE9bShBLGEucG9pbnREYXRhLG8sMiksZj1tKEEsYS5jZWxsRGF0YSxvLDMpLGM9e21lc2hUeXBlOmEubWVzaFR5cGUsbmFtZTphLm5hbWUsbnVtYmVyT2ZQb2ludHM6YS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAsbnVtYmVyT2ZDZWxsczphLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtzfWAsY2VsbEJ1ZmZlclNpemU6YS5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmEubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtLKEEsYyxvKTticmVha31jYXNlIGQuUG9pbnRTZXQ6e2xldCBhPUIuZGF0YSxsPW0oQSxhLnBvaW50cyxvLDApLHM9bShBLGEucG9pbnREYXRhLG8sMSksUT17cG9pbnRTZXRUeXBlOmEucG9pbnRTZXRUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLG51bWJlck9mUG9pbnRQaXhlbHM6YS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YH07SyhBLFEsbyk7YnJlYWt9Y2FzZSBkLlRyYW5zZm9ybUxpc3Q6e2xldCBhPUIuZGF0YSxsPVtdO2EuZm9yRWFjaCgocyxRKT0+e2xldCBjPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bShBLHMuZml4ZWRQYXJhbWV0ZXJzLG8sUSoyKX1gLGg9YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHttKEEscy5wYXJhbWV0ZXJzLG8sUSoyKzEpfWAsRD17dHJhbnNmb3JtVHlwZTpzLnRyYW5zZm9ybVR5cGUsbnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM6cy5udW1iZXJPZkZpeGVkUGFyYW1ldGVycyxudW1iZXJPZlBhcmFtZXRlcnM6cy5udW1iZXJPZlBhcmFtZXRlcnMsbmFtZTpzLm5hbWUsaW5wdXRTcGFjZU5hbWU6cy5pbnB1dFNwYWNlTmFtZSxvdXRwdXRTcGFjZU5hbWU6cy5vdXRwdXRTcGFjZU5hbWUscGFyYW1ldGVyczpoLGZpeGVkUGFyYW1ldGVyczpjfTtsLnB1c2goRCl9KSxLKEEsbCxvKTticmVha31jYXNlIGQuUG9seURhdGE6e2xldCBhPUIuZGF0YSxsPW0oQSxhLnBvaW50cyxvLDApLHM9bShBLGEudmVydGljZXMsbywxKSxRPW0oQSxhLmxpbmVzLG8sMiksZj1tKEEsYS5wb2x5Z29ucyxvLDMpLGM9bShBLGEudHJpYW5nbGVTdHJpcHMsbyw0KSx1PW0oQSxhLnBvaW50RGF0YSxvLDUpLGg9bShBLGEucG9pbnREYXRhLG8sNiksRD17cG9seURhdGFUeXBlOmEucG9seURhdGFUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLHZlcnRpY2VzQnVmZmVyU2l6ZTphLnZlcnRpY2VzQnVmZmVyU2l6ZSx2ZXJ0aWNlczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3N9YCxsaW5lc0J1ZmZlclNpemU6YS5saW5lc0J1ZmZlclNpemUsbGluZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAscG9seWdvbnNCdWZmZXJTaXplOmEucG9seWdvbnNCdWZmZXJTaXplLHBvbHlnb25zOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLHRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTphLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSx0cmlhbmdsZVN0cmlwczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt1fWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmEubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7aH1gfTtLKEEsRCxvKTticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBpbnB1dCBJbnRlcmZhY2VUeXBlIil9fSksQS5yZXNldE1vZHVsZVN0ZG91dCgpLEEucmVzZXRNb2R1bGVTdGRlcnIoKTtsZXQgcj1BLnN0YWNrU2F2ZSgpLGc9MDt0cnl7Zz1BLmNhbGxNYWluKGUuc2xpY2UoKSl9Y2F0Y2goQil7dGhyb3cgdHlwZW9mIEI9PSJudW1iZXIiJiYoY29uc29sZS5sb2coIkV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHBpcGVsaW5lOiIpLGNvbnNvbGUubG9nKCJzdGRvdXQ6IixBLmdldE1vZHVsZVN0ZG91dCgpKSxjb25zb2xlLmVycm9yKCJzdGRlcnI6IixBLmdldE1vZHVsZVN0ZGVycigpKSx0eXBlb2YgQS5nZXRFeGNlcHRpb25NZXNzYWdlPCJ1Ij9jb25zb2xlLmVycm9yKCJleGNlcHRpb246IixBLmdldEV4Y2VwdGlvbk1lc3NhZ2UoQikpOmNvbnNvbGUuZXJyb3IoIkJ1aWxkIG1vZHVsZSBpbiBEZWJ1ZyBtb2RlIGZvciBleGNlcHRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4iKSksQn1maW5hbGx5e0Euc3RhY2tSZXN0b3JlKHIpfWxldCBpPUEuZ2V0TW9kdWxlU3Rkb3V0KCksQz1BLmdldE1vZHVsZVN0ZGVycigpLEU9W107cmV0dXJuIHQhPW51bGwmJnQubGVuZ3RoPjAmJmc9PT0wJiZ0LmZvckVhY2goZnVuY3Rpb24oQixvKXtsZXQgYT1udWxsO3N3aXRjaChCLnR5cGUpe2Nhc2UgZC5UZXh0U3RyZWFtOntsZXQgcz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxvLDBdKSxRPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG8sMF0pLGY9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLHMsUSk7YT17ZGF0YTpSdC5kZWNvZGUoZil9O2JyZWFrfWNhc2UgZC5Kc29uQ29tcGF0aWJsZTp7bGV0IHM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbywwXSksUT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxvLDBdKSxmPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixzLFEpO2E9SlNPTi5wYXJzZShSdC5kZWNvZGUoZikpO2JyZWFrfWNhc2UgZC5CaW5hcnlTdHJlYW06e2xldCBzPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG8sMF0pLFE9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbywwXSk7YT17ZGF0YTpVdChBLHMsUSl9O2JyZWFrfWNhc2UgZC5UZXh0RmlsZTp7YT17cGF0aDpCLmRhdGEucGF0aCxkYXRhOkEuZnNfcmVhZEZpbGUoQi5kYXRhLnBhdGgse2VuY29kaW5nOiJ1dGY4In0pfTticmVha31jYXNlIGQuQmluYXJ5RmlsZTp7YT17cGF0aDpCLmRhdGEucGF0aCxkYXRhOndyKEEsQi5kYXRhLnBhdGgpfTticmVha31jYXNlIGQuSW1hZ2U6e2xldCBzPWZBKEEsbyk7cy5kYXRhPUYoQSxvLDAscy5pbWFnZVR5cGUuY29tcG9uZW50VHlwZSkscy5kaXJlY3Rpb249RihBLG8sMSxaLkZsb2F0NjQpLHMubWV0YWRhdGE9bmV3IE1hcChzLm1ldGFkYXRhKSxhPXM7YnJlYWt9Y2FzZSBkLk1lc2g6e2xldCBzPWZBKEEsbyk7cy5udW1iZXJPZlBvaW50cz4wP3MucG9pbnRzPUYoQSxvLDAscy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUpOnMucG9pbnRzPUwocy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mQ2VsbHM+MD9zLmNlbGxzPUYoQSxvLDEscy5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSk6cy5jZWxscz1MKHMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzLm51bWJlck9mUG9pbnRQaXhlbHM+MD9zLnBvaW50RGF0YT1GKEEsbywyLHMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUwocy5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/cy5jZWxsRGF0YT1GKEEsbywzLHMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6cy5jZWxsRGF0YT1MKHMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGE9czticmVha31jYXNlIGQuUG9pbnRTZXQ6e2xldCBzPWZBKEEsbyk7cy5udW1iZXJPZlBvaW50cz4wP3MucG9pbnRzPUYoQSxvLDAscy5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpzLnBvaW50cz1MKHMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZQb2ludFBpeGVscz4wP3MucG9pbnREYXRhPUYoQSxvLDEscy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOnMucG9pbnREYXRhPUwocy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhPXM7YnJlYWt9Y2FzZSBkLlRyYW5zZm9ybUxpc3Q6e2xldCBzPWZBKEEsbyk7cy5mb3JFYWNoKChRLGYpPT57US5udW1iZXJPZkZpeGVkUGFyYW1ldGVycz4wJiYoc1tmXS5maXhlZFBhcmFtZXRlcnM9RihBLG8sZioyLFEudHJhbnNmb3JtVHlwZS5wYXJhbWV0ZXJzVmFsdWVUeXBlKSksUS5udW1iZXJPZkZpeGVkUGFyYW1ldGVycz4wJiYoc1tmXS5wYXJhbWV0ZXJzPUYoQSxvLGYqMisxLFEudHJhbnNmb3JtVHlwZS5wYXJhbWV0ZXJzVmFsdWVUeXBlKSl9KSxhPXM7YnJlYWt9Y2FzZSBkLlBvbHlEYXRhOntsZXQgcz1mQShBLG8pO3MubnVtYmVyT2ZQb2ludHM+MD9zLnBvaW50cz1GKEEsbywwLFouRmxvYXQzMik6cy5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSxzLnZlcnRpY2VzQnVmZmVyU2l6ZT4wP3MudmVydGljZXM9RihBLG8sMSxrLlVJbnQzMik6cy52ZXJ0aWNlcz1uZXcgVWludDMyQXJyYXkscy5saW5lc0J1ZmZlclNpemU+MD9zLmxpbmVzPUYoQSxvLDIsay5VSW50MzIpOnMubGluZXM9bmV3IFVpbnQzMkFycmF5LHMucG9seWdvbnNCdWZmZXJTaXplPjA/cy5wb2x5Z29ucz1GKEEsbywzLGsuVUludDMyKTpzLnBvbHlnb25zPW5ldyBVaW50MzJBcnJheSxzLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT4wP3MudHJpYW5nbGVTdHJpcHM9RihBLG8sNCxrLlVJbnQzMik6cy50cmlhbmdsZVN0cmlwcz1uZXcgVWludDMyQXJyYXkscy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/cy5wb2ludERhdGE9RihBLG8sNSxzLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6cy5wb2ludERhdGE9TChzLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/cy5jZWxsRGF0YT1GKEEsbyw2LHMucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOnMuY2VsbERhdGE9TChzLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksYT1zO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIG91dHB1dCBJbnRlcmZhY2VUeXBlIil9bGV0IGw9e3R5cGU6Qi50eXBlLGRhdGE6YX07RS5wdXNoKGwpfSkse3JldHVyblZhbHVlOmcsc3Rkb3V0Omksc3RkZXJyOkMsb3V0cHV0czpFfX12YXIgTnQ9bXI7dmFyIFNyPXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPCJ1IjtmdW5jdGlvbiBGcihBLGUpe2lmKEE9PW51bGwpcmV0dXJuW107bGV0IHQ9W107Zm9yKGxldCBJPTA7STxBLmxlbmd0aDtJKyspe2xldCByPVJyKEFbSV0sZSk7ciE9PW51bGwmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBScihBLGUpe2lmKEE9PW51bGwpcmV0dXJuIG51bGw7bGV0IHQ9bnVsbDtyZXR1cm4gQS5idWZmZXIhPT12b2lkIDA/dD1BLmJ1ZmZlcjpBLmJ5dGVMZW5ndGghPT12b2lkIDAmJih0PUEpLFNyJiZ0IGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/bnVsbDplP3Q6dC5zbGljZSgwKX12YXIgR3Q9RnI7ZnVuY3Rpb24ga3IoQSl7cmV0dXJuW0EuZGF0YSxBLmRpcmVjdGlvbl19dmFyIGJ0PWtyO2Z1bmN0aW9uIFVyKEEpe3JldHVybltBLnBvaW50cyxBLnBvaW50RGF0YSxBLmNlbGxzLEEuY2VsbERhdGFdfXZhciBMdD1VcjtmdW5jdGlvbiBOcihBKXtyZXR1cm5bQS5wb2ludHMsQS52ZXJ0aWNlcyxBLmxpbmVzLEEucG9seWdvbnMsQS50cmlhbmdsZVN0cmlwcyxBLnBvaW50RGF0YSxBLmNlbGxEYXRhXX12YXIgSnQ9TnI7dmFyIEdyO2Z1bmN0aW9uIE9BKCl7cmV0dXJuIEdyfXZhciBicjtmdW5jdGlvbiBNdCgpe3JldHVybiBicn12YXIgTHI7ZnVuY3Rpb24gS0EoKXtyZXR1cm4gTHJ9dmFyIERlPW5ldyBNYXA7ZnVuY3Rpb24gSnIoKXtsZXQgQT1LQSgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPW51bGwpLEF9ZnVuY3Rpb24gSHQoKXtsZXQgQT1PQSgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPW5ldyBVUkwoIi9waXBlbGluZXMiLGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikuaHJlZiksQX1mdW5jdGlvbiB4QSgpe2xldCBBPU10KCk7cmV0dXJuIHR5cGVvZiBBPiJ1IiYmKEE9e30pLEF9YXN5bmMgZnVuY3Rpb24gTXIoQSxlLHQpe2xldCBJPUEscj1BO2lmKHR5cGVvZiBBIT0ic3RyaW5nIiYmKEk9bmV3IFVSTChBLmhyZWYpLHI9SS5ocmVmKSxEZS5oYXMocikpcmV0dXJuIERlLmdldChyKTt7bGV0IGc9YXdhaXQgbXQoQSxlPy50b1N0cmluZygpPz9IdCgpLHQ/P3hBKCkpO3JldHVybiBEZS5zZXQocixnKSxnfX1hc3luYyBmdW5jdGlvbiBIcihBLGUsdCxJLHIpe2lmKCFhd2FpdCBTdCgpKXtsZXQgYz0iV2ViQXNzZW1ibHkgU0lNRCBzdXBwb3J0IGlzIHJlcXVpcmVkIC0tIHBsZWFzZSB1cGRhdGUgeW91ciBicm93c2VyLiI7dGhyb3cgYWxlcnQoYyksbmV3IEVycm9yKGMpfWxldCBnPXI/LndlYldvcmtlcj8/bnVsbDtpZihnPT09ITEpe2xldCBjPWF3YWl0IE1yKEEudG9TdHJpbmcoKSxyPy5waXBlbGluZUJhc2VVcmwscj8ucGlwZWxpbmVRdWVyeVBhcmFtcz8/eEEoKSk7cmV0dXJuIE50KGMsZSx0LEkpfWxldCBpPWcsQz1yPy5waXBlbGluZVdvcmtlclVybD8/SnIoKSxFPXR5cGVvZiBDIT0ic3RyaW5nIiYmdHlwZW9mIEM/LmhyZWY8InUiP0MuaHJlZjpDLHt3b3JrZXJQcm94eTpCLHdvcmtlcjpvfT1hd2FpdCBodChpLEUscj8ucGlwZWxpbmVRdWVyeVBhcmFtcz8/eEEoKSk7aT1vO2xldCBhPVtdO0khPW51bGwmJkkubGVuZ3RoPjAmJkkuZm9yRWFjaChmdW5jdGlvbihjKXtpZihjLnR5cGU9PT1kLkJpbmFyeVN0cmVhbSl7bGV0IHU9Yy5kYXRhLmRhdGE7YS5wdXNoKHUpfWVsc2UgaWYoYy50eXBlPT09ZC5CaW5hcnlGaWxlKXtsZXQgdT1jLmRhdGEuZGF0YTthLnB1c2godSl9ZWxzZSBpZihjLnR5cGU9PT1kLkltYWdlKXtsZXQgdT1jLmRhdGE7dS5kYXRhIT09bnVsbCYmYS5wdXNoKC4uLmJ0KHUpKX1lbHNlIGlmKGMudHlwZT09PWQuTWVzaCl7bGV0IHU9Yy5kYXRhO2EucHVzaCguLi5MdCh1KSl9ZWxzZSBpZihjLnR5cGU9PT1kLlBvbHlEYXRhKXtsZXQgdT1jLmRhdGE7YS5wdXNoKC4uLkp0KHUpKX19KTtsZXQgbD1yPy5waXBlbGluZUJhc2VVcmw/P0h0KCkscz10eXBlb2YgbCE9InN0cmluZyImJnR5cGVvZiBsPy5ocmVmPCJ1Ij9sLmhyZWY6bCxRPUkhPW51bGw/WkEoSSxHdChhLHI/Lm5vQ29weSkpOm51bGwsZj1hd2FpdCBCLnJ1blBpcGVsaW5lKEEudG9TdHJpbmcoKSxzLGUsdCxRLHI/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P3hBKCkpO3JldHVybntyZXR1cm5WYWx1ZTpmLnJldHVyblZhbHVlLHN0ZG91dDpmLnN0ZG91dCxzdGRlcnI6Zi5zdGRlcnIsb3V0cHV0czpmLm91dHB1dHMsd2ViV29ya2VyOml9fXZhciBxPUhyO3ZhciBZcj1udWxsO2Z1bmN0aW9uIFl0KCl7cmV0dXJuIFlyfXZhciBxdD17bmFtZToiQGl0ay13YXNtL2VsYXN0aXgiLHZlcnNpb246IjAuNC4wIixkZXNjcmlwdGlvbjoiQSB0b29sYm94IGZvciByaWdpZCBhbmQgbm9ucmlnaWQgcmVnaXN0cmF0aW9uIG9mIGltYWdlcy4iLHR5cGU6Im1vZHVsZSIsbW9kdWxlOiIuL2Rpc3QvaW5kZXguanMiLHR5cGVzOiIuL2Rpc3QvaW5kZXgtYWxsLmQudHMiLGV4cG9ydHM6eyIuIjp7dHlwZXM6Ii4vZGlzdC9pbmRleC1hbGwuZC50cyIsYnJvd3NlcjoiLi9kaXN0L2luZGV4LmpzIixub2RlOiIuL2Rpc3QvaW5kZXgtbm9kZS5qcyIsZGVmYXVsdDoiLi9kaXN0L2luZGV4LWFsbC5qcyJ9fSxzY3JpcHRzOntzdGFydDoicG5wbSBjb3B5RGVtb0FwcEFzc2V0cyAmJiB2aXRlIix0ZXN0OiJucG0gcnVuIHRlc3Q6bm9kZSAmJiBucG0gcnVuIHRlc3Q6YnJvd3NlciIsInRlc3Q6bm9kZSI6ImF2YSAtLXRpbWVvdXQgMTBtIHRlc3Qvbm9kZS8qLmpzIiwidGVzdDpicm93c2VyIjoibnBtIHJ1biB0ZXN0OmJyb3dzZXI6Y2hyb21lICYmIG5wbSBydW4gdGVzdDpicm93c2VyOmZpcmVmb3giLCJ0ZXN0OmJyb3dzZXI6ZmlyZWZveCI6InN0YXJ0LXNlcnZlci1hbmQtdGVzdCBzdGFydCBodHRwLWdldDovL2xvY2FsaG9zdDo1MTczIGN5cHJlc3M6cnVuRmlyZWZveCIsInRlc3Q6YnJvd3NlcjpjaHJvbWUiOiJzdGFydC1zZXJ2ZXItYW5kLXRlc3Qgc3RhcnQgaHR0cC1nZXQ6Ly9sb2NhbGhvc3Q6NTE3MyBjeXByZXNzOnJ1bkNocm9tZSIsInRlc3Q6YnJvd3NlcjpkZWJ1ZyI6InN0YXJ0LXNlcnZlci1hbmQtdGVzdCBzdGFydCBodHRwLWdldDovL2xvY2FsaG9zdDo1MTczIGN5cHJlc3M6b3BlbiIsImN5cHJlc3M6b3BlbiI6Im5weCBjeXByZXNzIG9wZW4iLCJjeXByZXNzOnJ1bkNocm9tZSI6Im5weCBjeXByZXNzIHJ1biAtLWJyb3dzZXIgY2hyb21lIiwiY3lwcmVzczpydW5GaXJlZm94IjoibnB4IGN5cHJlc3MgcnVuIC0tYnJvd3NlciBmaXJlZm94Iixjb3B5RGVtb0FwcEFzc2V0czoic2h4IG1rZGlyIC1wIHRlc3QvYnJvd3Nlci9kZW1vLWFwcC9wdWJsaWMvc2hvZWxhY2UgJiYgc2h4IGNwIC1yIG5vZGVfbW9kdWxlcy9AaXRrLXdhc20vZGVtby1hcHAvZGlzdC9hc3NldHMgdGVzdC9icm93c2VyL2RlbW8tYXBwL3B1YmxpYy8iLGJ1aWxkOiJwbnBtIGJ1aWxkOnRzYyAmJiBwbnBtIGJ1aWxkOmJyb3dzZXI6d29ya2VyRW1iZWRkZWQgJiYgcG5wbSBidWlsZDpicm93c2VyOndvcmtlckVtYmVkZGVkTWluICYmIHBucG0gYnVpbGQ6ZGVtbyIsImJ1aWxkOmJyb3dzZXI6d29ya2VyRW1iZWRkZWQiOiJlc2J1aWxkIC0tbG9hZGVyOi53b3JrZXIuanM9ZGF0YXVybCAtLWJ1bmRsZSAtLWZvcm1hdD1lc20gLS1vdXRmaWxlPS4vZGlzdC9idW5kbGUvaW5kZXgtd29ya2VyLWVtYmVkZGVkLmpzIC4vc3JjL2luZGV4LXdvcmtlci1lbWJlZGRlZC50cyIsImJ1aWxkOmJyb3dzZXI6d29ya2VyRW1iZWRkZWRNaW4iOiJlc2J1aWxkIC0tbWluaWZ5IC0tbG9hZGVyOi53b3JrZXIuanM9ZGF0YXVybCAtLWJ1bmRsZSAtLWZvcm1hdD1lc20gLS1vdXRmaWxlPS4vZGlzdC9idW5kbGUvaW5kZXgtd29ya2VyLWVtYmVkZGVkLm1pbi5qcyAuL3NyYy9pbmRleC13b3JrZXItZW1iZWRkZWQubWluLnRzIiwiYnVpbGQ6dHNjIjoidHNjIC0tcHJldHR5IiwiYnVpbGQ6ZGVtbyI6InBucG0gY29weURlbW9BcHBBc3NldHMgJiYgdml0ZSBidWlsZCJ9LGtleXdvcmRzOlsiaXRrIiwid2FzbSIsIndlYmFzc2VtYmx5Iiwid2FzaSJdLGF1dGhvcjoiIixsaWNlbnNlOiJBcGFjaGUtMi4wIixkZXBlbmRlbmNpZXM6eyJpdGstd2FzbSI6Il4xLjAuMC1iLjE4OCJ9LGRldkRlcGVuZGVuY2llczp7IkBpdGstd2FzbS9kZW1vLWFwcCI6Il4wLjIuMCIsIkBpdGstd2FzbS9pbWFnZS1pbyI6Il4xLjMuMCIsIkB0eXBlcy9ub2RlIjoiXjIwLjIuNSIsYXZhOiJeNS4zLjEiLGN5cHJlc3M6Il4xMy43LjMiLGRlYnVnOiJeNC4zLjQiLGVzYnVpbGQ6Il4wLjI1LjAiLHNoeDoiXjAuMy40Iiwic3RhcnQtc2VydmVyLWFuZC10ZXN0IjoiXjIuMC4wIix0eXBlc2NyaXB0OiJeNS41LjQiLHZpdGU6Il40LjUuNiIsInZpdGUtcGx1Z2luLXN0YXRpYy1jb3B5IjoiXjAuMTcuMCJ9LHJlcG9zaXRvcnk6e3R5cGU6ImdpdCIsdXJsOiJodHRwczovL2dpdGh1Yi5jb20vSW5zaWdodFNvZnR3YXJlQ29uc29ydGl1bS9JVEtFbGFzdGl4In19O3ZhciB5ZSxUcj1gaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AaXRrLXdhc20vZWxhc3RpeEAke3F0LnZlcnNpb259L2Rpc3QvcGlwZWxpbmVzYDtmdW5jdGlvbiBkYShBKXt5ZT1BfWZ1bmN0aW9uIHgoKXtpZih0eXBlb2YgeWU8InUiKXJldHVybiB5ZTtsZXQgQT1PQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpUcn12YXIgd2UsT3I9bnVsbDtmdW5jdGlvbiBUdChBKXt3ZT1BfWZ1bmN0aW9uIEgoKXtpZih0eXBlb2Ygd2U8InUiKXJldHVybiB3ZTtsZXQgQT1LQSgpO3JldHVybiB0eXBlb2YgQTwidSI/QTpPcn12YXIgSUE9bnVsbDthc3luYyBmdW5jdGlvbiBPdCgpe2xldCBBPUgoKSxlPXR5cGVvZiBBIT0ic3RyaW5nIiYmdHlwZW9mIEE/LmhyZWY8InUiP0EuaHJlZjpBO0lBPWF3YWl0IGNBKGUpfWZ1bmN0aW9uIEZhKEEpe0lBPUF9YXN5bmMgZnVuY3Rpb24gUCgpe2lmKElBIT09bnVsbClyZXR1cm4gSUEudGVybWluYXRlZCYmYXdhaXQgT3QoKSxJQTtsZXQgQT1ZdCgpO3JldHVybiBBIT09bnVsbD9BOihhd2FpdCBPdCgpLElBKX1hc3luYyBmdW5jdGlvbiBLcihBLGU9e30pe2xldCB0PVt7dHlwZTpkLkpzb25Db21wYXRpYmxlfV0sST1bXSxyPVtdO3IucHVzaChBLnRvU3RyaW5nKCkpLHIucHVzaCgiMCIpLHIucHVzaCgiLS1tZW1vcnktaW8iKSxlLm51bWJlck9mUmVzb2x1dGlvbnMmJnIucHVzaCgiLS1udW1iZXItb2YtcmVzb2x1dGlvbnMiLGUubnVtYmVyT2ZSZXNvbHV0aW9ucy50b1N0cmluZygpKSxlLmZpbmFsR3JpZFNwYWNpbmcmJnIucHVzaCgiLS1maW5hbC1ncmlkLXNwYWNpbmciLGUuZmluYWxHcmlkU3BhY2luZy50b1N0cmluZygpKTtsZXQgaT0iZGVmYXVsdC1wYXJhbWV0ZXItbWFwIixDPWU/LndlYldvcmtlcjtDPT09dm9pZCAwJiYoQz1hd2FpdCBQKCkpO2xldHt3ZWJXb3JrZXI6RSxyZXR1cm5WYWx1ZTpCLHN0ZGVycjpvLG91dHB1dHM6YX09YXdhaXQgcShpLHIsdCxJLHtwaXBlbGluZUJhc2VVcmw6eCgpLHBpcGVsaW5lV29ya2VyVXJsOkgoKSx3ZWJXb3JrZXI6Qyxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoQiE9PTAmJm8hPT0iIil0aHJvdyBuZXcgRXJyb3Iobyk7cmV0dXJue3dlYldvcmtlcjpFLHBhcmFtZXRlck1hcDphWzBdPy5kYXRhfX12YXIgeHI9S3I7YXN5bmMgZnVuY3Rpb24gUHIoQSxlLHQ9e30pe2xldCBJPVt7dHlwZTpkLkltYWdlfSx7dHlwZTpkLkJpbmFyeUZpbGUsZGF0YTp7cGF0aDplLGRhdGE6bmV3IFVpbnQ4QXJyYXl9fSx7dHlwZTpkLkpzb25Db21wYXRpYmxlfV0scj1be3R5cGU6ZC5Kc29uQ29tcGF0aWJsZSxkYXRhOkF9XSxnPVtdO2cucHVzaCgiMCIpLGcucHVzaCgiMCIpO2xldCBFPWU7aWYoZy5wdXNoKEUpLGcucHVzaCgiMiIpLGcucHVzaCgiLS1tZW1vcnktaW8iKSx0LmZpeGVkKXtsZXQgdT1yLmxlbmd0aC50b1N0cmluZygpO3IucHVzaCh7dHlwZTpkLkltYWdlLGRhdGE6dC5maXhlZH0pLGcucHVzaCgiLS1maXhlZCIsdSl9aWYodC5tb3Zpbmcpe2xldCB1PXIubGVuZ3RoLnRvU3RyaW5nKCk7ci5wdXNoKHt0eXBlOmQuSW1hZ2UsZGF0YTp0Lm1vdmluZ30pLGcucHVzaCgiLS1tb3ZpbmciLHUpfWlmKHQuaW5pdGlhbFRyYW5zZm9ybSl7bGV0IHU9dC5pbml0aWFsVHJhbnNmb3JtLGg9dTtpZih1IGluc3RhbmNlb2YgRmlsZSl7bGV0IE49YXdhaXQgdS5hcnJheUJ1ZmZlcigpO2g9e3BhdGg6dS5uYW1lLGRhdGE6bmV3IFVpbnQ4QXJyYXkoTil9fWcucHVzaCgiLS1pbml0aWFsLXRyYW5zZm9ybSIpLHIucHVzaCh7dHlwZTpkLkJpbmFyeUZpbGUsZGF0YTpofSk7bGV0IEQ9dSBpbnN0YW5jZW9mIEZpbGU/dS5uYW1lOnUucGF0aDtnLnB1c2goRCl9aWYodC5pbml0aWFsVHJhbnNmb3JtUGFyYW1ldGVyT2JqZWN0KXtsZXQgdT1yLmxlbmd0aC50b1N0cmluZygpO3IucHVzaCh7dHlwZTpkLkpzb25Db21wYXRpYmxlLGRhdGE6dC5pbml0aWFsVHJhbnNmb3JtUGFyYW1ldGVyT2JqZWN0fSksZy5wdXNoKCItLWluaXRpYWwtdHJhbnNmb3JtLXBhcmFtZXRlci1vYmplY3QiLHUpfWxldCBvPSJlbGFzdGl4IixhPXQ/LndlYldvcmtlcjthPT09dm9pZCAwJiYoYT1hd2FpdCBQKCkpO2xldHt3ZWJXb3JrZXI6bCxyZXR1cm5WYWx1ZTpzLHN0ZGVycjpRLG91dHB1dHM6Zn09YXdhaXQgcShvLGcsSSxyLHtwaXBlbGluZUJhc2VVcmw6eCgpLHBpcGVsaW5lV29ya2VyVXJsOkgoKSx3ZWJXb3JrZXI6YSxub0NvcHk6dD8ubm9Db3B5fSk7aWYocyE9PTAmJlEhPT0iIil0aHJvdyBuZXcgRXJyb3IoUSk7cmV0dXJue3dlYldvcmtlcjpsLHJlc3VsdDpmWzBdPy5kYXRhLHRyYW5zZm9ybTpmWzFdPy5kYXRhLHRyYW5zZm9ybVBhcmFtZXRlck9iamVjdDpmWzJdPy5kYXRhfX12YXIgV3I9UHI7YXN5bmMgZnVuY3Rpb24ganIoQT17cGFyYW1ldGVyRmlsZXM6W119KXtsZXQgZT1be3R5cGU6ZC5Kc29uQ29tcGF0aWJsZX1dLHQ9W10sST1bXTtpZihJLnB1c2goIjAiKSxJLnB1c2goIi0tbWVtb3J5LWlvIiksQS5wYXJhbWV0ZXJGaWxlcyl7aWYoQS5wYXJhbWV0ZXJGaWxlcy5sZW5ndGg8MSl0aHJvdyBuZXcgRXJyb3IoJyJwYXJhbWV0ZXItZmlsZXMiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7SS5wdXNoKCItLXBhcmFtZXRlci1maWxlcyIpLGF3YWl0IFByb21pc2UuYWxsKEEucGFyYW1ldGVyRmlsZXMubWFwKGFzeW5jIGw9PntsZXQgcz1sO2lmKGwgaW5zdGFuY2VvZiBGaWxlKXtsZXQgZj1hd2FpdCBsLmFycmF5QnVmZmVyKCk7cz17cGF0aDpsLm5hbWUsZGF0YTpuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZil9fXQucHVzaCh7dHlwZTpkLlRleHRGaWxlLGRhdGE6c30pO2xldCBRPWwgaW5zdGFuY2VvZiBGaWxlP2wubmFtZTpzLnBhdGg7SS5wdXNoKFEpfSkpfWxldCBnPSJyZWFkLXBhcmFtZXRlci1maWxlcyIsaT1BPy53ZWJXb3JrZXI7aT09PXZvaWQgMCYmKGk9YXdhaXQgUCgpKTtsZXR7d2ViV29ya2VyOkMscmV0dXJuVmFsdWU6RSxzdGRlcnI6QixvdXRwdXRzOm99PWF3YWl0IHEoZyxJLGUsdCx7cGlwZWxpbmVCYXNlVXJsOngoKSxwaXBlbGluZVdvcmtlclVybDpIKCksd2ViV29ya2VyOmksbm9Db3B5OkE/Lm5vQ29weX0pO2lmKEUhPT0wJiZCIT09IiIpdGhyb3cgbmV3IEVycm9yKEIpO3JldHVybnt3ZWJXb3JrZXI6QyxwYXJhbWV0ZXJPYmplY3Q6b1swXT8uZGF0YX19dmFyIHZyPWpyO2FzeW5jIGZ1bmN0aW9uIFpyKEEsZSx0PXt9KXtsZXQgcj1bLi4uZS5tYXAoaD0+KHt0eXBlOmQuVGV4dEZpbGUsZGF0YTp7cGF0aDpoLGRhdGE6IiJ9fSkpXSxnPTAsaT1nO2crPWUubGVuZ3RoO2xldCBDPWcsRT1be3R5cGU6ZC5Kc29uQ29tcGF0aWJsZSxkYXRhOkF9XSxCPVtdO0IucHVzaCgiMCIpLGUuZm9yRWFjaChoPT5CLnB1c2goaCkpLEIucHVzaCgiLS1tZW1vcnktaW8iKTtsZXQgYT0id3JpdGUtcGFyYW1ldGVyLWZpbGVzIixsPXQ/LndlYldvcmtlcjtsPT09dm9pZCAwJiYobD1hd2FpdCBQKCkpO2xldHt3ZWJXb3JrZXI6cyxyZXR1cm5WYWx1ZTpRLHN0ZGVycjpmLG91dHB1dHM6Y309YXdhaXQgcShhLEIscixFLHtwaXBlbGluZUJhc2VVcmw6eCgpLHBpcGVsaW5lV29ya2VyVXJsOkgoKSx3ZWJXb3JrZXI6bCxub0NvcHk6dD8ubm9Db3B5fSk7aWYoUSE9PTAmJmYhPT0iIil0aHJvdyBuZXcgRXJyb3IoZik7cmV0dXJue3dlYldvcmtlcjpzLHBhcmFtZXRlckZpbGVzOmMuc2xpY2UoaSxDKS5tYXAoaD0+aD8uZGF0YSl9fXZhciBWcj1acjt2YXIgS3Q9J2RhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsdmFyIG1lPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgd2U9KEEsdCk9Pntmb3IodmFyIGUgaW4gdCltZShBLGUse2dldDp0W2VdLGVudW1lcmFibGU6ITB9KX07dmFyIGZ0PVN5bWJvbCgiQ29tbGluay5wcm94eSIpLHBlPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLFNlPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxZQT1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksYUE9U3ltYm9sKCJDb21saW5rLnRocm93biIpLGx0PUE9PnR5cGVvZiBBPT0ib2JqZWN0IiYmQSE9PW51bGx8fHR5cGVvZiBBPT0iZnVuY3Rpb24iLEZlPXtjYW5IYW5kbGU6QT0+bHQoQSkmJkFbZnRdLHNlcmlhbGl6ZShBKXtsZXR7cG9ydDE6dCxwb3J0MjplfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIGZBKEEsdCksW2UsW2VdXX0sZGVzZXJpYWxpemUoQSl7cmV0dXJuIEEuc3RhcnQoKSxHZShBKX19LFJlPXtjYW5IYW5kbGU6QT0+bHQoQSkmJmFBIGluIEEsc2VyaWFsaXplKHt2YWx1ZTpBfSl7bGV0IHQ7cmV0dXJuIEEgaW5zdGFuY2VvZiBFcnJvcj90PXtpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOkEubWVzc2FnZSxuYW1lOkEubmFtZSxzdGFjazpBLnN0YWNrfX06dD17aXNFcnJvcjohMSx2YWx1ZTpBfSxbdCxbXV19LGRlc2VyaWFsaXplKEEpe3Rocm93IEEuaXNFcnJvcj9PYmplY3QuYXNzaWduKG5ldyBFcnJvcihBLnZhbHVlLm1lc3NhZ2UpLEEudmFsdWUpOkEudmFsdWV9fSx1dD1uZXcgTWFwKFtbInByb3h5IixGZV0sWyJ0aHJvdyIsUmVdXSk7ZnVuY3Rpb24gTmUoQSx0KXtmb3IobGV0IGUgb2YgQSlpZih0PT09ZXx8ZT09PSIqInx8ZSBpbnN0YW5jZW9mIFJlZ0V4cCYmZS50ZXN0KHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGZBKEEsdD1nbG9iYWxUaGlzLGU9WyIqIl0pe3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gSShyKXtpZighcnx8IXIuZGF0YSlyZXR1cm47aWYoIU5lKGUsci5vcmlnaW4pKXtjb25zb2xlLndhcm4oYEludmFsaWQgb3JpZ2luIFwnJHtyLm9yaWdpbn1cJyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6byx0eXBlOmcscGF0aDpDfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxyLmRhdGEpLFE9KHIuZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoTyksYTt0cnl7bGV0IG49Qy5zbGljZSgwLC0xKS5yZWR1Y2UoKGYsQik9PmZbQl0sQSkscz1DLnJlZHVjZSgoZixCKT0+ZltCXSxBKTtzd2l0Y2goZyl7Y2FzZSJHRVQiOmE9czticmVhaztjYXNlIlNFVCI6bltDLnNsaWNlKC0xKVswXV09TyhyLmRhdGEudmFsdWUpLGE9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6YT1zLmFwcGx5KG4sUSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgZj1uZXcgcyguLi5RKTthPWJlKGYpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6Zixwb3J0MjpCfT1uZXcgTWVzc2FnZUNoYW5uZWw7ZkEoQSxCKSxhPU1BKGYsW2ZdKX1icmVhaztjYXNlIlJFTEVBU0UiOmE9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChuKXthPXt2YWx1ZTpuLFthQV06MH19UHJvbWlzZS5yZXNvbHZlKGEpLmNhdGNoKG49Pih7dmFsdWU6bixbYUFdOjB9KSkudGhlbihuPT57bGV0W3MsZl09Y0Eobik7dC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scykse2lkOm99KSxmKSxnPT09IlJFTEVBU0UiJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixJKSxEdCh0KSxZQSBpbiBBJiZ0eXBlb2YgQVtZQV09PSJmdW5jdGlvbiImJkFbWUFdKCkpfSkuY2F0Y2gobj0+e2xldFtzLGZdPWNBKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbYUFdOjB9KTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7aWQ6b30pLGYpfSl9KSx0LnN0YXJ0JiZ0LnN0YXJ0KCl9ZnVuY3Rpb24gVWUoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gRHQoQSl7VWUoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBHZShBLHQpe3JldHVybiBxQShBLFtdLHQpfWZ1bmN0aW9uIEJBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBodChBKXtyZXR1cm4gUChBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntEdChBKX0pfXZhciBRQT1uZXcgV2Vha01hcCxFQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgdD0oUUEuZ2V0KEEpfHwwKS0xO1FBLnNldChBLHQpLHQ9PT0wJiZodChBKX0pO2Z1bmN0aW9uIGtlKEEsdCl7bGV0IGU9KFFBLmdldCh0KXx8MCkrMTtRQS5zZXQodCxlKSxFQSYmRUEucmVnaXN0ZXIoQSx0LEEpfWZ1bmN0aW9uIExlKEEpe0VBJiZFQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIHFBKEEsdD1bXSxlPWZ1bmN0aW9uKCl7fSl7bGV0IEk9ITEscj1uZXcgUHJveHkoZSx7Z2V0KG8sZyl7aWYoQkEoSSksZz09PVNlKXJldHVybigpPT57TGUociksaHQoQSksST0hMH07aWYoZz09PSJ0aGVuIil7aWYodC5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5yfTtsZXQgQz1QKEEse3R5cGU6IkdFVCIscGF0aDp0Lm1hcChRPT5RLnRvU3RyaW5nKCkpfSkudGhlbihPKTtyZXR1cm4gQy50aGVuLmJpbmQoQyl9cmV0dXJuIHFBKEEsWy4uLnQsZ10pfSxzZXQobyxnLEMpe0JBKEkpO2xldFtRLGFdPWNBKEMpO3JldHVybiBQKEEse3R5cGU6IlNFVCIscGF0aDpbLi4udCxnXS5tYXAobj0+bi50b1N0cmluZygpKSx2YWx1ZTpRfSxhKS50aGVuKE8pfSxhcHBseShvLGcsQyl7QkEoSSk7bGV0IFE9dFt0Lmxlbmd0aC0xXTtpZihRPT09cGUpcmV0dXJuIFAoQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihPKTtpZihRPT09ImJpbmQiKXJldHVybiBxQShBLHQuc2xpY2UoMCwtMSkpO2xldFthLG5dPWN0KEMpO3JldHVybiBQKEEse3R5cGU6IkFQUExZIixwYXRoOnQubWFwKHM9PnMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OmF9LG4pLnRoZW4oTyl9LGNvbnN0cnVjdChvLGcpe0JBKEkpO2xldFtDLFFdPWN0KGcpO3JldHVybiBQKEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDp0Lm1hcChhPT5hLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpDfSxRKS50aGVuKE8pfX0pO3JldHVybiBrZShyLEEpLHJ9ZnVuY3Rpb24gSmUoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gY3QoQSl7bGV0IHQ9QS5tYXAoY0EpO3JldHVyblt0Lm1hcChlPT5lWzBdKSxKZSh0Lm1hcChlPT5lWzFdKSldfXZhciBkdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBNQShBLHQpe3JldHVybiBkdC5zZXQoQSx0KSxBfWZ1bmN0aW9uIGJlKEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1tmdF06ITB9KX1mdW5jdGlvbiBjQShBKXtmb3IobGV0W3QsZV1vZiB1dClpZihlLmNhbkhhbmRsZShBKSl7bGV0W0kscl09ZS5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOnQsdmFsdWU6SX0scl19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LGR0LmdldChBKXx8W11dfWZ1bmN0aW9uIE8oQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gdXQuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiBQKEEsdCxlKXtyZXR1cm4gbmV3IFByb21pc2UoST0+e2xldCByPUhlKCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvKGcpeyFnLmRhdGF8fCFnLmRhdGEuaWR8fGcuZGF0YS5pZCE9PXJ8fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLEkoZy5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpyfSx0KSxlKX0pfWZ1bmN0aW9uIEhlKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiB2KEEsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkodCxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6WWV9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOk9BfT1PYmplY3QsdUE9KEE9PnQ9PntsZXQgZT1ZZS5jYWxsKHQpO3JldHVybiBBW2VdfHwoQVtlXT1lLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksRz1BPT4oQT1BLnRvTG93ZXJDYXNlKCksdD0+dUEodCk9PT1BKSxEQT1BPT50PT50eXBlb2YgdD09PUEse2lzQXJyYXk6V309QXJyYXksJD1EQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gcWUoQSl7cmV0dXJuIEEhPT1udWxsJiYhJChBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiEkKEEuY29uc3RydWN0b3IpJiZOKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciBwdD1HKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIE1lKEEpe2xldCB0O3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/dD1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6dD1BJiZBLmJ1ZmZlciYmcHQoQS5idWZmZXIpLHR9dmFyIFRlPURBKCJzdHJpbmciKSxOPURBKCJmdW5jdGlvbiIpLFN0PURBKCJudW1iZXIiKSxoQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLEtlPUE9PkE9PT0hMHx8QT09PSExLGxBPUE9PntpZih1QShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCB0PU9BKEEpO3JldHVybih0PT09bnVsbHx8dD09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LE9lPUcoIkRhdGUiKSx4ZT1HKCJGaWxlIiksUGU9RygiQmxvYiIpLFdlPUcoIkZpbGVMaXN0IiksamU9QT0+aEEoQSkmJk4oQS5waXBlKSxaZT1BPT57bGV0IHQ7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8TihBLmFwcGVuZCkmJigodD11QShBKSk9PT0iZm9ybWRhdGEifHx0PT09Im9iamVjdCImJk4oQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sVmU9RygiVVJMU2VhcmNoUGFyYW1zIiksW19lLFhlLHplLHZlXT1bIlJlYWRhYmxlU3RyZWFtIiwiUmVxdWVzdCIsIlJlc3BvbnNlIiwiSGVhZGVycyJdLm1hcChHKSwkZT1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywiIik7ZnVuY3Rpb24gQUEoQSx0LHthbGxPd25LZXlzOmU9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgSSxyO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxXKEEpKWZvcihJPTAscj1BLmxlbmd0aDtJPHI7SSsrKXQuY2FsbChudWxsLEFbSV0sSSxBKTtlbHNle2xldCBvPWU/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksZz1vLmxlbmd0aCxDO2ZvcihJPTA7STxnO0krKylDPW9bSV0sdC5jYWxsKG51bGwsQVtDXSxDLEEpfX1mdW5jdGlvbiBGdChBLHQpe3Q9dC50b0xvd2VyQ2FzZSgpO2xldCBlPU9iamVjdC5rZXlzKEEpLEk9ZS5sZW5ndGgscjtmb3IoO0ktLSA+MDspaWYocj1lW0ldLHQ9PT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHI7cmV0dXJuIG51bGx9dmFyIHg9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxSdD1BPT4hJChBKSYmQSE9PXg7ZnVuY3Rpb24gS0EoKXtsZXR7Y2FzZWxlc3M6QX09UnQodGhpcykmJnRoaXN8fHt9LHQ9e30sZT0oSSxyKT0+e2xldCBvPUEmJkZ0KHQscil8fHI7bEEodFtvXSkmJmxBKEkpP3Rbb109S0EodFtvXSxJKTpsQShJKT90W29dPUtBKHt9LEkpOlcoSSk/dFtvXT1JLnNsaWNlKCk6dFtvXT1JfTtmb3IobGV0IEk9MCxyPWFyZ3VtZW50cy5sZW5ndGg7STxyO0krKylhcmd1bWVudHNbSV0mJkFBKGFyZ3VtZW50c1tJXSxlKTtyZXR1cm4gdH12YXIgQUk9KEEsdCxlLHthbGxPd25LZXlzOkl9PXt9KT0+KEFBKHQsKHIsbyk9PntlJiZOKHIpP0Fbb109dihyLGUpOkFbb109cn0se2FsbE93bktleXM6SX0pLEEpLHRJPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksZUk9KEEsdCxlLEkpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSxJKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOnQucHJvdG90eXBlfSksZSYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSxlKX0sSUk9KEEsdCxlLEkpPT57bGV0IHIsbyxnLEM9e307aWYodD10fHx7fSxBPT1udWxsKXJldHVybiB0O2Rve2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLG89ci5sZW5ndGg7by0tID4wOylnPXJbb10sKCFJfHxJKGcsQSx0KSkmJiFDW2ddJiYodFtnXT1BW2ddLENbZ109ITApO0E9ZSE9PSExJiZPQShBKX13aGlsZShBJiYoIWV8fGUoQSx0KSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gdH0sckk9KEEsdCxlKT0+e0E9U3RyaW5nKEEpLChlPT09dm9pZCAwfHxlPkEubGVuZ3RoKSYmKGU9QS5sZW5ndGgpLGUtPXQubGVuZ3RoO2xldCBJPUEuaW5kZXhPZih0LGUpO3JldHVybiBJIT09LTEmJkk9PT1lfSxvST1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoVyhBKSlyZXR1cm4gQTtsZXQgdD1BLmxlbmd0aDtpZighU3QodCkpcmV0dXJuIG51bGw7bGV0IGU9bmV3IEFycmF5KHQpO2Zvcig7dC0tID4wOyllW3RdPUFbdF07cmV0dXJuIGV9LGdJPShBPT50PT5BJiZ0IGluc3RhbmNlb2YgQSkodHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZPQShVaW50OEFycmF5KSksaUk9KEEsdCk9PntsZXQgST0oQSYmQVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKEEpLHI7Zm9yKDsocj1JLm5leHQoKSkmJiFyLmRvbmU7KXtsZXQgbz1yLnZhbHVlO3QuY2FsbChBLG9bMF0sb1sxXSl9fSxuST0oQSx0KT0+e2xldCBlLEk9W107Zm9yKDsoZT1BLmV4ZWModCkpIT09bnVsbDspSS5wdXNoKGUpO3JldHVybiBJfSxzST1HKCJIVE1MRm9ybUVsZW1lbnQiKSxDST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxmdW5jdGlvbihlLEkscil7cmV0dXJuIEkudG9VcHBlckNhc2UoKStyfSksbXQ9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4odCxlKT0+QS5jYWxsKHQsZSkpKE9iamVjdC5wcm90b3R5cGUpLEJJPUcoIlJlZ0V4cCIpLE50PShBLHQpPT57bGV0IGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSksST17fTtBQShlLChyLG8pPT57bGV0IGc7KGc9dChyLG8sQSkpIT09ITEmJihJW29dPWd8fHIpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxJKX0sYUk9QT0+e050KEEsKHQsZSk9PntpZihOKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YoZSkhPT0tMSlyZXR1cm4hMTtsZXQgST1BW2VdO2lmKE4oSSkpe2lmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdCl7dC53cml0YWJsZT0hMTtyZXR1cm59dC5zZXR8fCh0LnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcJyIrZSsiXCciKX0pfX0pfSxRST0oQSx0KT0+e2xldCBlPXt9LEk9cj0+e3IuZm9yRWFjaChvPT57ZVtvXT0hMH0pfTtyZXR1cm4gVyhBKT9JKEEpOkkoU3RyaW5nKEEpLnNwbGl0KHQpKSxlfSxFST0oKT0+e30sY0k9KEEsdCk9PkEhPW51bGwmJk51bWJlci5pc0Zpbml0ZShBPStBKT9BOnQsVEE9ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Iix3dD0iMDEyMzQ1Njc4OSIsVXQ9e0RJR0lUOnd0LEFMUEhBOlRBLEFMUEhBX0RJR0lUOlRBK1RBLnRvVXBwZXJDYXNlKCkrd3R9LGZJPShBPTE2LHQ9VXQuQUxQSEFfRElHSVQpPT57bGV0IGU9IiIse2xlbmd0aDpJfT10O2Zvcig7QS0tOyllKz10W01hdGgucmFuZG9tKCkqSXwwXTtyZXR1cm4gZX07ZnVuY3Rpb24gbEkoQSl7cmV0dXJuISEoQSYmTihBLmFwcGVuZCkmJkFbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJGb3JtRGF0YSImJkFbU3ltYm9sLml0ZXJhdG9yXSl9dmFyIHVJPUE9PntsZXQgdD1uZXcgQXJyYXkoMTApLGU9KEkscik9PntpZihoQShJKSl7aWYodC5pbmRleE9mKEkpPj0wKXJldHVybjtpZighKCJ0b0pTT04iaW4gSSkpe3Rbcl09STtsZXQgbz1XKEkpP1tdOnt9O3JldHVybiBBQShJLChnLEMpPT57bGV0IFE9ZShnLHIrMSk7ISQoUSkmJihvW0NdPVEpfSksdFtyXT12b2lkIDAsb319cmV0dXJuIEl9O3JldHVybiBlKEEsMCl9LERJPUcoIkFzeW5jRnVuY3Rpb24iKSxoST1BPT5BJiYoaEEoQSl8fE4oQSkpJiZOKEEudGhlbikmJk4oQS5jYXRjaCksR3Q9KChBLHQpPT5BP3NldEltbWVkaWF0ZTp0PygoZSxJKT0+KHguYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtzb3VyY2U6cixkYXRhOm99KT0+e3I9PT14JiZvPT09ZSYmSS5sZW5ndGgmJkkuc2hpZnQoKSgpfSwhMSkscj0+e0kucHVzaChyKSx4LnBvc3RNZXNzYWdlKGUsIioiKX0pKShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsW10pOmU9PnNldFRpbWVvdXQoZSkpKHR5cGVvZiBzZXRJbW1lZGlhdGU9PSJmdW5jdGlvbiIsTih4LnBvc3RNZXNzYWdlKSksZEk9dHlwZW9mIHF1ZXVlTWljcm90YXNrPCJ1Ij9xdWV1ZU1pY3JvdGFzay5iaW5kKHgpOnR5cGVvZiBwcm9jZXNzPCJ1IiYmcHJvY2Vzcy5uZXh0VGlja3x8R3QsaT17aXNBcnJheTpXLGlzQXJyYXlCdWZmZXI6cHQsaXNCdWZmZXI6cWUsaXNGb3JtRGF0YTpaZSxpc0FycmF5QnVmZmVyVmlldzpNZSxpc1N0cmluZzpUZSxpc051bWJlcjpTdCxpc0Jvb2xlYW46S2UsaXNPYmplY3Q6aEEsaXNQbGFpbk9iamVjdDpsQSxpc1JlYWRhYmxlU3RyZWFtOl9lLGlzUmVxdWVzdDpYZSxpc1Jlc3BvbnNlOnplLGlzSGVhZGVyczp2ZSxpc1VuZGVmaW5lZDokLGlzRGF0ZTpPZSxpc0ZpbGU6eGUsaXNCbG9iOlBlLGlzUmVnRXhwOkJJLGlzRnVuY3Rpb246Tixpc1N0cmVhbTpqZSxpc1VSTFNlYXJjaFBhcmFtczpWZSxpc1R5cGVkQXJyYXk6Z0ksaXNGaWxlTGlzdDpXZSxmb3JFYWNoOkFBLG1lcmdlOktBLGV4dGVuZDpBSSx0cmltOiRlLHN0cmlwQk9NOnRJLGluaGVyaXRzOmVJLHRvRmxhdE9iamVjdDpJSSxraW5kT2Y6dUEsa2luZE9mVGVzdDpHLGVuZHNXaXRoOnJJLHRvQXJyYXk6b0ksZm9yRWFjaEVudHJ5OmlJLG1hdGNoQWxsOm5JLGlzSFRNTEZvcm06c0ksaGFzT3duUHJvcGVydHk6bXQsaGFzT3duUHJvcDptdCxyZWR1Y2VEZXNjcmlwdG9yczpOdCxmcmVlemVNZXRob2RzOmFJLHRvT2JqZWN0U2V0OlFJLHRvQ2FtZWxDYXNlOkNJLG5vb3A6RUksdG9GaW5pdGVOdW1iZXI6Y0ksZmluZEtleTpGdCxnbG9iYWw6eCxpc0NvbnRleHREZWZpbmVkOlJ0LEFMUEhBQkVUOlV0LGdlbmVyYXRlU3RyaW5nOmZJLGlzU3BlY0NvbXBsaWFudEZvcm06bEksdG9KU09OT2JqZWN0OnVJLGlzQXN5bmNGbjpESSxpc1RoZW5hYmxlOmhJLHNldEltbWVkaWF0ZTpHdCxhc2FwOmRJfTtmdW5jdGlvbiBqKEEsdCxlLEkscil7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0JiYodGhpcy5jb2RlPXQpLGUmJih0aGlzLmNvbmZpZz1lKSxJJiYodGhpcy5yZXF1ZXN0PUkpLHImJih0aGlzLnJlc3BvbnNlPXIpfWkuaW5oZXJpdHMoaixFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOmkudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19fSk7dmFyIGt0PWoucHJvdG90eXBlLEx0PXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e0x0W0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGosTHQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrdCwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtqLmZyb209KEEsdCxlLEkscixvKT0+e2xldCBnPU9iamVjdC5jcmVhdGUoa3QpO3JldHVybiBpLnRvRmxhdE9iamVjdChBLGcsZnVuY3Rpb24oUSl7cmV0dXJuIFEhPT1FcnJvci5wcm90b3R5cGV9LEM9PkMhPT0iaXNBeGlvc0Vycm9yIiksai5jYWxsKGcsQS5tZXNzYWdlLHQsZSxJLHIpLGcuY2F1c2U9QSxnLm5hbWU9QS5uYW1lLG8mJk9iamVjdC5hc3NpZ24oZyxvKSxnfTt2YXIgdT1qO3ZhciBkQT1udWxsO2Z1bmN0aW9uIHhBKEEpe3JldHVybiBpLmlzUGxhaW5PYmplY3QoQSl8fGkuaXNBcnJheShBKX1mdW5jdGlvbiBidChBKXtyZXR1cm4gaS5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBKdChBLHQsZSl7cmV0dXJuIEE/QS5jb25jYXQodCkubWFwKGZ1bmN0aW9uKHIsbyl7cmV0dXJuIHI9YnQociksIWUmJm8/IlsiK3IrIl0iOnJ9KS5qb2luKGU/Ii4iOiIiKTp0fWZ1bmN0aW9uIHlJKEEpe3JldHVybiBpLmlzQXJyYXkoQSkmJiFBLnNvbWUoeEEpfXZhciBtST1pLnRvRmxhdE9iamVjdChpLHt9LG51bGwsZnVuY3Rpb24odCl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KHQpfSk7ZnVuY3Rpb24gd0koQSx0LGUpe2lmKCFpLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9dHx8bmV3KGRBfHxGb3JtRGF0YSksZT1pLnRvRmxhdE9iamVjdChlLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24obCxjKXtyZXR1cm4haS5pc1VuZGVmaW5lZChjW2xdKX0pO2xldCBJPWUubWV0YVRva2VucyxyPWUudmlzaXRvcnx8bixvPWUuZG90cyxnPWUuaW5kZXhlcyxRPShlLkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJmkuaXNTcGVjQ29tcGxpYW50Rm9ybSh0KTtpZighaS5pc0Z1bmN0aW9uKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gYShFKXtpZihFPT09bnVsbClyZXR1cm4iIjtpZihpLmlzRGF0ZShFKSlyZXR1cm4gRS50b0lTT1N0cmluZygpO2lmKCFRJiZpLmlzQmxvYihFKSl0aHJvdyBuZXcgdSgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gaS5pc0FycmF5QnVmZmVyKEUpfHxpLmlzVHlwZWRBcnJheShFKT9RJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbRV0pOkJ1ZmZlci5mcm9tKEUpOkV9ZnVuY3Rpb24gbihFLGwsYyl7bGV0IHA9RTtpZihFJiYhYyYmdHlwZW9mIEU9PSJvYmplY3QiKXtpZihpLmVuZHNXaXRoKGwsInt9IikpbD1JP2w6bC5zbGljZSgwLC0yKSxFPUpTT04uc3RyaW5naWZ5KEUpO2Vsc2UgaWYoaS5pc0FycmF5KEUpJiZ5SShFKXx8KGkuaXNGaWxlTGlzdChFKXx8aS5lbmRzV2l0aChsLCJbXSIpKSYmKHA9aS50b0FycmF5KEUpKSlyZXR1cm4gbD1idChsKSxwLmZvckVhY2goZnVuY3Rpb24oRCxVKXshKGkuaXNVbmRlZmluZWQoRCl8fEQ9PT1udWxsKSYmdC5hcHBlbmQoZz09PSEwP0p0KFtsXSxVLG8pOmc9PT1udWxsP2w6bCsiW10iLGEoRCkpfSksITF9cmV0dXJuIHhBKEUpPyEwOih0LmFwcGVuZChKdChjLGwsbyksYShFKSksITEpfWxldCBzPVtdLGY9T2JqZWN0LmFzc2lnbihtSSx7ZGVmYXVsdFZpc2l0b3I6bixjb252ZXJ0VmFsdWU6YSxpc1Zpc2l0YWJsZTp4QX0pO2Z1bmN0aW9uIEIoRSxsKXtpZighaS5pc1VuZGVmaW5lZChFKSl7aWYocy5pbmRleE9mKEUpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK2wuam9pbigiLiIpKTtzLnB1c2goRSksaS5mb3JFYWNoKEUsZnVuY3Rpb24ocCxTKXsoIShpLmlzVW5kZWZpbmVkKHApfHxwPT09bnVsbCkmJnIuY2FsbCh0LHAsaS5pc1N0cmluZyhTKT9TLnRyaW0oKTpTLGwsZikpPT09ITAmJkIocCxsP2wuY29uY2F0KFMpOltTXSl9KSxzLnBvcCgpfX1pZighaS5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIEIoQSksdH12YXIgcT13STtmdW5jdGlvbiBIdChBKXtsZXQgdD17IiEiOiIlMjUyMSIsIlwnIjoiJTI1MjciLCIoIjoiJTI1MjgiLCIpIjoiJTI1MjkiLCJ+IjoiJTI1N0UiLCIlMjUyMCI6IisiLCIlMjUwMCI6IlxcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvWyFcJygpfl18JTI1MjB8JTI1MDAvZyxmdW5jdGlvbihJKXtyZXR1cm4gdFtJXX0pfWZ1bmN0aW9uIFl0KEEsdCl7dGhpcy5fcGFpcnM9W10sQSYmcShBLHRoaXMsdCl9dmFyIHF0PVl0LnByb3RvdHlwZTtxdC5hcHBlbmQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9wYWlycy5wdXNoKFt0LGVdKX07cXQudG9TdHJpbmc9ZnVuY3Rpb24odCl7bGV0IGU9dD9mdW5jdGlvbihJKXtyZXR1cm4gdC5jYWxsKHRoaXMsSSxIdCl9Okh0O3JldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIGUoclswXSkrIj0iK2UoclsxXSl9LCIiKS5qb2luKCImIil9O3ZhciB5QT1ZdDtmdW5jdGlvbiBwSShBKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUyNTNBL2dpLCI6IikucmVwbGFjZSgvJTI1MjQvZywiJCIpLnJlcGxhY2UoLyUyNTJDL2dpLCIsIikucmVwbGFjZSgvJTI1MjAvZywiKyIpLnJlcGxhY2UoLyUyNTVCL2dpLCJbIikucmVwbGFjZSgvJTI1NUQvZ2ksIl0iKX1mdW5jdGlvbiB0QShBLHQsZSl7aWYoIXQpcmV0dXJuIEE7bGV0IEk9ZSYmZS5lbmNvZGV8fHBJLHI9ZSYmZS5zZXJpYWxpemUsbztpZihyP289cih0LGUpOm89aS5pc1VSTFNlYXJjaFBhcmFtcyh0KT90LnRvU3RyaW5nKCk6bmV3IHlBKHQsZSkudG9TdHJpbmcoSSksbyl7bGV0IGc9QS5pbmRleE9mKCIlMjMiKTtnIT09LTEmJihBPUEuc2xpY2UoMCxnKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrb31yZXR1cm4gQX12YXIgUEE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZSh0LGUsSSl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOnQscmVqZWN0ZWQ6ZSxzeW5jaHJvbm91czpJP0kuc3luY2hyb25vdXM6ITEscnVuV2hlbjpJP0kucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdCh0KXt0aGlzLmhhbmRsZXJzW3RdJiYodGhpcy5oYW5kbGVyc1t0XT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKHQpe2kuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKEkpe0khPT1udWxsJiZ0KEkpfSl9fSxXQT1QQTt2YXIgbUE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciBNdD10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6eUE7dmFyIFR0PXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgS3Q9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgT3Q9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6TXQsRm9ybURhdGE6VHQsQmxvYjpLdH0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciBaQT17fTt3ZShaQSx7aGFzQnJvd3NlckVudjooKT0+akEsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5TSSxoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PkZJLG9yaWdpbjooKT0+Ukl9KTt2YXIgakE9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIsU0k9KEE9PmpBJiZbIlJlYWN0TmF0aXZlIiwiTmF0aXZlU2NyaXB0IiwiTlMiXS5pbmRleE9mKEEpPDApKHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3IucHJvZHVjdCksRkk9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLFJJPWpBJiZ3aW5kb3cubG9jYXRpb24uaHJlZnx8Imh0dHA6Ly9sb2NhbGhvc3QiO3ZhciB3PXsuLi5aQSwuLi5PdH07ZnVuY3Rpb24gVkEoQSx0KXtyZXR1cm4gcShBLG5ldyB3LmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLE9iamVjdC5hc3NpZ24oe3Zpc2l0b3I6ZnVuY3Rpb24oZSxJLHIsbyl7cmV0dXJuIHcuaXNOb2RlJiZpLmlzQnVmZmVyKGUpPyh0aGlzLmFwcGVuZChJLGUudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6by5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0KSl9ZnVuY3Rpb24gTkkoQSl7cmV0dXJuIGkubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLEEpLm1hcCh0PT50WzBdPT09IltdIj8iIjp0WzFdfHx0WzBdKX1mdW5jdGlvbiBVSShBKXtsZXQgdD17fSxlPU9iamVjdC5rZXlzKEEpLEkscj1lLmxlbmd0aCxvO2ZvcihJPTA7STxyO0krKylvPWVbSV0sdFtvXT1BW29dO3JldHVybiB0fWZ1bmN0aW9uIEdJKEEpe2Z1bmN0aW9uIHQoZSxJLHIsbyl7bGV0IGc9ZVtvKytdO2lmKGc9PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgQz1OdW1iZXIuaXNGaW5pdGUoK2cpLFE9bz49ZS5sZW5ndGg7cmV0dXJuIGc9IWcmJmkuaXNBcnJheShyKT9yLmxlbmd0aDpnLFE/KGkuaGFzT3duUHJvcChyLGcpP3JbZ109W3JbZ10sSV06cltnXT1JLCFDKTooKCFyW2ddfHwhaS5pc09iamVjdChyW2ddKSkmJihyW2ddPVtdKSx0KGUsSSxyW2ddLG8pJiZpLmlzQXJyYXkocltnXSkmJihyW2ddPVVJKHJbZ10pKSwhQyl9aWYoaS5pc0Zvcm1EYXRhKEEpJiZpLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IGU9e307cmV0dXJuIGkuZm9yRWFjaEVudHJ5KEEsKEkscik9Pnt0KE5JKEkpLHIsZSwwKX0pLGV9cmV0dXJuIG51bGx9dmFyIHdBPUdJO2Z1bmN0aW9uIGtJKEEsdCxlKXtpZihpLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoQSksaS50cmltKEEpfWNhdGNoKEkpe2lmKEkubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgSX1yZXR1cm4oZXx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBfQT17dHJhbnNpdGlvbmFsOm1BLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIiwiZmV0Y2giXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbih0LGUpe2xldCBJPWUuZ2V0Q29udGVudFR5cGUoKXx8IiIscj1JLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxvPWkuaXNPYmplY3QodCk7aWYobyYmaS5pc0hUTUxGb3JtKHQpJiYodD1uZXcgRm9ybURhdGEodCkpLGkuaXNGb3JtRGF0YSh0KSlyZXR1cm4gcj9KU09OLnN0cmluZ2lmeSh3QSh0KSk6dDtpZihpLmlzQXJyYXlCdWZmZXIodCl8fGkuaXNCdWZmZXIodCl8fGkuaXNTdHJlYW0odCl8fGkuaXNGaWxlKHQpfHxpLmlzQmxvYih0KXx8aS5pc1JlYWRhYmxlU3RyZWFtKHQpKXJldHVybiB0O2lmKGkuaXNBcnJheUJ1ZmZlclZpZXcodCkpcmV0dXJuIHQuYnVmZmVyO2lmKGkuaXNVUkxTZWFyY2hQYXJhbXModCkpcmV0dXJuIGUuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksdC50b1N0cmluZygpO2xldCBDO2lmKG8pe2lmKEkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIFZBKHQsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoQz1pLmlzRmlsZUxpc3QodCkpfHxJLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IFE9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBxKEM/eyJmaWxlc1tdIjp0fTp0LFEmJm5ldyBRLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gb3x8cj8oZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLGtJKHQpKTp0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe2xldCBlPXRoaXMudHJhbnNpdGlvbmFsfHxfQS50cmFuc2l0aW9uYWwsST1lJiZlLmZvcmNlZEpTT05QYXJzaW5nLHI9dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYoaS5pc1Jlc3BvbnNlKHQpfHxpLmlzUmVhZGFibGVTdHJlYW0odCkpcmV0dXJuIHQ7aWYodCYmaS5pc1N0cmluZyh0KSYmKEkmJiF0aGlzLnJlc3BvbnNlVHlwZXx8cikpe2xldCBnPSEoZSYmZS5zaWxlbnRKU09OUGFyc2luZykmJnI7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKEMpe2lmKGcpdGhyb3cgQy5uYW1lPT09IlN5bnRheEVycm9yIj91LmZyb20oQyx1LkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOkN9fXJldHVybiB0fV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTp3LmNsYXNzZXMuRm9ybURhdGEsQmxvYjp3LmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTIwMCYmdDwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtpLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e19BLmhlYWRlcnNbQV09e319KTt2YXIgWj1fQTt2YXIgTEk9aS50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSx4dD1BPT57bGV0IHQ9e30sZSxJLHI7cmV0dXJuIEEmJkEuc3BsaXQoYCUwQWApLmZvckVhY2goZnVuY3Rpb24oZyl7cj1nLmluZGV4T2YoIjoiKSxlPWcuc3Vic3RyaW5nKDAscikudHJpbSgpLnRvTG93ZXJDYXNlKCksST1nLnN1YnN0cmluZyhyKzEpLnRyaW0oKSwhKCFlfHx0W2VdJiZMSVtlXSkmJihlPT09InNldC1jb29raWUiP3RbZV0/dFtlXS5wdXNoKEkpOnRbZV09W0ldOnRbZV09dFtlXT90W2VdKyIsICIrSTpJKX0pLHR9O3ZhciBQdD1TeW1ib2woImludGVybmFscyIpO2Z1bmN0aW9uIGVBKEEpe3JldHVybiBBJiZTdHJpbmcoQSkudHJpbSgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcEEoQSl7cmV0dXJuIEE9PT0hMXx8QT09bnVsbD9BOmkuaXNBcnJheShBKT9BLm1hcChwQSk6U3RyaW5nKEEpfWZ1bmN0aW9uIEpJKEEpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksZT0vKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nLEk7Zm9yKDtJPWUuZXhlYyhBKTspdFtJWzFdXT1JWzJdO3JldHVybiB0fXZhciBiST1BPT4vXlstX2EtekEtWjAtOV5gfH4sISUyMyQlJlwnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBYQShBLHQsZSxJLHIpe2lmKGkuaXNGdW5jdGlvbihJKSlyZXR1cm4gSS5jYWxsKHRoaXMsdCxlKTtpZihyJiYodD1lKSwhIWkuaXNTdHJpbmcodCkpe2lmKGkuaXNTdHJpbmcoSSkpcmV0dXJuIHQuaW5kZXhPZihJKSE9PS0xO2lmKGkuaXNSZWdFeHAoSSkpcmV0dXJuIEkudGVzdCh0KX19ZnVuY3Rpb24gSEkoQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCh0LGUsSSk9PmUudG9VcHBlckNhc2UoKStJKX1mdW5jdGlvbiBZSShBLHQpe2xldCBlPWkudG9DYW1lbENhc2UoIiAiK3QpO1siZ2V0Iiwic2V0IiwiaGFzIl0uZm9yRWFjaChJPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsSStlLHt2YWx1ZTpmdW5jdGlvbihyLG8sZyl7cmV0dXJuIHRoaXNbSV0uY2FsbCh0aGlzLHQscixvLGcpfSxjb25maWd1cmFibGU6ITB9KX0pfXZhciBWPWNsYXNze2NvbnN0cnVjdG9yKHQpe3QmJnRoaXMuc2V0KHQpfXNldCh0LGUsSSl7bGV0IHI9dGhpcztmdW5jdGlvbiBvKEMsUSxhKXtsZXQgbj1lQShRKTtpZighbil0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IHM9aS5maW5kS2V5KHIsbik7KCFzfHxyW3NdPT09dm9pZCAwfHxhPT09ITB8fGE9PT12b2lkIDAmJnJbc10hPT0hMSkmJihyW3N8fFFdPXBBKEMpKX1sZXQgZz0oQyxRKT0+aS5mb3JFYWNoKEMsKGEsbik9Pm8oYSxuLFEpKTtpZihpLmlzUGxhaW5PYmplY3QodCl8fHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKWcodCxlKTtlbHNlIGlmKGkuaXNTdHJpbmcodCkmJih0PXQudHJpbSgpKSYmIWJJKHQpKWcoeHQodCksZSk7ZWxzZSBpZihpLmlzSGVhZGVycyh0KSlmb3IobGV0W0MsUV1vZiB0LmVudHJpZXMoKSlvKFEsQyxJKTtlbHNlIHQhPW51bGwmJm8oZSx0LEkpO3JldHVybiB0aGlzfWdldCh0LGUpe2lmKHQ9ZUEodCksdCl7bGV0IEk9aS5maW5kS2V5KHRoaXMsdCk7aWYoSSl7bGV0IHI9dGhpc1tJXTtpZighZSlyZXR1cm4gcjtpZihlPT09ITApcmV0dXJuIEpJKHIpO2lmKGkuaXNGdW5jdGlvbihlKSlyZXR1cm4gZS5jYWxsKHRoaXMscixJKTtpZihpLmlzUmVnRXhwKGUpKXJldHVybiBlLmV4ZWMocik7dGhyb3cgbmV3IFR5cGVFcnJvcigicGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24iKX19fWhhcyh0LGUpe2lmKHQ9ZUEodCksdCl7bGV0IEk9aS5maW5kS2V5KHRoaXMsdCk7cmV0dXJuISEoSSYmdGhpc1tJXSE9PXZvaWQgMCYmKCFlfHxYQSh0aGlzLHRoaXNbSV0sSSxlKSkpfXJldHVybiExfWRlbGV0ZSh0LGUpe2xldCBJPXRoaXMscj0hMTtmdW5jdGlvbiBvKGcpe2lmKGc9ZUEoZyksZyl7bGV0IEM9aS5maW5kS2V5KEksZyk7QyYmKCFlfHxYQShJLElbQ10sQyxlKSkmJihkZWxldGUgSVtDXSxyPSEwKX19cmV0dXJuIGkuaXNBcnJheSh0KT90LmZvckVhY2gobyk6byh0KSxyfWNsZWFyKHQpe2xldCBlPU9iamVjdC5rZXlzKHRoaXMpLEk9ZS5sZW5ndGgscj0hMTtmb3IoO0ktLTspe2xldCBvPWVbSV07KCF0fHxYQSh0aGlzLHRoaXNbb10sbyx0LCEwKSkmJihkZWxldGUgdGhpc1tvXSxyPSEwKX1yZXR1cm4gcn1ub3JtYWxpemUodCl7bGV0IGU9dGhpcyxJPXt9O3JldHVybiBpLmZvckVhY2godGhpcywocixvKT0+e2xldCBnPWkuZmluZEtleShJLG8pO2lmKGcpe2VbZ109cEEociksZGVsZXRlIGVbb107cmV0dXJufWxldCBDPXQ/SEkobyk6U3RyaW5nKG8pLnRyaW0oKTtDIT09byYmZGVsZXRlIGVbb10sZVtDXT1wQShyKSxJW0NdPSEwfSksdGhpc31jb25jYXQoLi4udCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKHQpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGkuZm9yRWFjaCh0aGlzLChJLHIpPT57SSE9bnVsbCYmSSE9PSExJiYoZVtyXT10JiZpLmlzQXJyYXkoSSk/SS5qb2luKCIsICIpOkkpfSksZX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbdCxlXSk9PnQrIjogIitlKS5qb2luKGAlMEFgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcz90Om5ldyB0aGlzKHQpfXN0YXRpYyBjb25jYXQodCwuLi5lKXtsZXQgST1uZXcgdGhpcyh0KTtyZXR1cm4gZS5mb3JFYWNoKHI9Pkkuc2V0KHIpKSxJfXN0YXRpYyBhY2Nlc3Nvcih0KXtsZXQgST0odGhpc1tQdF09dGhpc1tQdF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxyPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIG8oZyl7bGV0IEM9ZUEoZyk7SVtDXXx8KFlJKHIsZyksSVtDXT0hMCl9cmV0dXJuIGkuaXNBcnJheSh0KT90LmZvckVhY2gobyk6byh0KSx0aGlzfX07Vi5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7aS5yZWR1Y2VEZXNjcmlwdG9ycyhWLnByb3RvdHlwZSwoe3ZhbHVlOkF9LHQpPT57bGV0IGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQoSSl7dGhpc1tlXT1JfX19KTtpLmZyZWV6ZU1ldGhvZHMoVik7dmFyIG09VjtmdW5jdGlvbiBJQShBLHQpe2xldCBlPXRoaXN8fFosST10fHxlLHI9bS5mcm9tKEkuaGVhZGVycyksbz1JLmRhdGE7cmV0dXJuIGkuZm9yRWFjaChBLGZ1bmN0aW9uKEMpe289Qy5jYWxsKGUsbyxyLm5vcm1hbGl6ZSgpLHQ/dC5zdGF0dXM6dm9pZCAwKX0pLHIubm9ybWFsaXplKCksb31mdW5jdGlvbiByQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIFd0KEEsdCxlKXt1LmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLHUuRVJSX0NBTkNFTEVELHQsZSksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1pLmluaGVyaXRzKFd0LHUse19fQ0FOQ0VMX186ITB9KTt2YXIgYj1XdDtmdW5jdGlvbiBvQShBLHQsZSl7bGV0IEk9ZS5jb25maWcudmFsaWRhdGVTdGF0dXM7IWUuc3RhdHVzfHwhSXx8SShlLnN0YXR1cyk/QShlKTp0KG5ldyB1KCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrZS5zdGF0dXMsW3UuRVJSX0JBRF9SRVFVRVNULHUuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihlLnN0YXR1cy8xMDApLTRdLGUuY29uZmlnLGUucmVxdWVzdCxlKSl9ZnVuY3Rpb24gekEoQSl7bGV0IHQ9L14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWMoQSk7cmV0dXJuIHQmJnRbMV18fCIifWZ1bmN0aW9uIHFJKEEsdCl7QT1BfHwxMDtsZXQgZT1uZXcgQXJyYXkoQSksST1uZXcgQXJyYXkoQSkscj0wLG89MCxnO3JldHVybiB0PXQhPT12b2lkIDA/dDoxZTMsZnVuY3Rpb24oUSl7bGV0IGE9RGF0ZS5ub3coKSxuPUlbb107Z3x8KGc9YSksZVtyXT1RLElbcl09YTtsZXQgcz1vLGY9MDtmb3IoO3MhPT1yOylmKz1lW3MrK10scz1zJUE7aWYocj0ocisxKSVBLHI9PT1vJiYobz0obysxKSVBKSxhLWc8dClyZXR1cm47bGV0IEI9biYmYS1uO3JldHVybiBCP01hdGgucm91bmQoZioxZTMvQik6dm9pZCAwfX12YXIganQ9cUk7ZnVuY3Rpb24gTUkoQSx0KXtsZXQgZT0wLEk9MWUzL3QscixvLGc9KGEsbj1EYXRlLm5vdygpKT0+e2U9bixyPW51bGwsbyYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLEEuYXBwbHkobnVsbCxhKX07cmV0dXJuWyguLi5hKT0+e2xldCBuPURhdGUubm93KCkscz1uLWU7cz49ST9nKGEsbik6KHI9YSxvfHwobz1zZXRUaW1lb3V0KCgpPT57bz1udWxsLGcocil9LEktcykpKX0sKCk9PnImJmcocildfXZhciBadD1NSTt2YXIgXz0oQSx0LGU9Myk9PntsZXQgST0wLHI9anQoNTAsMjUwKTtyZXR1cm4gWnQobz0+e2xldCBnPW8ubG9hZGVkLEM9by5sZW5ndGhDb21wdXRhYmxlP28udG90YWw6dm9pZCAwLFE9Zy1JLGE9cihRKSxuPWc8PUM7ST1nO2xldCBzPXtsb2FkZWQ6Zyx0b3RhbDpDLHByb2dyZXNzOkM/Zy9DOnZvaWQgMCxieXRlczpRLHJhdGU6YXx8dm9pZCAwLGVzdGltYXRlZDphJiZDJiZuPyhDLWcpL2E6dm9pZCAwLGV2ZW50Om8sbGVuZ3RoQ29tcHV0YWJsZTpDIT1udWxsLFt0PyJkb3dubG9hZCI6InVwbG9hZCJdOiEwfTtBKHMpfSxlKX0sdkE9KEEsdCk9PntsZXQgZT1BIT1udWxsO3JldHVybltJPT50WzBdKHtsZW5ndGhDb21wdXRhYmxlOmUsdG90YWw6QSxsb2FkZWQ6SX0pLHRbMV1dfSwkQT1BPT4oLi4udCk9PmkuYXNhcCgoKT0+QSguLi50KSk7dmFyIFZ0PXcuaGFzU3RhbmRhcmRCcm93c2VyRW52P2Z1bmN0aW9uKCl7bGV0IHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxJO2Z1bmN0aW9uIHIobyl7bGV0IGc9bztyZXR1cm4gdCYmKGUuc2V0QXR0cmlidXRlKCJocmVmIixnKSxnPWUuaHJlZiksZS5zZXRBdHRyaWJ1dGUoImhyZWYiLGcpLHtocmVmOmUuaHJlZixwcm90b2NvbDplLnByb3RvY29sP2UucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OmUuaG9zdCxzZWFyY2g6ZS5zZWFyY2g/ZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sIiIpOiIiLGhhc2g6ZS5oYXNoP2UuaGFzaC5yZXBsYWNlKC9eJTIzLywiIik6IiIsaG9zdG5hbWU6ZS5ob3N0bmFtZSxwb3J0OmUucG9ydCxwYXRobmFtZTplLnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj9lLnBhdGhuYW1lOiIvIitlLnBhdGhuYW1lfX1yZXR1cm4gST1yKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihnKXtsZXQgQz1pLmlzU3RyaW5nKGcpP3IoZyk6ZztyZXR1cm4gQy5wcm90b2NvbD09PUkucHJvdG9jb2wmJkMuaG9zdD09PUkuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7dmFyIF90PXcuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLHQsZSxJLHIsbyl7bGV0IGc9W0ErIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KV07aS5pc051bWJlcihlKSYmZy5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUoZSkudG9HTVRTdHJpbmcoKSksaS5pc1N0cmluZyhJKSYmZy5wdXNoKCJwYXRoPSIrSSksaS5pc1N0cmluZyhyKSYmZy5wdXNoKCJkb21haW49IityKSxvPT09ITAmJmcucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWcuam9pbigiOyAiKX0scmVhZChBKXtsZXQgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xcXFxzKikoIitBKyIpPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbM10pOm51bGx9LHJlbW92ZShBKXt0aGlzLndyaXRlKEEsIiIsRGF0ZS5ub3coKS04NjRlNSl9fTp7d3JpdGUoKXt9LHJlYWQoKXtyZXR1cm4gbnVsbH0scmVtb3ZlKCl7fX07ZnVuY3Rpb24gQXQoQSl7cmV0dXJuL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QoQSl9ZnVuY3Rpb24gdHQoQSx0KXtyZXR1cm4gdD9BLnJlcGxhY2UoL1xcLz9cXC8kLywiIikrIi8iK3QucmVwbGFjZSgvXlxcLysvLCIiKTpBfWZ1bmN0aW9uIGdBKEEsdCl7cmV0dXJuIEEmJiFBdCh0KT90dChBLHQpOnR9dmFyIFh0PUE9PkEgaW5zdGFuY2VvZiBtP3suLi5BfTpBO2Z1bmN0aW9uIGsoQSx0KXt0PXR8fHt9O2xldCBlPXt9O2Z1bmN0aW9uIEkoYSxuLHMpe3JldHVybiBpLmlzUGxhaW5PYmplY3QoYSkmJmkuaXNQbGFpbk9iamVjdChuKT9pLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOnN9LGEsbik6aS5pc1BsYWluT2JqZWN0KG4pP2kubWVyZ2Uoe30sbik6aS5pc0FycmF5KG4pP24uc2xpY2UoKTpufWZ1bmN0aW9uIHIoYSxuLHMpe2lmKGkuaXNVbmRlZmluZWQobikpe2lmKCFpLmlzVW5kZWZpbmVkKGEpKXJldHVybiBJKHZvaWQgMCxhLHMpfWVsc2UgcmV0dXJuIEkoYSxuLHMpfWZ1bmN0aW9uIG8oYSxuKXtpZighaS5pc1VuZGVmaW5lZChuKSlyZXR1cm4gSSh2b2lkIDAsbil9ZnVuY3Rpb24gZyhhLG4pe2lmKGkuaXNVbmRlZmluZWQobikpe2lmKCFpLmlzVW5kZWZpbmVkKGEpKXJldHVybiBJKHZvaWQgMCxhKX1lbHNlIHJldHVybiBJKHZvaWQgMCxuKX1mdW5jdGlvbiBDKGEsbixzKXtpZihzIGluIHQpcmV0dXJuIEkoYSxuKTtpZihzIGluIEEpcmV0dXJuIEkodm9pZCAwLGEpfWxldCBRPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDpnLHRyYW5zZm9ybVJlcXVlc3Q6Zyx0cmFuc2Zvcm1SZXNwb25zZTpnLHBhcmFtc1NlcmlhbGl6ZXI6Zyx0aW1lb3V0OmcsdGltZW91dE1lc3NhZ2U6Zyx3aXRoQ3JlZGVudGlhbHM6Zyx3aXRoWFNSRlRva2VuOmcsYWRhcHRlcjpnLHJlc3BvbnNlVHlwZTpnLHhzcmZDb29raWVOYW1lOmcseHNyZkhlYWRlck5hbWU6ZyxvblVwbG9hZFByb2dyZXNzOmcsb25Eb3dubG9hZFByb2dyZXNzOmcsZGVjb21wcmVzczpnLG1heENvbnRlbnRMZW5ndGg6ZyxtYXhCb2R5TGVuZ3RoOmcsYmVmb3JlUmVkaXJlY3Q6Zyx0cmFuc3BvcnQ6ZyxodHRwQWdlbnQ6ZyxodHRwc0FnZW50OmcsY2FuY2VsVG9rZW46Zyxzb2NrZXRQYXRoOmcscmVzcG9uc2VFbmNvZGluZzpnLHZhbGlkYXRlU3RhdHVzOkMsaGVhZGVyczooYSxuKT0+cihYdChhKSxYdChuKSwhMCl9O3JldHVybiBpLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLHQpKSxmdW5jdGlvbihuKXtsZXQgcz1RW25dfHxyLGY9cyhBW25dLHRbbl0sbik7aS5pc1VuZGVmaW5lZChmKSYmcyE9PUN8fChlW25dPWYpfSksZX12YXIgU0E9QT0+e2xldCB0PWsoe30sQSkse2RhdGE6ZSx3aXRoWFNSRlRva2VuOkkseHNyZkhlYWRlck5hbWU6cix4c3JmQ29va2llTmFtZTpvLGhlYWRlcnM6ZyxhdXRoOkN9PXQ7dC5oZWFkZXJzPWc9bS5mcm9tKGcpLHQudXJsPXRBKGdBKHQuYmFzZVVSTCx0LnVybCksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxDJiZnLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgoQy51c2VybmFtZXx8IiIpKyI6IisoQy5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoQy5wYXNzd29yZCkpOiIiKSkpO2xldCBRO2lmKGkuaXNGb3JtRGF0YShlKSl7aWYody5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fHcuaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KWcuc2V0Q29udGVudFR5cGUodm9pZCAwKTtlbHNlIGlmKChRPWcuZ2V0Q29udGVudFR5cGUoKSkhPT0hMSl7bGV0W2EsLi4ubl09UT9RLnNwbGl0KCI7IikubWFwKHM9PnMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik6W107Zy5zZXRDb250ZW50VHlwZShbYXx8Im11bHRpcGFydC9mb3JtLWRhdGEiLC4uLm5dLmpvaW4oIjsgIikpfX1pZih3Lmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKEkmJmkuaXNGdW5jdGlvbihJKSYmKEk9SSh0KSksSXx8SSE9PSExJiZWdCh0LnVybCkpKXtsZXQgYT1yJiZvJiZfdC5yZWFkKG8pO2EmJmcuc2V0KHIsYSl9cmV0dXJuIHR9O3ZhciBUST10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLHp0PVRJJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSxJKXtsZXQgcj1TQShBKSxvPXIuZGF0YSxnPW0uZnJvbShyLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6QyxvblVwbG9hZFByb2dyZXNzOlEsb25Eb3dubG9hZFByb2dyZXNzOmF9PXIsbixzLGYsQixFO2Z1bmN0aW9uIGwoKXtCJiZCKCksRSYmRSgpLHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksci5zaWduYWwmJnIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1sZXQgYz1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vcGVuKHIubWV0aG9kLnRvVXBwZXJDYXNlKCksci51cmwsITApLGMudGltZW91dD1yLnRpbWVvdXQ7ZnVuY3Rpb24gcCgpe2lmKCFjKXJldHVybjtsZXQgRD1tLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjJiZjLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxLPXtkYXRhOiFDfHxDPT09InRleHQifHxDPT09Impzb24iP2MucmVzcG9uc2VUZXh0OmMucmVzcG9uc2Usc3RhdHVzOmMuc3RhdHVzLHN0YXR1c1RleHQ6Yy5zdGF0dXNUZXh0LGhlYWRlcnM6RCxjb25maWc6QSxyZXF1ZXN0OmN9O29BKGZ1bmN0aW9uKEope2UoSiksbCgpfSxmdW5jdGlvbihKKXtJKEopLGwoKX0sSyksYz1udWxsfSJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD1wOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWN8fGMucmVhZHlTdGF0ZSE9PTR8fGMuc3RhdHVzPT09MCYmIShjLnJlc3BvbnNlVVJMJiZjLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChwKX0sYy5vbmFib3J0PWZ1bmN0aW9uKCl7YyYmKEkobmV3IHUoIlJlcXVlc3QgYWJvcnRlZCIsdS5FQ09OTkFCT1JURUQsQSxjKSksYz1udWxsKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7SShuZXcgdSgiTmV0d29yayBFcnJvciIsdS5FUlJfTkVUV09SSyxBLGMpKSxjPW51bGx9LGMub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IFU9ci50aW1lb3V0PyJ0aW1lb3V0IG9mICIrci50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLEs9ci50cmFuc2l0aW9uYWx8fG1BO3IudGltZW91dEVycm9yTWVzc2FnZSYmKFU9ci50aW1lb3V0RXJyb3JNZXNzYWdlKSxJKG5ldyB1KFUsSy5jbGFyaWZ5VGltZW91dEVycm9yP3UuRVRJTUVET1VUOnUuRUNPTk5BQk9SVEVELEEsYykpLGM9bnVsbH0sbz09PXZvaWQgMCYmZy5zZXRDb250ZW50VHlwZShudWxsKSwic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZpLmZvckVhY2goZy50b0pTT04oKSxmdW5jdGlvbihVLEspe2Muc2V0UmVxdWVzdEhlYWRlcihLLFUpfSksaS5pc1VuZGVmaW5lZChyLndpdGhDcmVkZW50aWFscyl8fChjLndpdGhDcmVkZW50aWFscz0hIXIud2l0aENyZWRlbnRpYWxzKSxDJiZDIT09Impzb24iJiYoYy5yZXNwb25zZVR5cGU9ci5yZXNwb25zZVR5cGUpLGEmJihbZixFXT1fKGEsITApLGMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGYpKSxRJiZjLnVwbG9hZCYmKFtzLEJdPV8oUSksYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHMpLGMudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLEIpKSwoci5jYW5jZWxUb2tlbnx8ci5zaWduYWwpJiYobj1EPT57YyYmKEkoIUR8fEQudHlwZT9uZXcgYihudWxsLEEsYyk6RCksYy5hYm9ydCgpLGM9bnVsbCl9LHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG4pLHIuc2lnbmFsJiYoci5zaWduYWwuYWJvcnRlZD9uKCk6ci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLG4pKSk7bGV0IFM9ekEoci51cmwpO2lmKFMmJncucHJvdG9jb2xzLmluZGV4T2YoUyk9PT0tMSl7SShuZXcgdSgiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgIitTKyI6Iix1LkVSUl9CQURfUkVRVUVTVCxBKSk7cmV0dXJufWMuc2VuZChvfHxudWxsKX0pfTt2YXIgS0k9KEEsdCk9PntsZXQgZT1uZXcgQWJvcnRDb250cm9sbGVyLEkscj1mdW5jdGlvbihRKXtpZighSSl7ST0hMCxnKCk7bGV0IGE9USBpbnN0YW5jZW9mIEVycm9yP1E6dGhpcy5yZWFzb247ZS5hYm9ydChhIGluc3RhbmNlb2YgdT9hOm5ldyBiKGEgaW5zdGFuY2VvZiBFcnJvcj9hLm1lc3NhZ2U6YSkpfX0sbz10JiZzZXRUaW1lb3V0KCgpPT57cihuZXcgdShgdGltZW91dCAke3R9IG9mIG1zIGV4Y2VlZGVkYCx1LkVUSU1FRE9VVCkpfSx0KSxnPSgpPT57QSYmKG8mJmNsZWFyVGltZW91dChvKSxvPW51bGwsQS5mb3JFYWNoKFE9PntRJiYoUS5yZW1vdmVFdmVudExpc3RlbmVyP1EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHIpOlEudW5zdWJzY3JpYmUocikpfSksQT1udWxsKX07QS5mb3JFYWNoKFE9PlEmJlEuYWRkRXZlbnRMaXN0ZW5lciYmUS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIscikpO2xldHtzaWduYWw6Q309ZTtyZXR1cm4gQy51bnN1YnNjcmliZT1nLFtDLCgpPT57byYmY2xlYXJUaW1lb3V0KG8pLG89bnVsbH1dfSx2dD1LSTt2YXIgT0k9ZnVuY3Rpb24qKEEsdCl7bGV0IGU9QS5ieXRlTGVuZ3RoO2lmKCF0fHxlPHQpe3lpZWxkIEE7cmV0dXJufWxldCBJPTAscjtmb3IoO0k8ZTspcj1JK3QseWllbGQgQS5zbGljZShJLHIpLEk9cn0seEk9YXN5bmMgZnVuY3Rpb24qKEEsdCxlKXtmb3IgYXdhaXQobGV0IEkgb2YgQSl5aWVsZCpPSShBcnJheUJ1ZmZlci5pc1ZpZXcoSSk/STphd2FpdCBlKFN0cmluZyhJKSksdCl9LGV0PShBLHQsZSxJLHIpPT57bGV0IG89eEkoQSx0LHIpLGc9MCxDLFE9YT0+e0N8fChDPSEwLEkmJkkoYSkpfTtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHthc3luYyBwdWxsKGEpe3RyeXtsZXR7ZG9uZTpuLHZhbHVlOnN9PWF3YWl0IG8ubmV4dCgpO2lmKG4pe1EoKSxhLmNsb3NlKCk7cmV0dXJufWxldCBmPXMuYnl0ZUxlbmd0aDtpZihlKXtsZXQgQj1nKz1mO2UoQil9YS5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHMpKX1jYXRjaChuKXt0aHJvdyBRKG4pLG59fSxjYW5jZWwoYSl7cmV0dXJuIFEoYSksby5yZXR1cm4oKX19LHtoaWdoV2F0ZXJNYXJrOjJ9KX07dmFyIFJBPXR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlcXVlc3Q9PSJmdW5jdGlvbiImJnR5cGVvZiBSZXNwb25zZT09ImZ1bmN0aW9uIixBZT1SQSYmdHlwZW9mIFJlYWRhYmxlU3RyZWFtPT0iZnVuY3Rpb24iLEl0PVJBJiYodHlwZW9mIFRleHRFbmNvZGVyPT0iZnVuY3Rpb24iPyhBPT50PT5BLmVuY29kZSh0KSkobmV3IFRleHRFbmNvZGVyKTphc3luYyBBPT5uZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2UoQSkuYXJyYXlCdWZmZXIoKSkpLHRlPShBLC4uLnQpPT57dHJ5e3JldHVybiEhQSguLi50KX1jYXRjaHtyZXR1cm4hMX19LFBJPUFlJiZ0ZSgoKT0+e2xldCBBPSExLHQ9bmV3IFJlcXVlc3Qody5vcmlnaW4se2JvZHk6bmV3IFJlYWRhYmxlU3RyZWFtLG1ldGhvZDoiUE9TVCIsZ2V0IGR1cGxleCgpe3JldHVybiBBPSEwLCJoYWxmIn19KS5oZWFkZXJzLmhhcygiQ29udGVudC1UeXBlIik7cmV0dXJuIEEmJiF0fSksJHQ9NjQqMTAyNCxydD1BZSYmdGUoKCk9PmkuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoIiIpLmJvZHkpKSxGQT17c3RyZWFtOnJ0JiYoQT0+QS5ib2R5KX07UkEmJihBPT57WyJ0ZXh0IiwiYXJyYXlCdWZmZXIiLCJibG9iIiwiZm9ybURhdGEiLCJzdHJlYW0iXS5mb3JFYWNoKHQ9PnshRkFbdF0mJihGQVt0XT1pLmlzRnVuY3Rpb24oQVt0XSk/ZT0+ZVt0XSgpOihlLEkpPT57dGhyb3cgbmV3IHUoYFJlc3BvbnNlIHR5cGUgXCcke3R9XCcgaXMgbm90IHN1cHBvcnRlZGAsdS5FUlJfTk9UX1NVUFBPUlQsSSl9KX0pfSkobmV3IFJlc3BvbnNlKTt2YXIgV0k9YXN5bmMgQT0+e2lmKEE9PW51bGwpcmV0dXJuIDA7aWYoaS5pc0Jsb2IoQSkpcmV0dXJuIEEuc2l6ZTtpZihpLmlzU3BlY0NvbXBsaWFudEZvcm0oQSkpcmV0dXJuKGF3YWl0IG5ldyBSZXF1ZXN0KEEpLmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7aWYoaS5pc0FycmF5QnVmZmVyVmlldyhBKXx8aS5pc0FycmF5QnVmZmVyKEEpKXJldHVybiBBLmJ5dGVMZW5ndGg7aWYoaS5pc1VSTFNlYXJjaFBhcmFtcyhBKSYmKEE9QSsiIiksaS5pc1N0cmluZyhBKSlyZXR1cm4oYXdhaXQgSXQoQSkpLmJ5dGVMZW5ndGh9LGpJPWFzeW5jKEEsdCk9PntsZXQgZT1pLnRvRmluaXRlTnVtYmVyKEEuZ2V0Q29udGVudExlbmd0aCgpKTtyZXR1cm4gZT8/V0kodCl9LGVlPVJBJiYoYXN5bmMgQT0+e2xldHt1cmw6dCxtZXRob2Q6ZSxkYXRhOkksc2lnbmFsOnIsY2FuY2VsVG9rZW46byx0aW1lb3V0Omcsb25Eb3dubG9hZFByb2dyZXNzOkMsb25VcGxvYWRQcm9ncmVzczpRLHJlc3BvbnNlVHlwZTphLGhlYWRlcnM6bix3aXRoQ3JlZGVudGlhbHM6cz0ic2FtZS1vcmlnaW4iLGZldGNoT3B0aW9uczpmfT1TQShBKTthPWE/KGErIiIpLnRvTG93ZXJDYXNlKCk6InRleHQiO2xldFtCLEVdPXJ8fG98fGc/dnQoW3Isb10sZyk6W10sbCxjLHA9KCk9PnshbCYmc2V0VGltZW91dCgoKT0+e0ImJkIudW5zdWJzY3JpYmUoKX0pLGw9ITB9LFM7dHJ5e2lmKFEmJlBJJiZlIT09ImdldCImJmUhPT0iaGVhZCImJihTPWF3YWl0IGpJKG4sSSkpIT09MCl7bGV0IEw9bmV3IFJlcXVlc3QodCx7bWV0aG9kOiJQT1NUIixib2R5OkksZHVwbGV4OiJoYWxmIn0pLEo7aWYoaS5pc0Zvcm1EYXRhKEkpJiYoSj1MLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKSkmJm4uc2V0Q29udGVudFR5cGUoSiksTC5ib2R5KXtsZXRbSEEsQ0FdPXZBKFMsXygkQShRKSkpO0k9ZXQoTC5ib2R5LCR0LEhBLENBLEl0KX19aS5pc1N0cmluZyhzKXx8KHM9cz8iaW5jbHVkZSI6Im9taXQiKSxjPW5ldyBSZXF1ZXN0KHQsey4uLmYsc2lnbmFsOkIsbWV0aG9kOmUudG9VcHBlckNhc2UoKSxoZWFkZXJzOm4ubm9ybWFsaXplKCkudG9KU09OKCksYm9keTpJLGR1cGxleDoiaGFsZiIsY3JlZGVudGlhbHM6c30pO2xldCBEPWF3YWl0IGZldGNoKGMpLFU9cnQmJihhPT09InN0cmVhbSJ8fGE9PT0icmVzcG9uc2UiKTtpZihydCYmKEN8fFUpKXtsZXQgTD17fTtbInN0YXR1cyIsInN0YXR1c1RleHQiLCJoZWFkZXJzIl0uZm9yRWFjaChFdD0+e0xbRXRdPURbRXRdfSk7bGV0IEo9aS50b0Zpbml0ZU51bWJlcihELmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKSxbSEEsQ0FdPUMmJnZBKEosXygkQShDKSwhMCkpfHxbXTtEPW5ldyBSZXNwb25zZShldChELmJvZHksJHQsSEEsKCk9PntDQSYmQ0EoKSxVJiZwKCl9LEl0KSxMKX1hPWF8fCJ0ZXh0IjtsZXQgSz1hd2FpdCBGQVtpLmZpbmRLZXkoRkEsYSl8fCJ0ZXh0Il0oRCxBKTtyZXR1cm4hVSYmcCgpLEUmJkUoKSxhd2FpdCBuZXcgUHJvbWlzZSgoTCxKKT0+e29BKEwsSix7ZGF0YTpLLGhlYWRlcnM6bS5mcm9tKEQuaGVhZGVycyksc3RhdHVzOkQuc3RhdHVzLHN0YXR1c1RleHQ6RC5zdGF0dXNUZXh0LGNvbmZpZzpBLHJlcXVlc3Q6Y30pfSl9Y2F0Y2goRCl7dGhyb3cgcCgpLEQmJkQubmFtZT09PSJUeXBlRXJyb3IiJiYvZmV0Y2gvaS50ZXN0KEQubWVzc2FnZSk/T2JqZWN0LmFzc2lnbihuZXcgdSgiTmV0d29yayBFcnJvciIsdS5FUlJfTkVUV09SSyxBLGMpLHtjYXVzZTpELmNhdXNlfHxEfSk6dS5mcm9tKEQsRCYmRC5jb2RlLEEsYyl9fSk7dmFyIG90PXtodHRwOmRBLHhocjp6dCxmZXRjaDplZX07aS5mb3JFYWNoKG90LChBLHQpPT57aWYoQSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJuYW1lIix7dmFsdWU6dH0pfWNhdGNoe31PYmplY3QuZGVmaW5lUHJvcGVydHkoQSwiYWRhcHRlck5hbWUiLHt2YWx1ZTp0fSl9fSk7dmFyIEllPUE9PmAtICR7QX1gLFpJPUE9PmkuaXNGdW5jdGlvbihBKXx8QT09PW51bGx8fEE9PT0hMSxOQT17Z2V0QWRhcHRlcjpBPT57QT1pLmlzQXJyYXkoQSk/QTpbQV07bGV0e2xlbmd0aDp0fT1BLGUsSSxyPXt9O2ZvcihsZXQgbz0wO288dDtvKyspe2U9QVtvXTtsZXQgZztpZihJPWUsIVpJKGUpJiYoST1vdFsoZz1TdHJpbmcoZSkpLnRvTG93ZXJDYXNlKCldLEk9PT12b2lkIDApKXRocm93IG5ldyB1KGBVbmtub3duIGFkYXB0ZXIgXCcke2d9XCdgKTtpZihJKWJyZWFrO3JbZ3x8IiUyMyIrb109SX1pZighSSl7bGV0IG89T2JqZWN0LmVudHJpZXMocikubWFwKChbQyxRXSk9PmBhZGFwdGVyICR7Q30gYCsoUT09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGc9dD9vLmxlbmd0aD4xP2BzaW5jZSA6JTBBYCtvLm1hcChJZSkuam9pbihgJTBBYCk6IiAiK0llKG9bMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IHUoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIitnLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gSX0sYWRhcHRlcnM6b3R9O2Z1bmN0aW9uIGd0KEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBiKG51bGwsQSl9ZnVuY3Rpb24gVUEoQSl7cmV0dXJuIGd0KEEpLEEuaGVhZGVycz1tLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9SUEuY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLE5BLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxaLmFkYXB0ZXIpKEEpLnRoZW4oZnVuY3Rpb24oSSl7cmV0dXJuIGd0KEEpLEkuZGF0YT1JQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJKSxJLmhlYWRlcnM9bS5mcm9tKEkuaGVhZGVycyksSX0sZnVuY3Rpb24oSSl7cmV0dXJuIHJBKEkpfHwoZ3QoQSksSSYmSS5yZXNwb25zZSYmKEkucmVzcG9uc2UuZGF0YT1JQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJLnJlc3BvbnNlKSxJLnJlc3BvbnNlLmhlYWRlcnM9bS5mcm9tKEkucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChJKX0pfXZhciBHQT0iMS43LjQiO3ZhciBpdD17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKEEsdCk9PntpdFtBXT1mdW5jdGlvbihJKXtyZXR1cm4gdHlwZW9mIEk9PT1BfHwiYSIrKHQ8MT8ibiAiOiIgIikrQX19KTt2YXIgcmU9e307aXQudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKHQsZSxJKXtmdW5jdGlvbiByKG8sZyl7cmV0dXJuIltBeGlvcyB2IitHQSsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFwnIitvKyJcJyIrZysoST8iLiAiK0k6IiIpfXJldHVybihvLGcsQyk9PntpZih0PT09ITEpdGhyb3cgbmV3IHUocihnLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKGU/IiBpbiAiK2U6IiIpKSx1LkVSUl9ERVBSRUNBVEVEKTtyZXR1cm4gZSYmIXJlW2ddJiYocmVbZ109ITAsY29uc29sZS53YXJuKHIoZywiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrZSsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSx0P3QobyxnLEMpOiEwfX07ZnVuY3Rpb24gVkkoQSx0LGUpe2lmKHR5cGVvZiBBIT0ib2JqZWN0Iil0aHJvdyBuZXcgdSgib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIsdS5FUlJfQkFEX09QVElPTl9WQUxVRSk7bGV0IEk9T2JqZWN0LmtleXMoQSkscj1JLmxlbmd0aDtmb3IoO3ItLSA+MDspe2xldCBvPUlbcl0sZz10W29dO2lmKGcpe2xldCBDPUFbb10sUT1DPT09dm9pZCAwfHxnKEMsbyxBKTtpZihRIT09ITApdGhyb3cgbmV3IHUoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrUSx1LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtjb250aW51ZX1pZihlIT09ITApdGhyb3cgbmV3IHUoIlVua25vd24gb3B0aW9uICIrbyx1LkVSUl9CQURfT1BUSU9OKX19dmFyIGtBPXthc3NlcnRPcHRpb25zOlZJLHZhbGlkYXRvcnM6aXR9O3ZhciBNPWtBLnZhbGlkYXRvcnMsWD1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmRlZmF1bHRzPXQsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IFdBLHJlc3BvbnNlOm5ldyBXQX19YXN5bmMgcmVxdWVzdCh0LGUpe3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdCh0LGUpfWNhdGNoKEkpe2lmKEkgaW5zdGFuY2VvZiBFcnJvcil7bGV0IHI7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uocj17fSk6cj1uZXcgRXJyb3I7bGV0IG89ci5zdGFjaz9yLnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sIiIpOiIiO3RyeXtJLnN0YWNrP28mJiFTdHJpbmcoSS5zdGFjaykuZW5kc1dpdGgoby5yZXBsYWNlKC9eLitcXG4uK1xcbi8sIiIpKSYmKEkuc3RhY2srPWAlMEFgK28pOkkuc3RhY2s9b31jYXRjaHt9fXRocm93IEl9fV9yZXF1ZXN0KHQsZSl7dHlwZW9mIHQ9PSJzdHJpbmciPyhlPWV8fHt9LGUudXJsPXQpOmU9dHx8e30sZT1rKHRoaXMuZGVmYXVsdHMsZSk7bGV0e3RyYW5zaXRpb25hbDpJLHBhcmFtc1NlcmlhbGl6ZXI6cixoZWFkZXJzOm99PWU7SSE9PXZvaWQgMCYma0EuYXNzZXJ0T3B0aW9ucyhJLHtzaWxlbnRKU09OUGFyc2luZzpNLnRyYW5zaXRpb25hbChNLmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOk0udHJhbnNpdGlvbmFsKE0uYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpNLnRyYW5zaXRpb25hbChNLmJvb2xlYW4pfSwhMSksciE9bnVsbCYmKGkuaXNGdW5jdGlvbihyKT9lLnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpyfTprQS5hc3NlcnRPcHRpb25zKHIse2VuY29kZTpNLmZ1bmN0aW9uLHNlcmlhbGl6ZTpNLmZ1bmN0aW9ufSwhMCkpLGUubWV0aG9kPShlLm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBnPW8mJmkubWVyZ2Uoby5jb21tb24sb1tlLm1ldGhvZF0pO28mJmkuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxFPT57ZGVsZXRlIG9bRV19KSxlLmhlYWRlcnM9bS5jb25jYXQoZyxvKTtsZXQgQz1bXSxRPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihsKXt0eXBlb2YgbC5ydW5XaGVuPT0iZnVuY3Rpb24iJiZsLnJ1bldoZW4oZSk9PT0hMXx8KFE9USYmbC5zeW5jaHJvbm91cyxDLnVuc2hpZnQobC5mdWxmaWxsZWQsbC5yZWplY3RlZCkpfSk7bGV0IGE9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihsKXthLnB1c2gobC5mdWxmaWxsZWQsbC5yZWplY3RlZCl9KTtsZXQgbixzPTAsZjtpZighUSl7bGV0IEU9W1VBLmJpbmQodGhpcyksdm9pZCAwXTtmb3IoRS51bnNoaWZ0LmFwcGx5KEUsQyksRS5wdXNoLmFwcGx5KEUsYSksZj1FLmxlbmd0aCxuPVByb21pc2UucmVzb2x2ZShlKTtzPGY7KW49bi50aGVuKEVbcysrXSxFW3MrK10pO3JldHVybiBufWY9Qy5sZW5ndGg7bGV0IEI9ZTtmb3Iocz0wO3M8Zjspe2xldCBFPUNbcysrXSxsPUNbcysrXTt0cnl7Qj1FKEIpfWNhdGNoKGMpe2wuY2FsbCh0aGlzLGMpO2JyZWFrfX10cnl7bj1VQS5jYWxsKHRoaXMsQil9Y2F0Y2goRSl7cmV0dXJuIFByb21pc2UucmVqZWN0KEUpfWZvcihzPTAsZj1hLmxlbmd0aDtzPGY7KW49bi50aGVuKGFbcysrXSxhW3MrK10pO3JldHVybiBufWdldFVyaSh0KXt0PWsodGhpcy5kZWZhdWx0cyx0KTtsZXQgZT1nQSh0LmJhc2VVUkwsdC51cmwpO3JldHVybiB0QShlLHQucGFyYW1zLHQucGFyYW1zU2VyaWFsaXplcil9fTtpLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKHQpe1gucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsSSl7cmV0dXJuIHRoaXMucmVxdWVzdChrKEl8fHt9LHttZXRob2Q6dCx1cmw6ZSxkYXRhOihJfHx7fSkuZGF0YX0pKX19KTtpLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKEkpe3JldHVybiBmdW5jdGlvbihvLGcsQyl7cmV0dXJuIHRoaXMucmVxdWVzdChrKEN8fHt9LHttZXRob2Q6dCxoZWFkZXJzOkk/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm8sZGF0YTpnfSkpfX1YLnByb3RvdHlwZVt0XT1lKCksWC5wcm90b3R5cGVbdCsiRm9ybSJdPWUoITApfSk7dmFyIGlBPVg7dmFyIG50PWNsYXNzIEF7Y29uc3RydWN0b3IodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihvKXtlPW99KTtsZXQgST10aGlzO3RoaXMucHJvbWlzZS50aGVuKHI9PntpZighSS5fbGlzdGVuZXJzKXJldHVybjtsZXQgbz1JLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7by0tID4wOylJLl9saXN0ZW5lcnNbb10ocik7SS5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1yPT57bGV0IG8sZz1uZXcgUHJvbWlzZShDPT57SS5zdWJzY3JpYmUoQyksbz1DfSkudGhlbihyKTtyZXR1cm4gZy5jYW5jZWw9ZnVuY3Rpb24oKXtJLnVuc3Vic2NyaWJlKG8pfSxnfSx0KGZ1bmN0aW9uKG8sZyxDKXtJLnJlYXNvbnx8KEkucmVhc29uPW5ldyBiKG8sZyxDKSxlKEkucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKHQpe2lmKHRoaXMucmVhc29uKXt0KHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKHQpOnRoaXMuX2xpc3RlbmVycz1bdF19dW5zdWJzY3JpYmUodCl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IGU9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YodCk7ZSE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGUsMSl9c3RhdGljIHNvdXJjZSgpe2xldCB0O3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihyKXt0PXJ9KSxjYW5jZWw6dH19fSxvZT1udDtmdW5jdGlvbiBzdChBKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEEuYXBwbHkobnVsbCxlKX19ZnVuY3Rpb24gQ3QoQSl7cmV0dXJuIGkuaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIEJ0PXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhCdCkuZm9yRWFjaCgoW0EsdF0pPT57QnRbdF09QX0pO3ZhciBnZT1CdDtmdW5jdGlvbiBpZShBKXtsZXQgdD1uZXcgaUEoQSksZT12KGlBLnByb3RvdHlwZS5yZXF1ZXN0LHQpO3JldHVybiBpLmV4dGVuZChlLGlBLnByb3RvdHlwZSx0LHthbGxPd25LZXlzOiEwfSksaS5leHRlbmQoZSx0LG51bGwse2FsbE93bktleXM6ITB9KSxlLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gaWUoayhBLHIpKX0sZX12YXIgZD1pZShaKTtkLkF4aW9zPWlBO2QuQ2FuY2VsZWRFcnJvcj1iO2QuQ2FuY2VsVG9rZW49b2U7ZC5pc0NhbmNlbD1yQTtkLlZFUlNJT049R0E7ZC50b0Zvcm1EYXRhPXE7ZC5BeGlvc0Vycm9yPXU7ZC5DYW5jZWw9ZC5DYW5jZWxlZEVycm9yO2QuYWxsPWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLmFsbCh0KX07ZC5zcHJlYWQ9c3Q7ZC5pc0F4aW9zRXJyb3I9Q3Q7ZC5tZXJnZUNvbmZpZz1rO2QuQXhpb3NIZWFkZXJzPW07ZC5mb3JtVG9KU09OPUE9PndBKGkuaXNIVE1MRm9ybShBKT9uZXcgRm9ybURhdGEoQSk6QSk7ZC5nZXRBZGFwdGVyPU5BLmdldEFkYXB0ZXI7ZC5IdHRwU3RhdHVzQ29kZT1nZTtkLmRlZmF1bHQ9ZDt2YXIgTEE9ZDt2YXJ7QXhpb3M6RWksQXhpb3NFcnJvcjpjaSxDYW5jZWxlZEVycm9yOmZpLGlzQ2FuY2VsOmxpLENhbmNlbFRva2VuOnVpLFZFUlNJT046RGksYWxsOmhpLENhbmNlbDpkaSxpc0F4aW9zRXJyb3I6eWksc3ByZWFkOm1pLHRvRm9ybURhdGE6d2ksQXhpb3NIZWFkZXJzOnBpLEh0dHBTdGF0dXNDb2RlOlNpLGZvcm1Ub0pTT046RmksZ2V0QWRhcHRlcjpSaSxtZXJnZUNvbmZpZzpOaX09TEE7dmFyIG5BLFksUXQsYXQ9e2Vudjp7ZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDpmdW5jdGlvbihBKXtRdD1uZXcgVWludDhBcnJheShZLmV4cG9ydHMubWVtb3J5LmJ1ZmZlcil9fX0sSkE9Y2xhc3N7aW5pdCgpe3JldHVybiBuQXx8KHR5cGVvZiBmZXRjaDwidSI/bkE9ZmV0Y2goImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsIituZSkudGhlbih0PT50LmFycmF5QnVmZmVyKCkpLnRoZW4odD0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUodCxhdCkpLnRoZW4odGhpcy5faW5pdCk6bkE9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoQnVmZmVyLmZyb20obmUsImJhc2U2NCIpLGF0KS50aGVuKHRoaXMuX2luaXQpLG5BKX1faW5pdCh0KXtZPXQuaW5zdGFuY2UsYXQuZW52LmVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgoMCl9ZGVjb2RlKHQsZT0wKXtpZighWSl0aHJvdyBuZXcgRXJyb3IoIlpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy4iKTtsZXQgST10LmJ5dGVMZW5ndGgscj1ZLmV4cG9ydHMubWFsbG9jKEkpO1F0LnNldCh0LHIpLGU9ZXx8TnVtYmVyKFkuZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKHIsSSkpO2xldCBvPVkuZXhwb3J0cy5tYWxsb2MoZSksZz1ZLmV4cG9ydHMuWlNURF9kZWNvbXByZXNzKG8sZSxyLEkpLEM9UXQuc2xpY2UobyxvK2cpO3JldHVybiBZLmV4cG9ydHMuZnJlZShyKSxZLmV4cG9ydHMuZnJlZShvKSxDfX0sbmU9IkFHRnpiUUVBQUFBQmJnNWdBMzkvZndGL1lBRi9BWDlnQW45L0FHQUJmd0JnQlg5L2YzOS9BWDlnQTM5L2Z3QmdCSDkvZjM4QmYyQUFBWDlnQW45L0FYOWdCMzkvZjM5L2YzOEJmMkFDZjM4QmZtQUlmMzkvZjM5L2YzOEJmMkFGZjM5L2YzOEFZQTUvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9BaWNCQTJWdWRoOWxiWE5qY21sd2RHVnVYMjV2ZEdsbWVWOXRaVzF2Y25sZlozSnZkM1JvQUFNREl5SUhBQUFCQVFNSEF3RUFDUVFBQlFFSUNBRUZCZ1FFQkFNR0FBQUtBQVVMREEwR0JBVUJjQUVCQVFVSEFRR0FBb0NBQWdZSUFYOEJRWUNqQkFzSHJnRUxCbTFsYlc5eWVRSUFCbTFoYkd4dll3QUZCR1p5WldVQUJneGFVMVJFWDJselJYSnliM0lBRWhsYVUxUkVYMlpwYm1SRVpXTnZiWEJ5WlhOelpXUlRhWHBsQUJ3UFdsTlVSRjlrWldOdmJYQnlaWE56QUNJWlgxOXBibVJwY21WamRGOW1kVzVqZEdsdmJsOTBZV0pzWlFFQUVGOWZaWEp5Ym05ZmJHOWpZWFJwYjI0QUFRbHpkR0ZqYTFOaGRtVUFCd3h6ZEdGamExSmxjM1J2Y21VQUNBcHpkR0ZqYTBGc2JHOWpBQWtLaS9JQklnVUFRWVFmQ3pNQkFYOGdBZ1JBSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FEUVFGcUlRTWdBVUVCYWlFQklBSkJBV3NpQWcwQUN3c2dBQXNwQVFGL0lBSUVRQ0FBSVFNRFFDQURJQUU2QUFBZ0EwRUJhaUVESUFKQkFXc2lBZzBBQ3dzZ0FBdHNBUUovUVlBZktBSUFJZ0VnQUVFSGFrRjRjU0lDYWlFQUFrQWdBa0VBSUFBZ0FVMGJEUUFnQUQ4QVFSQjBTd1JBSUFBL0FFRVFkR3RCLy84RGFrRVFka0FBUVg5R0JIOUJBQVZCQUJBQVFRRUxSUTBCQzBHQUh5QUFOZ0lBSUFFUEMwR0VIMEV3TmdJQVFYOEx1U2NCQzM4akFFRVFheUlLSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkI5QUZOQkVCQmlCOG9BZ0FpQmtFUUlBQkJDMnBCZUhFZ0FFRUxTUnNpQlVFRGRpSUFkaUlCUVFOeEJFQUNRQ0FCUVg5elFRRnhJQUJxSWdKQkEzUWlBVUd3SDJvaUFDQUJRYmdmYWlnQ0FDSUJLQUlJSWdSR0JFQkJpQjhnQmtGK0lBSjNjVFlDQUF3QkN5QUVJQUEyQWd3Z0FDQUVOZ0lJQ3lBQlFRaHFJUUFnQVNBQ1FRTjBJZ0pCQTNJMkFnUWdBU0FDYWlJQklBRW9BZ1JCQVhJMkFnUU1Ed3NnQlVHUUh5Z0NBQ0lIVFEwQklBRUVRQUpBUVFJZ0FIUWlBa0VBSUFKcmNpQUJJQUIwY1dnaUFVRURkQ0lBUWJBZmFpSUNJQUJCdUI5cUtBSUFJZ0FvQWdnaUJFWUVRRUdJSHlBR1FYNGdBWGR4SWdZMkFnQU1BUXNnQkNBQ05nSU1JQUlnQkRZQ0NBc2dBQ0FGUVFOeU5nSUVJQUFnQldvaUNDQUJRUU4wSWdFZ0JXc2lCRUVCY2pZQ0JDQUFJQUZxSUFRMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFGQm5COG9BZ0FoQWdKL0lBWkJBU0FIUVFOMmRDSURjVVVFUUVHSUh5QURJQVp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBeUFCSUFJMkFnZ2dBeUFDTmdJTUlBSWdBVFlDRENBQ0lBTTJBZ2dMSUFCQkNHb2hBRUdjSHlBSU5nSUFRWkFmSUFRMkFnQU1Ed3RCakI4b0FnQWlDMFVOQVNBTGFFRUNkRUc0SVdvb0FnQWlBaWdDQkVGNGNTQUZheUVESUFJaEFRTkFBa0FnQVNnQ0VDSUFSUVJBSUFFb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBRmF5SUJJQU1nQVNBRFNTSUJHeUVESUFBZ0FpQUJHeUVDSUFBaEFRd0JDd3NnQWlnQ0dDRUpJQUlnQWlnQ0RDSUVSd1JBUVpnZktBSUFHaUFDS0FJSUlnQWdCRFlDRENBRUlBQTJBZ2dNRGdzZ0FrRVVhaUlCS0FJQUlnQkZCRUFnQWlnQ0VDSUFSUTBESUFKQkVHb2hBUXNEUUNBQklRZ2dBQ0lFUVJScUlnRW9BZ0FpQUEwQUlBUkJFR29oQVNBRUtBSVFJZ0FOQUFzZ0NFRUFOZ0lBREEwTFFYOGhCU0FBUWI5L1N3MEFJQUJCQzJvaUFFRjRjU0VGUVl3ZktBSUFJZ2hGRFFCQkFDQUZheUVEQWtBQ1FBSkFBbjlCQUNBRlFZQUNTUTBBR2tFZklBVkIvLy8vQjBzTkFCb2dCVUVtSUFCQkNIWm5JZ0JyZGtFQmNTQUFRUUYwYTBFK2Fnc2lCMEVDZEVHNElXb29BZ0FpQVVVRVFFRUFJUUFNQVF0QkFDRUFJQVZCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VDQTBBQ1FDQUJLQUlFUVhoeElBVnJJZ1lnQTA4TkFDQUJJUVFnQmlJRERRQkJBQ0VESUFFaEFBd0RDeUFBSUFFb0FoUWlCaUFHSUFFZ0FrRWRka0VFY1dvb0FoQWlBVVliSUFBZ0Joc2hBQ0FDUVFGMElRSWdBUTBBQ3dzZ0FDQUVja1VFUUVFQUlRUkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUdoQkFuUkJ1Q0ZxS0FJQUlRQUxJQUJGRFFFTEEwQWdBQ2dDQkVGNGNTQUZheUlDSUFOSklRRWdBaUFESUFFYklRTWdBQ0FFSUFFYklRUWdBQ2dDRUNJQkJIOGdBUVVnQUNnQ0ZBc2lBQTBBQ3dzZ0JFVU5BQ0FEUVpBZktBSUFJQVZyVHcwQUlBUW9BaGdoQnlBRUlBUW9BZ3dpQWtjRVFFR1lIeWdDQUJvZ0JDZ0NDQ0lBSUFJMkFnd2dBaUFBTmdJSURBd0xJQVJCRkdvaUFTZ0NBQ0lBUlFSQUlBUW9BaEFpQUVVTkF5QUVRUkJxSVFFTEEwQWdBU0VHSUFBaUFrRVVhaUlCS0FJQUlnQU5BQ0FDUVJCcUlRRWdBaWdDRUNJQURRQUxJQVpCQURZQ0FBd0xDeUFGUVpBZktBSUFJZ1JOQkVCQm5COG9BZ0FoQUFKQUlBUWdCV3NpQVVFUVR3UkFJQUFnQldvaUFpQUJRUUZ5TmdJRUlBQWdCR29nQVRZQ0FDQUFJQVZCQTNJMkFnUU1BUXNnQUNBRVFRTnlOZ0lFSUFBZ0JHb2lBU0FCS0FJRVFRRnlOZ0lFUVFBaEFrRUFJUUVMUVpBZklBRTJBZ0JCbkI4Z0FqWUNBQ0FBUVFocUlRQU1EUXNnQlVHVUh5Z0NBQ0lDU1FSQVFaUWZJQUlnQldzaUFUWUNBRUdnSDBHZ0h5Z0NBQ0lBSUFWcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0JVRURjallDQkNBQVFRaHFJUUFNRFF0QkFDRUFJQVZCTDJvaUF3Si9RZUFpS0FJQUJFQkI2Q0lvQWdBTUFRdEI3Q0pDZnpjQ0FFSGtJa0tBb0lDQWdJQUVOd0lBUWVBaUlBcEJER3BCY0hGQjJLclZxZ1Z6TmdJQVFmUWlRUUEyQWdCQnhDSkJBRFlDQUVHQUlBc2lBV29pQmtFQUlBRnJJZ2h4SWdFZ0JVME5ERUhBSWlnQ0FDSUVCRUJCdUNJb0FnQWlCeUFCYWlJSklBZE5JQVFnQ1VseURRMExBa0JCeENJdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVHZ0h5Z0NBQ0lFQkVCQnlDSWhBQU5BSUFRZ0FDZ0NBQ0lIVHdSQUlBY2dBQ2dDQkdvZ0JFc05Bd3NnQUNnQ0NDSUFEUUFMQzBFQUVBUWlBa0YvUmcwRElBRWhCa0hrSWlnQ0FDSUFRUUZySWdRZ0FuRUVRQ0FCSUFKcklBSWdCR3BCQUNBQWEzRnFJUVlMSUFVZ0JrOE5BMEhBSWlnQ0FDSUFCRUJCdUNJb0FnQWlCQ0FHYWlJSUlBUk5JQUFnQ0VseURRUUxJQVlRQkNJQUlBSkhEUUVNQlFzZ0JpQUNheUFJY1NJR0VBUWlBaUFBS0FJQUlBQW9BZ1JxUmcwQklBSWhBQXNnQUVGL1JnMEJJQVZCTUdvZ0JrMEVRQ0FBSVFJTUJBdEI2Q0lvQWdBaUFpQURJQVpyYWtFQUlBSnJjU0lDRUFSQmYwWU5BU0FDSUFacUlRWWdBQ0VDREFNTElBSkJmMGNOQWd0QnhDSkJ4Q0lvQWdCQkJISTJBZ0FMSUFFUUJDSUNRWDlHUVFBUUJDSUFRWDlHY2lBQUlBSk5jZzBGSUFBZ0Ftc2lCaUFGUVNocVRRMEZDMEc0SWtHNElpZ0NBQ0FHYWlJQU5nSUFRYndpS0FJQUlBQkpCRUJCdkNJZ0FEWUNBQXNDUUVHZ0h5Z0NBQ0lEQkVCQnlDSWhBQU5BSUFJZ0FDZ0NBQ0lCSUFBb0FnUWlCR3BHRFFJZ0FDZ0NDQ0lBRFFBTERBUUxRWmdmS0FJQUlnQkJBQ0FBSUFKTkcwVUVRRUdZSHlBQ05nSUFDMEVBSVFCQnpDSWdCallDQUVISUlpQUNOZ0lBUWFnZlFYODJBZ0JCckI5QjRDSW9BZ0EyQWdCQjFDSkJBRFlDQUFOQUlBQkJBM1FpQVVHNEgyb2dBVUd3SDJvaUJEWUNBQ0FCUWJ3ZmFpQUVOZ0lBSUFCQkFXb2lBRUVnUncwQUMwR1VIeUFHUVNocklnQkJlQ0FDYTBFSGNTSUJheUlFTmdJQVFhQWZJQUVnQW1vaUFUWUNBQ0FCSUFSQkFYSTJBZ1FnQUNBQ2FrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBUUxJQUlnQTAwZ0FTQURTM0lOQWlBQUtBSU1RUWh4RFFJZ0FDQUVJQVpxTmdJRVFhQWZJQU5CZUNBRGEwRUhjU0lBYWlJQk5nSUFRWlFmUVpRZktBSUFJQVpxSWdJZ0FHc2lBRFlDQUNBQklBQkJBWEkyQWdRZ0FpQURha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQU1MUVFBaEJBd0tDMEVBSVFJTUNBdEJtQjhvQWdBZ0Frc0VRRUdZSHlBQ05nSUFDeUFDSUFacUlRRkJ5Q0loQUFKQUFrQUNRQU5BSUFFZ0FDZ0NBRWNFUUNBQUtBSUlJZ0FOQVF3Q0N3c2dBQzBBREVFSWNVVU5BUXRCeUNJaEFBTkFJQU1nQUNnQ0FDSUJUd1JBSUFFZ0FDZ0NCR29pQkNBRFN3MERDeUFBS0FJSUlRQU1BQXNBQ3lBQUlBSTJBZ0FnQUNBQUtBSUVJQVpxTmdJRUlBSkJlQ0FDYTBFSGNXb2lCeUFGUVFOeU5nSUVJQUZCZUNBQmEwRUhjV29pQmlBRklBZHFJZ1ZySVFBZ0F5QUdSZ1JBUWFBZklBVTJBZ0JCbEI5QmxCOG9BZ0FnQUdvaUFEWUNBQ0FGSUFCQkFYSTJBZ1FNQ0F0Qm5COG9BZ0FnQmtZRVFFR2NIeUFGTmdJQVFaQWZRWkFmS0FJQUlBQnFJZ0EyQWdBZ0JTQUFRUUZ5TmdJRUlBQWdCV29nQURZQ0FBd0lDeUFHS0FJRUlnTkJBM0ZCQVVjTkJpQURRWGh4SVFrZ0EwSC9BVTBFUUNBR0tBSU1JZ0VnQmlnQ0NDSUNSZ1JBUVlnZlFZZ2ZLQUlBUVg0Z0EwRURkbmR4TmdJQURBY0xJQUlnQVRZQ0RDQUJJQUkyQWdnTUJnc2dCaWdDR0NFSUlBWWdCaWdDRENJQ1J3UkFJQVlvQWdnaUFTQUNOZ0lNSUFJZ0FUWUNDQXdGQ3lBR1FSUnFJZ0VvQWdBaUEwVUVRQ0FHS0FJUUlnTkZEUVFnQmtFUWFpRUJDd05BSUFFaEJDQURJZ0pCRkdvaUFTZ0NBQ0lERFFBZ0FrRVFhaUVCSUFJb0FoQWlBdzBBQ3lBRVFRQTJBZ0FNQkF0QmxCOGdCa0VvYXlJQVFYZ2dBbXRCQjNFaUFXc2lDRFlDQUVHZ0h5QUJJQUpxSWdFMkFnQWdBU0FJUVFGeU5nSUVJQUFnQW1wQktEWUNCRUdrSDBId0lpZ0NBRFlDQUNBRElBUkJKeUFFYTBFSGNXcEJMMnNpQUNBQUlBTkJFR3BKR3lJQlFSczJBZ1FnQVVIUUlpa0NBRGNDRUNBQlFjZ2lLUUlBTndJSVFkQWlJQUZCQ0dvMkFnQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFkUWlRUUEyQWdBZ0FVRVlhaUVBQTBBZ0FFRUhOZ0lFSUFCQkNHb2dBRUVFYWlFQUlBUkpEUUFMSUFFZ0EwWU5BQ0FCSUFFb0FnUkJmbkUyQWdRZ0F5QUJJQU5ySWdKQkFYSTJBZ1FnQVNBQ05nSUFJQUpCL3dGTkJFQWdBa0Y0Y1VHd0gyb2hBQUovUVlnZktBSUFJZ0ZCQVNBQ1FRTjJkQ0lDY1VVRVFFR0lIeUFCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQVNBQUlBTTJBZ2dnQVNBRE5nSU1JQU1nQURZQ0RDQURJQUUyQWdnTUFRdEJIeUVBSUFKQi8vLy9CMDBFUUNBQ1FTWWdBa0VJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBTWdBRFlDSENBRFFnQTNBaEFnQUVFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUJFRUJJQUIwSWdaeFJRUkFRWXdmSUFRZ0JuSTJBZ0FnQVNBRE5nSUFEQUVMSUFKQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQkFOQUlBUWlBU2dDQkVGNGNTQUNSZzBDSUFCQkhYWWhCQ0FBUVFGMElRQWdBU0FFUVFSeGFpSUdLQUlRSWdRTkFBc2dCaUFETmdJUUN5QURJQUUyQWhnZ0F5QUROZ0lNSUFNZ0F6WUNDQXdCQ3lBQktBSUlJZ0FnQXpZQ0RDQUJJQU0yQWdnZ0EwRUFOZ0lZSUFNZ0FUWUNEQ0FESUFBMkFnZ0xRWlFmS0FJQUlnQWdCVTBOQUVHVUh5QUFJQVZySWdFMkFnQkJvQjlCb0I4b0FnQWlBQ0FGYWlJQ05nSUFJQUlnQVVFQmNqWUNCQ0FBSUFWQkEzSTJBZ1FnQUVFSWFpRUFEQWdMUVlRZlFUQTJBZ0JCQUNFQURBY0xRUUFoQWdzZ0NFVU5BQUpBSUFZb0Fod2lBVUVDZEVHNElXb2lCQ2dDQUNBR1JnUkFJQVFnQWpZQ0FDQUNEUUZCakI5QmpCOG9BZ0JCZmlBQmQzRTJBZ0FNQWdzZ0NFRVFRUlFnQ0NnQ0VDQUdSaHRxSUFJMkFnQWdBa1VOQVFzZ0FpQUlOZ0lZSUFZb0FoQWlBUVJBSUFJZ0FUWUNFQ0FCSUFJMkFoZ0xJQVlvQWhRaUFVVU5BQ0FDSUFFMkFoUWdBU0FDTmdJWUN5QUFJQWxxSVFBZ0JpQUphaUlHS0FJRUlRTUxJQVlnQTBGK2NUWUNCQ0FGSUFCQkFYSTJBZ1FnQUNBRmFpQUFOZ0lBSUFCQi93Rk5CRUFnQUVGNGNVR3dIMm9oQVFKL1FZZ2ZLQUlBSWdKQkFTQUFRUU4yZENJQWNVVUVRRUdJSHlBQUlBSnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQVUyQWdnZ0FDQUZOZ0lNSUFVZ0FUWUNEQ0FGSUFBMkFnZ01BUXRCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQVVnQXpZQ0hDQUZRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlBa0VCSUFOMElnUnhSUVJBUVl3ZklBSWdCSEkyQWdBZ0FTQUZOZ0lBREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFnTkFJQUlpQVNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQWlBRFFRRjBJUU1nQVNBQ1FRUnhhaUlFS0FJUUlnSU5BQXNnQkNBRk5nSVFDeUFGSUFFMkFoZ2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUJLQUlJSWdBZ0JUWUNEQ0FCSUFVMkFnZ2dCVUVBTmdJWUlBVWdBVFlDRENBRklBQTJBZ2dMSUFkQkNHb2hBQXdDQ3dKQUlBZEZEUUFDUUNBRUtBSWNJZ0JCQW5SQnVDRnFJZ0VvQWdBZ0JFWUVRQ0FCSUFJMkFnQWdBZzBCUVl3ZklBaEJmaUFBZDNFaUNEWUNBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBUkdHMm9nQWpZQ0FDQUNSUTBCQ3lBQ0lBYzJBaGdnQkNnQ0VDSUFCRUFnQWlBQU5nSVFJQUFnQWpZQ0dBc2dCQ2dDRkNJQVJRMEFJQUlnQURZQ0ZDQUFJQUkyQWhnTEFrQWdBMEVQVFFSQUlBUWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0JHb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBUWdCVUVEY2pZQ0JDQUVJQVZxSWdJZ0EwRUJjallDQkNBQ0lBTnFJQU0yQWdBZ0EwSC9BVTBFUUNBRFFYaHhRYkFmYWlFQUFuOUJpQjhvQWdBaUFVRUJJQU5CQTNaMElnTnhSUVJBUVlnZklBRWdBM0kyQWdBZ0FBd0JDeUFBS0FJSUN5RUJJQUFnQWpZQ0NDQUJJQUkyQWd3Z0FpQUFOZ0lNSUFJZ0FUWUNDQXdCQzBFZklRQWdBMEgvLy84SFRRUkFJQU5CSmlBRFFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hBQXNnQWlBQU5nSWNJQUpDQURjQ0VDQUFRUUowUWJnaGFpRUJBa0FDUUNBSVFRRWdBSFFpQm5GRkJFQkJqQjhnQmlBSWNqWUNBQ0FCSUFJMkFnQU1BUXNnQTBFWklBQkJBWFpyUVFBZ0FFRWZSeHQwSVFBZ0FTZ0NBQ0VGQTBBZ0JTSUJLQUlFUVhoeElBTkdEUUlnQUVFZGRpRUdJQUJCQVhRaEFDQUJJQVpCQkhGcUlnWW9BaEFpQlEwQUN5QUdJQUkyQWhBTElBSWdBVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFFb0FnZ2lBQ0FDTmdJTUlBRWdBallDQ0NBQ1FRQTJBaGdnQWlBQk5nSU1JQUlnQURZQ0NBc2dCRUVJYWlFQURBRUxBa0FnQ1VVTkFBSkFJQUlvQWh3aUFFRUNkRUc0SVdvaUFTZ0NBQ0FDUmdSQUlBRWdCRFlDQUNBRURRRkJqQjhnQzBGK0lBQjNjVFlDQUF3Q0N5QUpRUkJCRkNBSktBSVFJQUpHRzJvZ0JEWUNBQ0FFUlEwQkN5QUVJQWsyQWhnZ0FpZ0NFQ0lBQkVBZ0JDQUFOZ0lRSUFBZ0JEWUNHQXNnQWlnQ0ZDSUFSUTBBSUFRZ0FEWUNGQ0FBSUFRMkFoZ0xBa0FnQTBFUFRRUkFJQUlnQXlBRmFpSUFRUU55TmdJRUlBQWdBbW9pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUlnQlVFRGNqWUNCQ0FDSUFWcUlnUWdBMEVCY2pZQ0JDQURJQVJxSUFNMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFCQm5COG9BZ0FoQVFKL1FRRWdCMEVEZG5RaUJTQUdjVVVFUUVHSUh5QUZJQVp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCaUFBSUFFMkFnZ2dCaUFCTmdJTUlBRWdBRFlDRENBQklBWTJBZ2dMUVp3ZklBUTJBZ0JCa0I4Z0F6WUNBQXNnQWtFSWFpRUFDeUFLUVJCcUpBQWdBQXZTQ3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQm1COG9BZ0JKRFFFZ0FDQUJhaUVBQWtBQ1FFR2NIeWdDQUNBQ1J3UkFJQUZCL3dGTkJFQWdBVUVEZGlFRUlBSW9BZ3dpQVNBQ0tBSUlJZ05HQkVCQmlCOUJpQjhvQWdCQmZpQUVkM0UyQWdBTUJRc2dBeUFCTmdJTUlBRWdBellDQ0F3RUN5QUNLQUlZSVFZZ0FpQUNLQUlNSWdGSEJFQWdBaWdDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFKQkZHb2lCQ2dDQUNJRFJRUkFJQUlvQWhBaUEwVU5BaUFDUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRktBSUVJZ0ZCQTNGQkEwY05Ba0dRSHlBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQlNBQU5nSUFEd3RCQUNFQkN5QUdSUTBBQWtBZ0FpZ0NIQ0lEUVFKMFFiZ2hhaUlFS0FJQUlBSkdCRUFnQkNBQk5nSUFJQUVOQVVHTUgwR01IeWdDQUVGK0lBTjNjVFlDQUF3Q0N5QUdRUkJCRkNBR0tBSVFJQUpHRzJvZ0FUWUNBQ0FCUlEwQkN5QUJJQVkyQWhnZ0FpZ0NFQ0lEQkVBZ0FTQUROZ0lRSUFNZ0FUWUNHQXNnQWlnQ0ZDSURSUTBBSUFFZ0F6WUNGQ0FESUFFMkFoZ0xJQUlnQlU4TkFDQUZLQUlFSWdGQkFYRkZEUUFDUUFKQUFrQUNRQ0FCUVFKeFJRUkFRYUFmS0FJQUlBVkdCRUJCb0I4Z0FqWUNBRUdVSDBHVUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FDUVp3ZktBSUFSdzBHUVpBZlFRQTJBZ0JCbkI5QkFEWUNBQThMUVp3ZktBSUFJQVZHQkVCQm5COGdBallDQUVHUUgwR1FIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQUlBSnFJQUEyQWdBUEN5QUJRWGh4SUFCcUlRQWdBVUgvQVUwRVFDQUJRUU4ySVFRZ0JTZ0NEQ0lCSUFVb0FnZ2lBMFlFUUVHSUgwR0lIeWdDQUVGK0lBUjNjVFlDQUF3RkN5QURJQUUyQWd3Z0FTQUROZ0lJREFRTElBVW9BaGdoQmlBRklBVW9BZ3dpQVVjRVFFR1lIeWdDQUJvZ0JTZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQVZCRkdvaUJDZ0NBQ0lEUlFSQUlBVW9BaEFpQTBVTkFpQUZRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGSUFGQmZuRTJBZ1FnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUF3REMwRUFJUUVMSUFaRkRRQUNRQ0FGS0FJY0lnTkJBblJCdUNGcUlnUW9BZ0FnQlVZRVFDQUVJQUUyQWdBZ0FRMEJRWXdmUVl3ZktBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0JVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FGS0FJUUlnTUVRQ0FCSUFNMkFoQWdBeUFCTmdJWUN5QUZLQUlVSWdORkRRQWdBU0FETmdJVUlBTWdBVFlDR0FzZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FDQUNRWndmS0FJQVJ3MEFRWkFmSUFBMkFnQVBDeUFBUWY4QlRRUkFJQUJCZUhGQnNCOXFJUUVDZjBHSUh5Z0NBQ0lEUVFFZ0FFRURkblFpQUhGRkJFQkJpQjhnQUNBRGNqWUNBQ0FCREFFTElBRW9BZ2dMSVFBZ0FTQUNOZ0lJSUFBZ0FqWUNEQ0FDSUFFMkFnd2dBaUFBTmdJSUR3dEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBSWdBellDSENBQ1FnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQUNRRUdNSHlnQ0FDSUVRUUVnQTNRaUIzRkZCRUJCakI4Z0JDQUhjallDQUNBQklBSTJBZ0FnQWlBQk5nSVlEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQVFOQUlBRWlCQ2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBU0FEUVFGMElRTWdCQ0FCUVFSeGFpSUhRUkJxS0FJQUlnRU5BQXNnQnlBQ05nSVFJQUlnQkRZQ0dBc2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUVLQUlJSWdBZ0FqWUNEQ0FFSUFJMkFnZ2dBa0VBTmdJWUlBSWdCRFlDRENBQ0lBQTJBZ2dMUWFnZlFhZ2ZLQUlBUVFGcklnQkJmeUFBR3pZQ0FBc0xCQUFqQUFzR0FDQUFKQUFMRUFBakFDQUFhMEZ3Y1NJQUpBQWdBQXRLQVFGL0lBQWdBVWtFUUNBQUlBRWdBaEFDRHdzZ0FnUkFJQUFnQW1vaEF5QUJJQUpxSVFFRFFDQURRUUZySWdNZ0FVRUJheUlCTFFBQU9nQUFJQUpCQVdzaUFnMEFDd3NnQUF2OURnSVJmd0YrSXdCQk1Hc2lCeVFBUWJoL0lRZ0NRQ0FGUlEwQUlBUXNBQUFpQ1VIL0FYRWhDd0pBSUFsQkFFZ0VRQ0FMUWY0QWEwRUJkaUlHSUFWUERRSkJiQ0VJSUF0Qi93QnJJZ3RCL3dGTERRSWdCRUVCYWlFSVFRQWhCUU5BSUFVZ0MwOEVRQ0FMSVFnZ0JpRUxEQU1GSUFBZ0JXb2dDQ0FGUVFGMmFpSUVMUUFBUVFSMk9nQUFJQUFnQlVFQmNtb2dCQzBBQUVFUGNUb0FBQ0FGUVFKcUlRVU1BUXNBQ3dBTElBVWdDMDBOQVNBSFFmOEJOZ0lFSUFZZ0IwRUVhaUFIUVFocUlBUkJBV29pRGlBTEVBd2lCRUdJZjBzRVFDQUVJUWdNQWd0QlZDRUlJQWNvQWdnaUVFRUdTdzBCSUFjb0FnUWlFVUVCZENJSlFRSnFyVUlCSUJDdGhpSVlRUUVnRUhRaURVRUJhaUlGclVJQ2hueDhRZ3Q4UXZ6Ly8vLy8vLy8vL3dDRFF1UUNWZzBCUVZJaENDQVJRZjhCU3cwQklBMUJmM05CQW5SQjVBSnFyU0FSUVFGcUloVkJBWFN0SUJoOFFnaDhWQTBCSUFzZ0JHc2hGaUFFSUE1cUlSY2dCa0dBQkdvaUVpQUZRUUowYWlJUklBbHFRUUpxSVE0Z0JrR0VCR29oRTBHQWdBSWdFSFJCRUhZaENVRUFJUVZCQVNFUElBMUJBV3NpRkNFS0EwQWdCU0FWUmtVRVFBSkFJQVlnQlVFQmRDSUlhaThCQUNJRVFmLy9BMFlFUUNBVElBcEJBblJxSUFVNkFBSWdDa0VCYXlFS1FRRWhCQXdCQ3lBUFFRQWdDU0FFd1VvYklROExJQWdnRVdvZ0JEc0JBQ0FGUVFGcUlRVU1BUXNMSUFZZ0R6c0JnZ1FnQmlBUU93R0FCQUpBSUFvZ0ZFWUVRQ0FOUVFOMklRaENBQ0VZUVFBaER3TkFJQXdnRlVZRVFDQUlJQTFCQVhacVFRTnFJZ2xCQVhRaENFRUFJUVJCQUNFS0EwQkJBQ0VGSUFvZ0RVOE5CQU5BSUFWQkFrWkZCRUFnRXlBRklBbHNJQVJxSUJSeFFRSjBhaUFPSUFVZ0NtcHFMUUFBT2dBQ0lBVkJBV29oQlF3QkN3c2dDa0VDYWlFS0lBUWdDR29nRkhFaEJBd0FDd0FGSUFZZ0RFRUJkR291QVFBaENTQU9JQTlxSWdRZ0dEY0FBRUVJSVFVRFFDQUZJQWxPUlFSQUlBUWdCV29nR0RjQUFDQUZRUWhxSVFVTUFRc0xJQmhDZ1lLRWlKQ2d3SUFCZkNFWUlBeEJBV29oRENBSklBOXFJUThNQVFzQUN3QUxJQTFCQTNZZ0RVRUJkbXBCQTJvaENFRUFJUVVEUUNBTUlCVkdSUVJBUVFBaENTQUdJQXhCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQUpSa1VFUUNBVElBVkJBblJxSUF3NkFBSURRQ0FGSUFocUlCUnhJZ1VnQ2tzTkFBc2dDVUVCYWlFSkRBRUxDeUFNUVFGcUlRd01BUXNMUVg4aENDQUZEUUlMSUJCQkFXb2hDRUVBSVFVRFFDQUZJQTFHUlFSQUlCRWdFeUFGUVFKMGFpSU9MUUFDUVFGMGFpSUVJQVF2QVFBaUNVRUJhanNCQUNBT0lBZ2dDV2RCWUhOcUlnUTZBQU1nRGlBSklBUjBJQTFyT3dFQUlBVkJBV29oQlF3QkN3c0NRQUpBSUFZdkFZSUVCRUFnQjBFY2FpSUVJQmNnRmhBTklnaEJpSDlMRFFJZ0IwRVVhaUFFSUJJUURpQUhRUXhxSUFRZ0VoQU9RUUFoQlFOQUlBZEJIR29pQkJBUElBVkIrd0ZMY2cwQ0lBQWdCV29pQmlBSFFSUnFJQVFRRURvQUFDQUdJQWRCREdvZ0JCQVFPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVTUF3VWdBQ0FFYWlBSFFSUnFJQWRCSEdvaUJCQVFPZ0FBSUFZZ0IwRU1haUFFRUJBNkFBTWdCVUVFYWlFRkRBRUxBQXNBQ3lBSFFSeHFJZ1FnRnlBV0VBMGlDRUdJZjBzTkFTQUhRUlJxSUFRZ0VoQU9JQWRCREdvZ0JDQVNFQTVCQUNFRkEwQWdCMEVjYWlJRUVBOGdCVUg3QVV0eVJRUkFJQUFnQldvaUJpQUhRUlJxSUFRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVUZJQUFnQkdvZ0IwRVVhaUFIUVJ4cUlnUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQURJQVZCQkdvaEJRd0NDd3NMQW44RFFFRzZmeUVJSUFWQi9RRkxEUU1nQUNBRmFpSUdJQWRCRkdvZ0IwRWNhaUlKRUJFNkFBQWdCa0VCYWlFRUlBa1FEMEVEUmdSQUlBZEJER29oQ0VFQ0RBSUxJQVZCL0FGTERRTWdCaUFIUVF4cUlBZEJIR29pQkJBUk9nQUJJQVZCQW1vaEJTQUVFQTlCQTBjTkFBc2dBQ0FGYWlFRUlBZEJGR29oQ0VFREN5QUVJQWdnQjBFY2FoQVJPZ0FBSUFacUlBQnJJUWdNQVFzQ2Z3TkFRYnAvSVFnZ0JVSDlBVXNOQWlBQUlBVnFJZ1lnQjBFVWFpQUhRUnhxSWdrUUVEb0FBQ0FHUVFGcUlRUWdDUkFQUVFOR0JFQWdCMEVNYWlFSVFRSU1BZ3NnQlVIOEFVc05BaUFHSUFkQkRHb2dCMEVjYWlJRUVCQTZBQUVnQlVFQ2FpRUZJQVFRRDBFRFJ3MEFDeUFBSUFWcUlRUWdCMEVVYWlFSVFRTUxJQVFnQ0NBSFFSeHFFQkE2QUFBZ0Jtb2dBR3NoQ0FzZ0NFR0lmMHNOQVFzZ0NDRUVRUUFoQlNBQlFRQkJOQkFESVFsQkFDRUtBMEFnQkNBRlJ3UkFJQUFnQldvaUJpMEFBQ0lCUVF0TEJFQkJiQ0VJREFNRklBa2dBVUVDZEdvaUFTQUJLQUlBUVFGcU5nSUFJQVZCQVdvaEJVRUJJQVl0QUFCMFFRRjFJQXBxSVFvTUFnc0FDd3RCYkNFSUlBcEZEUUFnQ21jaUJVRWZjeUlCUVF0TERRQWdBMEVnSUFWck5nSUFRUUZCQWlBQmRDQUtheUlEWjBFZmN5SUJkQ0FEUncwQUlBQWdCR29nQVVFQmFpSUFPZ0FBSUFrZ0FFRUNkR29pQUNBQUtBSUFRUUZxTmdJQUlBa29BZ1FpQUVFQ1NTQUFRUUZ4Y2cwQUlBSWdCRUVCYWpZQ0FDQUxRUUZxSVFnTElBZEJNR29rQUNBSUM2QUZBUXgvSXdCQkVHc2lEQ1FBQW44Z0JFRUhUUVJBSUF4Q0FEY0RDQ0FNUVFocUlnVWdBeUFFRUFJYVFXd2dBQ0FCSUFJZ0JVRUlFQXdpQUNBQUlBUkxHeUFBSUFCQmlYOUpHd3dCQ3lBQVFRQWdBU2dDQUVFQmFpSU5RUUYwRUFNaEQwRlVJQU1vQUFBaUJrRVBjU0lBUVFwTERRQWFJQUlnQUVFRmFqWUNBQ0FESUFScUlnSkJCR3NoQnlBQ1FRZHJJUXNnQUVFR2FpRU9RUVFoQWlBR1FRUjJJUVZCSUNBQWRDSUlRUUZ5SVFsQkFDRUFRUUVoQmlBRElRUURRQUpBSUFaQkFYRkZCRUFEUUNBRlFYOXpRWUNBZ0lCNGNtZ2lCa0VZU1VVRVFDQUFRU1JxSVFBZ0JDQUxUUVIvSUFSQkEyb0ZJQVFnQzJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTElBSWdCa0VlY1NJS2FrRUNhaUVDSUFaQkFYWkJBMndnQUdvZ0JTQUtka0VEY1dvaUFDQU5UdzBCQW44Z0JDQUxTeUFDUVFOMklBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFRZ0IydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTElBVWdDRUVCYTNFaUJpQUlRUUYwUVFGcklnb2dDV3NpRUVrRWZ5QU9RUUZyQlNBRklBcHhJZ1VnRUVFQUlBVWdDRTRiYXlFR0lBNExJUVVnRHlBQVFRRjBhaUFHUVFGcklnbzdBUUFnQUVFQmFpRUFJQUlnQldvaEFpQUlRUUVnQm1zZ0NpQUdRUUJLR3lBSmFpSUpTZ1JBSUFsQkFrZ05BVUVnSUFsbklnVnJJUTVCQVNBRlFSOXpkQ0VJQ3lBQUlBMVBEUUFnQ2tFQVJ5RUdBbjhnQkNBTFN5QUNRUU4xSUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQUlnQkNBSGEwRURkR3BCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTFFXd2dDVUVCUncwQUdrRlFJQUFnRFVzTkFCcEJiQ0FDUVNCS0RRQWFJQUVnQUVFQmF6WUNBQ0FFSUFKQkIycEJBM1ZxSUFOckN5QU1RUkJxSkFBTDhnRUJBWDhnQWtVRVFDQUFRZ0EzQWdBZ0FFRUFOZ0lRSUFCQ0FEY0NDRUc0Znc4TElBQWdBVFlDRENBQUlBRkJCR28yQWhBZ0FrRUVUd1JBSUFBZ0FTQUNhaUlCUVFScklnTTJBZ2dnQUNBREtBQUFOZ0lBSUFGQkFXc3RBQUFpQVFSQUlBQWdBV2RCRjJzMkFnUWdBZzhMSUFCQkFEWUNCRUYvRHdzZ0FDQUJOZ0lJSUFBZ0FTMEFBQ0lETmdJQUFrQUNRQUpBSUFKQkFtc09BZ0VBQWdzZ0FDQUJMUUFDUVJCMElBTnlJZ00yQWdBTElBQWdBUzBBQVVFSWRDQURhallDQUFzZ0FTQUNha0VCYXkwQUFDSUJSUVJBSUFCQkFEWUNCRUZzRHdzZ0FDQUJaeUFDUVFOMGEwRUphallDQkNBQ0MwUUJBbjhnQVNBQ0x3RUFJZ01nQVNnQ0JHb2lCRFlDQkNBQUlBTkJBblJCb0IxcUtBSUFJQUVvQWdCQkFDQUVhM1p4TmdJQUlBRVFEeG9nQUNBQ1FRUnFOZ0lFQzU4QkFRUi9RUU1oQVNBQUtBSUVJZ0pCSUUwRVFDQUFLQUlJSWdFZ0FDZ0NFRThFUUNBQUlBSkJCM0UyQWdRZ0FDQUJJQUpCQTNacklnSTJBZ2dnQUNBQ0tBQUFOZ0lBUVFBUEN5QUFLQUlNSWdNZ0FVWUVRRUVCUVFJZ0FrRWdTUnNQQ3lBQUlBRWdBU0FEYXlBQ1FRTjJJZ1FnQVNBRWF5QURTU0lCR3lJRGF5SUVOZ0lJSUFBZ0FpQURRUU4wYXpZQ0JDQUFJQVFvQUFBMkFnQUxJQUVMU0FFRWZ5QUFLQUlFSUFBb0FnQkJBblJxSWdJdEFBSWdBaThCQUNFRUlBRWdBU2dDQkNJRklBSXRBQU1pQW1vMkFnUWdBQ0FFSUFFb0FnQWdCWFJCQUNBQ2EzWnFOZ0lBQzFJQkJIOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJQUl2QVFBaEJDQUJJQUl0QUFNaUFpQUJLQUlFYWlJRk5nSUVJQUFnQkNBQ1FRSjBRYUFkYWlnQ0FDQUJLQUlBUVFBZ0JXdDJjV28yQWdBTENBQWdBRUdJZjBzTEdnQWdBQVJBSUFFRVFDQUNJQUFnQVJFQ0FBOExJQUFRQmdzTHBnZ0NEWDhCZmlNQVFSQnJJZ2trQUNBSlFRQTJBZ3dnQ1VFQU5nSUlBbjhDUUNBRFFlZ0phaUFESUFsQkNHb2dDVUVNYWlBQklBSWdBMEdBQVdvUUN5SVBRWWgvU3cwQVFWUWdDU2dDRENJRUlBQW9BZ0FpQVVIL0FYRkJBV3BMRFFFYUlBQkJCR29oQ3lBQUlBRkIvNEdBZUhFZ0JFRVFkRUdBZ1B3SGNYSTJBZ0JCZnlBRUlBUkJBRWdiUVFGcUlRQkJBQ0VCSUFrb0FnZ2hCVUVBSVFJRFFDQUFJQUpHQkVBZ0JVRURheUVCUVFBaEFBTkFBa0JCQUNFQ0lBQWdBVTRFUUFOQUlBQWdCVTROQWlBRElBQWdBMnBCNkFscUxRQUFRUUowYWtGQWF5SUJJQUVvQWdBaUFVRUJhallDQUNBQklBTnFJQUE2QU9nSElBQkJBV29oQUF3QUN3QUZBMEFnQWtFRVJrVUVRQ0FESUFNZ0FDQUNhaUlIYWtIb0NXb3RBQUJCQW5ScVFVQnJJZ2dnQ0NnQ0FDSUlRUUZxTmdJQUlBTWdDR29nQnpvQTZBY2dBa0VCYWlFQ0RBRUxDeUFBUVFScUlRQU1BZ3NBQ3dzZ0JFRUJhaUVPSUFNb0FnQWhCMEVBSVFCQkFTRUlBMEFnQ0NBT1JnMERJQTRnQ0dzaEJDQURJQWhCQW5ScUtBSUFJUVVDUUFKQUFrQUNRQUpBQWtCQkFTQUlkRUVCZFNJTlFRRnJEZ2dBQVFRQ0JBUUVBd1FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFBSVFFRFFDQUNJQVpHRFFVZ0F5QUNJQWRxYWkwQTZBY2hDaUFMSUFGQkFYUnFJZ3dnQkRvQUFTQU1JQW82QUFBZ0FrRUJhaUVDSUFGQkFXb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQ2lBQUlRRURRQ0FDSUFwR0RRUWdDeUFCUVFGMGFpSUdJQU1nQWlBSGFtb3RBT2dISWd3NkFBSWdCaUFFT2dBQklBWWdERG9BQUNBR0lBUTZBQU1nQWtFQmFpRUNJQUZCQW1vaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFFUVFoMFFZRCtBM0VoQkNBQUlRRURRQ0FDSUFaR0RRTWdDeUFCUVFGMGFpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK053QUFJQUpCQVdvaEFpQUJRUVJxSVFFTUFBc0FDMEVBSVFJZ0JVRUFJQVZCQUVvYklRWWdCRUVJZEVHQS9nTnhJUVFnQUNFQkEwQWdBaUFHUmcwQ0lBc2dBVUVCZEdvaUNpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0loRTNBQWdnQ2lBUk53QUFJQUpCQVdvaEFpQUJRUWhxSVFFTUFBc0FDMEVBSVFFZ0JVRUFJQVZCQUVvYklRb2dCRUVJZEVHQS9nTnhJUXdnQUNFRUEwQWdBU0FLUmcwQklBc2dCRUVCZEdvaEVDQU1JQU1nQVNBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0lSRkJBQ0VDQTBBZ0FpQU5Ua1VFUUNBUUlBSkJBWFJxSWdZZ0VUY0FHQ0FHSUJFM0FCQWdCaUFSTndBSUlBWWdFVGNBQUNBQ1FSQnFJUUlNQVFzTElBRkJBV29oQVNBRUlBMXFJUVFNQUFzQUN5QUlRUUZxSVFnZ0JTQUhhaUVISUFVZ0RXd2dBR29oQUF3QUN3QUZJQU1nQWtFQ2RHb2lCMEZBYXlBQk5nSUFJQUpCQVdvaEFpQUhLQUlBSUFGcUlRRU1BUXNBQ3dBTElBOExJQWxCRUdva0FBdnlBZ0VHZnlNQVFTQnJJZ1VrQUNBRUtBSUFJUVlnQlVFTWFpQUNJQU1RRFNJRFFZaC9UUVJBSUFSQkJHb2hBaUFBSUFGcUlnbEJBMnNoQkVFQUlBWkJFSFpyUVI5eElRTURRQ0FGUVF4cUVBOGdBQ0FFVDNKRkJFQWdBaUFGS0FJTUlnWWdCU2dDRUNJSGRDQURka0VCZEdvaUNDMEFBU0VLSUFBZ0NDMEFBRG9BQUNBQ0lBWWdCeUFLYWlJR2RDQURka0VCZEdvaUJ5MEFBQ0VJSUFVZ0JpQUhMUUFCYWpZQ0VDQUFJQWc2QUFFZ0FFRUNhaUVBREFFTEN3TkFJQVZCREdvUUR5RUhJQVVvQWd3aEJpQUZLQUlRSVFRZ0FDQUpUeUFIY2tVRVFDQUNJQVlnQkhRZ0EzWkJBWFJxSWdZdEFBQWhCeUFGSUFRZ0JpMEFBV28yQWhBZ0FDQUhPZ0FBSUFCQkFXb2hBQXdCQ3dzRFFDQUFJQWxQUlFSQUlBSWdCaUFFZENBRGRrRUJkR29pQnkwQUFTRUlJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdCQ0FJYWlFRURBRUxDMEZzUVd3Z0FTQUZLQUlVSUFVb0FoaEhHeUFFUVNCSEd5RURDeUFGUVNCcUpBQWdBd3ZQRkFFamZ5TUFRZEFBYXlJRkpBQkJiQ0VKQWtBZ0EwRUtTUTBBQWtBZ0F5QUNMd0FFSWdjZ0FpOEFBQ0lJSUFJdkFBSWlEV3BxUVFacUlneEpEUUFnQkM4QkFpRUdJQVZCUEdvZ0FrRUdhaUlDSUFnUURTSUpRWWgvU3cwQklBVkJLR29nQWlBSWFpSUNJQTBRRFNJSlFZaC9TdzBCSUFWQkZHb2dBaUFOYWlJQ0lBY1FEU0lKUVloL1N3MEJJQVVnQWlBSGFpQURJQXhyRUEwaUNVR0lmMHNOQVNBRVFRUnFJUW9nQUNBQmFpSWZRUU5ySVNCQkFDQUdhMEVmY1NFTElBVW9BZ2doRVNBRktBSWNJUklnQlNnQ01DRVRJQVVvQWtRaEZDQUZLQUlFSVFrZ0JTZ0NHQ0VOSUFVb0Fpd2hEQ0FGS0FKQUlRWWdCU2dDRUNFaElBVW9BaVFoSWlBRktBSTRJU01nQlNnQ1RDRWtJQVVvQWdBaEZTQUZLQUlVSVJZZ0JTZ0NLQ0VYSUFVb0Fqd2hHRUVCSVE4Z0FDQUJRUU5xUVFKMklnUnFJZ01nQkdvaUFpQUVhaUlaSVFRZ0FpRUlJQU1oQndOQUlBOUJBWEZGSUFRZ0lFOXlSUVJBSUFBZ0NpQVlJQVowSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEdpQU9MUUFESVJBZ0J5QUtJQmNnREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnRGkwQUFpRWJJQTR0QUFNaER5QUlJQW9nRmlBTmRDQUxka0VDZEdvaURpOEJBRHNBQUNBT0xRQUNJUndnRGkwQUF5RWRJQVFnQ2lBVklBbDBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloSGlBT0xRQURJUTRnQUNBUWFpSWxJQW9nR0NBR0lCcHFJZ1owSUF0MlFRSjBhaUlRTHdFQU93QUFJQkF0QUFJZ0VDMEFBeUVtSUFjZ0Qyb2lKeUFLSUJjZ0RDQWJhaUlhZENBTGRrRUNkR29pQnk4QkFEc0FBQ0FITFFBQ0lRd2dCeTBBQXlFUUlBZ2dIV29pR3lBS0lCWWdEU0FjYWlJUGRDQUxka0VDZEdvaUNDOEJBRHNBQUNBSUxRQUNJUTBnQ0MwQUF5RWNJQVFnRG1vaUhTQUtJQlVnQ1NBZWFpSU9kQ0FMZGtFQ2RHb2lDUzhCQURzQUFDQUdhaUVBUVFNaEJ3Si9JQlFnSkVrRVFDQUFJUVpCQXd3QkN5QUFRUWR4SVFZZ0ZDQUFRUU4yYXlJVUtBQUFJUmhCQUFzZ0NTMEFBeUVlSUFrdEFBSWhDQ0FNSUJwcUlRQWdFeUFqU1FSL0lBQUZJQk1nQUVFRGRtc2lFeWdBQUNFWFFRQWhCeUFBUVFkeEN5RU1JQTBnRDJvaEFDQUhjaUVKUVFNaER3Si9JQklnSWtrRVFDQUFJUTFCQXd3QkN5QUFRUWR4SVEwZ0VpQUFRUU4yYXlJU0tBQUFJUlpCQUFzZ0NDQU9haUVBSUFseUlCRWdJVWtFZnlBQUJTQVJJQUJCQTNackloRW9BQUFoRlVFQUlROGdBRUVIY1FzaENTQWxJQ1pxSVFBZ0VDQW5haUVISUJzZ0hHb2hDQ0FkSUI1cUlRUWdEM0pGSVE4TUFRc0xJQVVnRERZQ0xDQUZJQVkyQWtBZ0JTQU5OZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFJZ0Iwa2dBQ0FEUzNJTkFFRnNJUWtnQ0NBWlN3MEJJQU5CQTJzaENRTkFJQVZCUEdvUUQwVWdBQ0FKU1hFRVFDQUFJQW9nQlNnQ1BDSU5JQVVvQWtBaURIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0FDQU9MUUFEYWlJR0lBb2dEU0FNSUE0dEFBSnFJZ0IwSUF0MlFRSjBhaUlNTHdFQU93QUFJQVVnQUNBTUxRQUNhallDUUNBR0lBd3RBQU5xSVFBTUFRVWdBMEVDYXlFTUEwQWdCVUU4YWhBUElRWWdCU2dDUENFTklBVW9Ba0FoQ1NBQUlBeExJQVp5UlFSQUlBQWdDaUFOSUFsMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0NTQUdMUUFDYWpZQ1FDQUFJQVl0QUFOcUlRQU1BUXNMQTBBZ0FDQU1TMFVFUUNBQUlBb2dEU0FKZENBTGRrRUNkR29pQmk4QkFEc0FBQ0FBSUFZdEFBTnFJUUFnQ1NBR0xRQUNhaUVKREFFTEN3SkFJQUFnQTA4TkFDQUFJQW9nRFNBSmRDQUxkaUlBUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUpJQU10QUFKcUlRa01BUXNnQ1VFZlN3MEFRU0FnQ1NBS0lBQkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRa0xJQUpCQTJzaERBTkFJQVZCS0dvUUQwVWdCeUFNU1hFRVFDQUhJQW9nQlNnQ0tDSUdJQVVvQWl3aUFIUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0J5QU5MUUFEYWlJRElBb2dCaUFBSUEwdEFBSnFJZ0IwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQUNBR0xRQUNhallDTENBRElBWXRBQU5xSVFjTUFRVWdBa0VDYXlFR0EwQWdCVUVvYWhBUElRTWdCU2dDS0NFTUlBVW9BaXdoQUNBR0lBZEpJQU55UlFSQUlBY2dDaUFNSUFCMElBdDJRUUowYWlJREx3RUFPd0FBSUFVZ0FDQURMUUFDYWpZQ0xDQUhJQU10QUFOcUlRY01BUXNMQTBBZ0JpQUhTVVVFUUNBSElBb2dEQ0FBZENBTGRrRUNkR29pQXk4QkFEc0FBQ0FISUFNdEFBTnFJUWNnQUNBRExRQUNhaUVBREFFTEN3SkFJQUlnQjAwTkFDQUhJQW9nRENBQWRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUFJQU10QUFKcUlRQU1BUXNnQUVFZlN3MEFRU0FnQUNBS0lBSkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRQUxJQmxCQTJzaERBTkFJQVZCRkdvUUQwVWdDQ0FNU1hFRVFDQUlJQW9nQlNnQ0ZDSUdJQVVvQWhnaUFuUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0NDQU5MUUFEYWlJRElBb2dCaUFDSUEwdEFBSnFJZ0owSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQWlBR0xRQUNhallDR0NBRElBWXRBQU5xSVFnTUFRVWdHVUVDYXlFREEwQWdCVUVVYWhBUElRSWdCU2dDRkNFR0lBVW9BaGdoQnlBRElBaEpJQUp5UlFSQUlBZ2dDaUFHSUFkMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFVZ0J5QUNMUUFDYWpZQ0dDQUlJQUl0QUFOcUlRZ01BUXNMQTBBZ0F5QUlTVVVFUUNBSUlBb2dCaUFIZENBTGRrRUNkR29pQWk4QkFEc0FBQ0FJSUFJdEFBTnFJUWdnQnlBQ0xRQUNhaUVIREFFTEN3SkFJQWdnR1U4TkFDQUlJQW9nQmlBSGRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUhJQU10QUFKcUlRY01BUXNnQjBFZlN3MEFRU0FnQnlBS0lBSkJBblJxTFFBQ2FpSUNJQUpCSUU4YklRY0xBMEFnQlJBUFJTQUVJQ0JKY1FSQUlBUWdDaUFGS0FJQUlnWWdCU2dDQkNJQ2RDQUxka0VDZEdvaURDOEJBRHNBQUNBRUlBd3RBQU5xSWdNZ0NpQUdJQUlnREMwQUFtb2lBblFnQzNaQkFuUnFJZ1F2QVFBN0FBQWdCU0FDSUFRdEFBSnFOZ0lFSUFNZ0JDMEFBMm9oQkF3QkJTQWZRUUpySVFNRFFDQUZFQThoQWlBRktBSUFJUVlnQlNnQ0JDRUlJQU1nQkVrZ0FuSkZCRUFnQkNBS0lBWWdDSFFnQzNaQkFuUnFJZ0l2QVFBN0FBQWdCU0FJSUFJdEFBSnFOZ0lFSUFRZ0FpMEFBMm9oQkF3QkN3c0RRQ0FESUFSSlJRUkFJQVFnQ2lBR0lBaDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBUWdBaTBBQTJvaEJDQUlJQUl0QUFKcUlRZ01BUXNMQWtBZ0JDQWZUdzBBSUFRZ0NpQUdJQWgwSUF0MklnSkJBblJxSWdNdEFBQTZBQUFnQXkwQUEwRUJSZ1JBSUFnZ0F5MEFBbW9oQ0F3QkN5QUlRUjlMRFFCQklDQUlJQW9nQWtFQ2RHb3RBQUpxSWdJZ0FrRWdUeHNoQ0F0QmJFRnNRV3hCYkVGc1FXeEJiRUZzSUFFZ0NFRWdSeHNnQlNnQ0NDQUZLQUlNUnhzZ0IwRWdSeHNnQlNnQ0hDQUZLQUlnUnhzZ0FFRWdSeHNnQlNnQ01DQUZLQUkwUnhzZ0NVRWdSeHNnQlNnQ1JDQUZLQUpJUnhzaENRd0pDd0FMQUFzQUN3QUxBQXNBQ3dBTEFBdEJiQ0VKQ3lBRlFkQUFhaVFBSUFrTDdCQUJIbjhqQUVIUUFHc2lCU1FBUVd3aENRSkFJQU5CQ2trTkFBSkFJQU1nQWk4QUJDSUdJQUl2QUFBaUJ5QUNMd0FDSWdocWFrRUdhaUlPU1EwQUlBUXZBUUloRHlBRlFUeHFJQUpCQm1vaUFpQUhFQTBpQ1VHSWYwc05BU0FGUVNocUlBSWdCMm9pQWlBSUVBMGlDVUdJZjBzTkFTQUZRUlJxSUFJZ0NHb2lBaUFHRUEwaUNVR0lmMHNOQVNBRklBSWdCbW9nQXlBT2F4QU5JZ2xCaUg5TERRRWdCRUVFYWlFS0lBQWdBV29pSEVFRGF5RWRRUUFnRDJ0QkgzRWhDeUFGS0FJSUlSRWdCU2dDSENFU0lBVW9BakFoRXlBRktBSkVJUlFnQlNnQ0JDRUpJQVVvQWhnaEJpQUZLQUlzSVFjZ0JTZ0NRQ0VJSUFVb0FoQWhIaUFGS0FJa0lSOGdCU2dDT0NFZ0lBVW9Ba3doSVNBRktBSUFJUlVnQlNnQ0ZDRVdJQVVvQWlnaEZ5QUZLQUk4SVJoQkFTRU5JQUFnQVVFRGFrRUNkaUlDYWlJT0lBSnFJZzhnQW1vaUdTRUVJQThoQWlBT0lRTURRQ0FOUlNBRUlCMVBja1VFUUNBS0lCZ2dDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBQWdDaUFYSUFkMElBdDJRUUYwYWlJTUxRQUJJUkFnQXlBTUxRQUFPZ0FBSUFvZ0ZpQUdkQ0FMZGtFQmRHb2lEQzBBQVNFYUlBSWdEQzBBQURvQUFDQUtJQlVnQ1hRZ0MzWkJBWFJxSWd3dEFBRWhHeUFFSUF3dEFBQTZBQUFnQ2lBWUlBZ2dEV29pQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUVnQ2lBWElBY2dFR29pQjNRZ0MzWkJBWFJxSWd3dEFBRWhFQ0FESUF3dEFBQTZBQUVnQ2lBV0lBWWdHbW9pREhRZ0MzWkJBWFJxSWdZdEFBRWhHaUFDSUFZdEFBQTZBQUVnQ2lBVklBa2dHMm9pRzNRZ0MzWkJBWFJxSWdrdEFBRWhJaUFFSUFrdEFBQTZBQUVnQ0NBTmFpRUdRUU1oQ1FKL0lCUWdJVWtFUUVFRElRMGdCZ3dCQ3lBVUlBWkJBM1pySWhRb0FBQWhHRUVBSVEwZ0JrRUhjUXNoQ0NBSElCQnFJUVlnRXlBZ1NRUi9JQVlGSUJNZ0JrRURkbXNpRXlnQUFDRVhRUUFoQ1NBR1FRZHhDeUVISUF3Z0dtb2hEQ0FKSUExeUlSQkJBeUVOQW44Z0VpQWZTUVJBSUF3aEJrRUREQUVMSUF4QkIzRWhCaUFTSUF4QkEzWnJJaElvQUFBaEZrRUFDeUFiSUNKcUlRd2dFSEloRUNBUklCNUpCSDhnREFVZ0VTQU1RUU4yYXlJUktBQUFJUlZCQUNFTklBeEJCM0VMSVFrZ0JFRUNhaUVFSUFKQkFtb2hBaUFEUVFKcUlRTWdBRUVDYWlFQUlBMGdFSEpGSVEwTUFRc0xJQVVnQnpZQ0xDQUZJQWcyQWtBZ0JTQUdOZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFBZ0Rrc2dBeUFQUzNJTkFFRnNJUWtnQWlBWlN3MEJJQTVCQTJzaENRTkFJQVZCUEdvUUR5QUFJQWxQY2tVRVFDQUtJQVVvQWp3aUJpQUZLQUpBSWdkMElBdDJRUUYwYWlJSUxRQUJJUXdnQUNBSUxRQUFPZ0FBSUFvZ0JpQUhJQXhxSWdaMElBdDJRUUYwYWlJSExRQUFJUWdnQlNBR0lBY3RBQUZxTmdKQUlBQWdDRG9BQVNBQVFRSnFJUUFNQVFzTEEwQWdCVUU4YWhBUElRY2dCU2dDUENFR0lBVW9Ba0FoQ1NBQUlBNVBJQWR5UlFSQUlBb2dCaUFKZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQ1NBR0xRQUJhallDUUNBQUlBYzZBQUFnQUVFQmFpRUFEQUVMQ3dOQUlBQWdEazlGQkVBZ0NpQUdJQWwwSUF0MlFRRjBhaUlITFFBQklBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0NXb2hDUXdCQ3dzZ0QwRURheUVBQTBBZ0JVRW9haEFQSUFBZ0EwMXlSUVJBSUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQURJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaXdnQXlBSU9nQUJJQU5CQW1vaEF3d0JDd3NEUUNBRlFTaHFFQThoQnlBRktBSW9JUVlnQlNnQ0xDRUFJQU1nRDA4Z0IzSkZCRUFnQ2lBR0lBQjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQUFJQVl0QUFGcU5nSXNJQU1nQnpvQUFDQURRUUZxSVFNTUFRc0xBMEFnQXlBUFQwVUVRQ0FLSUFZZ0FIUWdDM1pCQVhScUlnY3RBQUVoQ0NBRElBY3RBQUE2QUFBZ0EwRUJhaUVESUFBZ0NHb2hBQXdCQ3dzZ0dVRURheUVEQTBBZ0JVRVVhaEFQSUFJZ0EwOXlSUVJBSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQUNJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaGdnQWlBSU9nQUJJQUpCQW1vaEFnd0JDd3NEUUNBRlFSUnFFQThoQnlBRktBSVVJUVlnQlNnQ0dDRURJQUlnR1U4Z0IzSkZCRUFnQ2lBR0lBTjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQURJQVl0QUFGcU5nSVlJQUlnQnpvQUFDQUNRUUZxSVFJTUFRc0xBMEFnQWlBWlQwVUVRQ0FLSUFZZ0EzUWdDM1pCQVhScUlnY3RBQUVoQ0NBQ0lBY3RBQUE2QUFBZ0FrRUJhaUVDSUFNZ0NHb2hBd3dCQ3dzRFFDQUZFQThnQkNBZFQzSkZCRUFnQ2lBRktBSUFJZ0lnQlNnQ0JDSUdkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUtJQUlnQmlBSWFpSUNkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdBaUFHTFFBQmFqWUNCQ0FFSUFjNkFBRWdCRUVDYWlFRURBRUxDd05BSUFVUUR5RUhJQVVvQWdBaEJpQUZLQUlFSVFJZ0JDQWNUeUFIY2tVRVFDQUtJQVlnQW5RZ0MzWkJBWFJxSWdZdEFBQWhCeUFGSUFJZ0JpMEFBV28yQWdRZ0JDQUhPZ0FBSUFSQkFXb2hCQXdCQ3dzRFFDQUVJQnhQUlFSQUlBb2dCaUFDZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FFUVFGcUlRUWdBaUFJYWlFQ0RBRUxDMEZzUVd4QmJFRnNRV3hCYkVGc1FXd2dBU0FDUVNCSEd5QUZLQUlJSUFVb0FneEhHeUFEUVNCSEd5QUZLQUljSUFVb0FpQkhHeUFBUVNCSEd5QUZLQUl3SUFVb0FqUkhHeUFKUVNCSEd5QUZLQUpFSUFVb0FraEhHeUVKREFFTFFXd2hDUXNnQlVIUUFHb2tBQ0FKQzFnQkEzOENRQ0FBS0FLUTZ3RWlBVVVOQUNBQktBSUFJQUZCdE5VQmFpZ0NBQ0lDSUFGQnVOVUJhaWdDQUNJREVCTWdBZ1JBSUFNZ0FTQUNFUUlBREFFTElBRVFCZ3NnQUVFQU5nS2c2d0VnQUVJQU53T1E2d0VMNlFNQ0JIOENmaUFBUVFCQktCQURJUVFnQWtFQlFRVWdBeHNpQUVrRVFDQUFEd3NnQVVVRVFFRi9Ed3RCQVNFR0FrQUNRQ0FEUVFGR0RRQWdBeUVHSUFFb0FBQWlCVUdvNnI1cFJnMEFRWFloQXlBRlFYQnhRZERVdE1JQlJ3MEJRUWdoQXlBQ1FRaEpEUUVnQVRVQUJDRUlJQVJCQVRZQ0ZDQUVJQWczQXdCQkFBOExJQUVnQWlBR0VCb2lBeUFDU3cwQUlBUWdBellDR0VGeUlRTWdBQ0FCYWlJRlFRRnJMUUFBSWdKQkNIRU5BQ0FDUVNCeElnWkZCRUJCY0NFRElBVXRBQUFpQlVHbkFVc05BU0FGUVFkeHJVSUJJQVZCQTNaQkNtcXRoaUlJUWdPSWZpQUlmQ0VKSUFCQkFXb2hBQXNnQWtFR2RpRUZJQUpCQW5aQkFDRURBa0FDUUFKQUFrQWdBa0VEY1VFQmF3NERBQUVDQXdzZ0FDQUJhaTBBQUNFRElBQkJBV29oQUF3Q0N5QUFJQUZxTHdBQUlRTWdBRUVDYWlFQURBRUxJQUFnQVdvb0FBQWhBeUFBUVFScUlRQUxRUUZ4SVFJQ2ZnSkFBa0FDUUFKQUlBVkJBV3NPQXdFQ0F3QUxRbjhnQmtVTkF4b2dBQ0FCYWpFQUFBd0RDeUFBSUFGcU13QUFRb0FDZkF3Q0N5QUFJQUZxTlFBQURBRUxJQUFnQVdvcEFBQUxJUWdnQkNBQ05nSWdJQVFnQXpZQ0hDQUVJQWczQXdCQkFDRURJQVJCQURZQ0ZDQUVJQWdnQ1NBR0d5SUlOd01JSUFSQ2dJQUlJQWdnQ0VLQWdBaGFHejRDRUFzZ0F3dGZBUUYvUWJoL0lRTWdBVUVCUVFVZ0Foc2lBazhFZnlBQUlBSnFRUUZyTFFBQUlnQkJBM0ZCQW5SQm9CNXFLQUlBSUFKcUlBQkJCSFpCREhGQnNCNXFLQUlBYWlBQVFTQnhJZ0ZGYWlBQlFRVjJJQUJCd0FCSmNXb0ZRYmgvQ3dzTUFDQUFJQUVnQWtFQUVCa0xsd01DQlg4Q2ZpTUFRVUJxSWdRa0FBSkFBMEFnQVVFRlR3UkFBa0FnQUNnQUFFRndjVUhRMUxUQ0FVWUVRRUorSVFjZ0FVRUlTUTBFSUFBb0FBUWlBa0YzU3cwRUlBSkJDR29pQXlBQlN3MEVJQUpCZ1g5SkRRRU1CQXNnQkVFWWFpQUFJQUVRR3lFQ1FuNGdCQ2tER0VJQUlBUW9BaXhCQVVjYklBSWJJZ2RDZlZZTkF5QUhJQWg4SWdnZ0IxUkNmaUVIRFFNQ1FBSkFJQUZCQ0VrTkFDQUFLQUFBUVhCeFFkRFV0TUlCUncwQUlBQW9BQVFpQWtGM1N3MEZRYmgvSUFKQkNHb2lBaUFCSUFKSkd5RUREQUVMSUFSQkdHb2dBQ0FCRUJzaUFrR0lmMHNFUUNBQ0lRTU1BUXRCdUg4aEF5QUNEUUFnQVNBRUtBSXdJZ0pySVFVZ0FDQUNhaUVHQTBBZ0JpQUZJQVJCREdvUUhTSURRWWgvU3cwQklBTkJBMm9pQWlBRlN3UkFRYmgvSVFNTUFnc2dCU0FDYXlFRklBSWdCbW9oQmlBRUtBSVFSUTBBQ3lBRUtBSTRCSDlCdUg4aEF5QUZRUVJKRFFFZ0JrRUVhZ1VnQmdzZ0FHc2hBd3NnQTBHSWYwc05Bd3NnQVNBRGF5RUJJQUFnQTJvaEFBd0JDd3RDZmlBSUlBRWJJUWNMSUFSQlFHc2tBQ0FIQzJRQkFYOUJ1SDhoQXdKQUlBRkJBMGtOQUNBQUxRQUNJUUVnQWlBQUx3QUFJZ0JCQVhFMkFnUWdBaUFBUVFGMlFRTnhJZ00yQWdBZ0FpQUFJQUZCRUhSeVFRTjJJZ0EyQWdnQ1FBSkFJQU5CQVdzT0F3SUJBQUVMUVd3UEN5QUFJUU1MSUFNTFJBRUNmeUFCSUFJb0FnUWlBeUFCS0FJRWFpSUVOZ0lFSUFBZ0EwRUNkRUdnSFdvb0FnQWdBU2dDQUVFQUlBUnJkbkUyQWdBZ0FSQVBHaUFBSUFKQkNHbzJBZ1FMemdFQkJuOUJ1bjhoQ2dKQUlBSW9BZ1FpQ0NBQ0tBSUFJZ2xxSWcwZ0FTQUFhMHNOQUVGc0lRb2dDU0FFSUFNb0FnQWlDMnRMRFFBZ0FDQUphaUlFSUFJb0FnZ2lER3NoQWlBQUlBRkJJR3NpQUNBTElBbEJBQkFnSUFNZ0NTQUxhallDQUFKQUFrQWdCQ0FGYXlBTVR3UkFJQUloQlF3QkN5QU1JQVFnQm10TERRSWdCeUFISUFJZ0JXc2lBbW9pQVNBSWFrOEVRQ0FFSUFFZ0NCQUtHZ3dDQ3lBQ0lBaHFJUWdnQkNBQlFRQWdBbXNRQ2lBQ2F5RUVDeUFFSUFBZ0JTQUlRUUVRSUFzZ0RTRUtDeUFLQzhjRUFRSi9JQUFnQTJvaEJnSkFJQU5CQjB3RVFBTkFJQUFnQms4TkFpQUFJQUl0QUFBNkFBQWdBRUVCYWlFQUlBSkJBV29oQWd3QUN3QUxJQVJCQVVZRVFBSkFJQUFnQW1zaUJVRUhUUVJBSUFBZ0FpMEFBRG9BQUNBQUlBSXRBQUU2QUFFZ0FDQUNMUUFDT2dBQ0lBQWdBaTBBQXpvQUF5QUFJQUlnQlVFQ2RDSUZRY0FlYWlnQ0FHb2lBaWdBQURZQUJDQUNJQVZCNEI1cUtBSUFheUVDREFFTElBQWdBaWtBQURjQUFBc2dBa0VJYWlFQ0lBQkJDR29oQUFzZ0FTQUdUd1JBSUFBZ0Eyb2hBU0FFUVFGSElBQWdBbXRCRDBweVJRUkFBMEFnQUNBQ0tRQUFOd0FBSUFKQkNHb2hBaUFBUVFocUlnQWdBVWtOQUF3REN3QUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQTBFUlNRMEJJQUJCRUdvaEFBTkFJQUFnQWlrQUVEY0FBQ0FBSUFJcEFCZzNBQWdnQUNBQ0tRQWdOd0FRSUFBZ0Fpa0FLRGNBR0NBQ1FTQnFJUUlnQUVFZ2FpSUFJQUZKRFFBTERBRUxBa0FnQUNBQlN3UkFJQUFoQVF3QkN5QUJJQUJySVFVQ1FDQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUlBSWhBd05BSUFBZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQUVFSWFpSUFJQUZKRFFBTERBRUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQlVFUlNBMEFJQUJCRUdvaEFDQUNJUU1EUUNBQUlBTXBBQkEzQUFBZ0FDQURLUUFZTndBSUlBQWdBeWtBSURjQUVDQUFJQU1wQUNnM0FCZ2dBMEVnYWlFRElBQkJJR29pQUNBQlNRMEFDd3NnQWlBRmFpRUNDd05BSUFFZ0JrOE5BU0FCSUFJdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaEFnd0FDd0FMQzY0SEFnVi9BWDRqQUVHQUFXc2lFU1FBSUJFZ0F6WUNmRUYvSVE4Q1FBSkFBa0FDUUFKQUlBSU9CQUVBQXdJRUN5QUdSUVJBUWJoL0lROE1CQXRCYkNFUElBVXRBQUFpQWlBRFN3MERJQWdnQWtFQ2RDSUNhaWdDQUNFRElBSWdCMm9vQWdBaEFpQUFRUUE2QUFzZ0FFSUFOd0lBSUFBZ0FqWUNEQ0FBSUFNNkFBb2dBRUVBT3dFSUlBRWdBRFlDQUVFQklROE1Bd3NnQVNBSk5nSUFRUUFoRHd3Q0N5QUtSUVJBUVd3aER3d0NDMEVBSVE4Z0MwVWdERUVaU0hJTkFVRUlJQVIwUVFocUlRQkJBQ0VEQTBBZ0FDQURUUTBDSUFOQlFHc2hBd3dBQ3dBTFFXd2hEeUFSSUJGQi9BQnFJQkZCK0FCcUlBVWdCaEFNSWdOQmlIOUxEUUFnRVNnQ2VDSUNJQVJMRFFBZ0VTZ0NmRUVCYWlFSklBQkJDR29oQzBHQWdBSWdBblJCRUhVaEJVRUJJUkJCQVNBQ2RDSVBRUUZySWdvaEVnTkFJQWtnRGtjRVFBSkFJQkVnRGtFQmRDSUVhaThCQUNJTVFmLy9BMFlFUUNBTElCSkJBM1JxSUE0MkFnUWdFa0VCYXlFU1FRRWhEQXdCQ3lBUVFRQWdCU0FNd1VvYklSQUxJQVFnRFdvZ0REc0JBQ0FPUVFGcUlRNE1BUXNMSUFBZ0FqWUNCQ0FBSUJBMkFnQUNRQ0FLSUJKR0JFQWdEVUhxQUdvaEJrRUFJUkJCQUNFTUEwQWdDU0FRUmdSQUlBOUJBM1lnRDBFQmRtcEJBMm9pQlVFQmRDRUVRUUFoREVFQUlSSURRRUVBSVE0Z0R5QVNUUTBFQTBBZ0RrRUNSd1JBSUFzZ0JTQU9iQ0FNYWlBS2NVRURkR29nQmlBT0lCSnFhaTBBQURZQ0JDQU9RUUZxSVE0TUFRc0xJQkpCQW1vaEVpQUVJQXhxSUFweElRd01BQXNBQlNBUklCQkJBWFJxTGdFQUlRVWdCaUFNYWlJRUlCTTNBQUJCQ0NFT0EwQWdCU0FPU2dSQUlBUWdEbW9nRXpjQUFDQU9RUWhxSVE0TUFRc0xJQk5DZ1lLRWlKQ2d3SUFCZkNFVElCQkJBV29oRUNBRklBeHFJUXdNQVFzQUN3QUxJQTlCQTNZZ0QwRUJkbXBCQTJvaEJVRUFJUkJCQUNFT0EwQWdDU0FRUmcwQlFRQWhEQ0FSSUJCQkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FNUndSQUlBc2dEa0VEZEdvZ0VEWUNCQU5BSUFVZ0Rtb2dDbkVpRGlBU1N3MEFDeUFNUVFGcUlRd01BUXNMSUJCQkFXb2hFQXdBQ3dBTElBSkJBV29oQlVFQUlRd0RRQ0FNSUE5SEJFQWdEU0FMSUF4QkEzUnFJZ2tvQWdRaUJFRUJkR29pQWlBQ0x3RUFJZ1pCQVdvN0FRQWdDU0FGSUFablFXQnphaUlDT2dBRElBa2dCaUFDZENBUGF6c0JBQ0FKSUFnZ0JFRUNkQ0lDYWlnQ0FEb0FBaUFKSUFJZ0Iyb29BZ0EyQWdRZ0RFRUJhaUVNREFFTEN5QUJJQUEyQWdBZ0F5RVBDeUFSUVlBQmFpUUFJQThMN1ZvQ08zOEdmaU1BUWVBQmF5SUVKQUFDUUVHdzdBa1FCU0lGUlFSQVFVQWhCd3dCQ3lBRlFnQTNBdlRxQVNBRlFRQTJBc1RyQVNBRlFRQTJBclRyQVNBRlFnQTNBcHpyQVNBRlFRQTJBcmpwQVNBRlFRQTJBcXpzQ1NBRlFnQTNBdFRyQVNBRlFnQTNBcXpyQVNBRlFnQTNBNGpyQVNBRlFnQTNBdVRxQVNBRlFnQTNBdVRyQVNBRlFZR0FnTUFBTmdLODZ3RWdCVUlBTndLazZ3RWdCVUg4NmdGcVFRQTJBZ0FnQlVHUTZ3RnFRZ0EzQXdBZ0JSQVlJQVZCck5VQmFpRVVJQVZCK09zQmFpRWNJQVZCc09vQmFpRWlJQVZCb0RCcUlTb2dCVUdZSUdvaEt5QUZRYWpRQUdvaEhpQUZRUkJxSVN3Z0JVRUlhaUVvSUFWQkJHb2hMU0FGUWNEcEFXb2hLU0FGUVlqckFXb2dCRUdVQVdvaEx5QUVRWXdCYWlFd0lBUkJoQUZxSVRFZ0JFSGNBR29oTWlBRVFkUUFhaUV6SUFSQnpBQnFJVFFnQUNFZEFrQUNRQUpBQWtBQ1FBTkFRUUZCQlNBRktBTGs2Z0ViSVFZQ1FBTkFJQU1nQmtrTkFTQUNLQUFBUVhCeFFkRFV0TUlCUmdSQVFiaC9JUWNnQTBFSVNRMElJQUlvQUFRaURrRjNTd1JBUVhJaEJ3d0pDeUFESUE1QkNHb2lDVWtOQ0NBT1FZQi9Td1JBSUFraEJ3d0pDeUFESUFscklRTWdBaUFKYWlFQ0RBRUxDeUFGUWdBM0FxenBBU0FGUWdBM0EranBBU0FGUVFBMkFwanJBU0FGUWdBM0E0RHFBU0FGUWdNM0EvanBBU0FGUWJUcEFXcENBRGNDQUNBRlFmRHBBV3BDQURjREFDQUZRYWpRQUdvaUNVR01nSURnQURZQ0FDQUZRYXpRQVdwQjRCSXBBZ0EzQWdBZ0JVRzAwQUZxUWVnU0tBSUFOZ0lBSUFVZ0JVRVFhallDQUNBRklBVkJvREJxTmdJRUlBVWdCVUdZSUdvMkFnZ2dCU0FKTmdJTUlBVkJBVUVGSUFVb0F1VHFBUnMyQXJ6cEFRSkFJQUZGRFFBZ0JTZ0NyT2tCSWdrZ0hVWU5BQ0FGSUFrMkFyanBBU0FGSUIwMkFxenBBU0FGS0FLdzZRRWhEaUFGSUIwMkFyRHBBU0FGSUIwZ0RpQUphMm8yQXJUcEFRdEJ1SDhoQ1NBRFFRVkJDU0FGS0FMazZnRWlCaHRKRFFVZ0FrRUJRUVVnQmhzZ0JoQWFJZzVCaUg5TEJFQWdEaUVKREFVTElBTWdEa0VEYWtrTkJTQXBJQUlnRGlBR0VCa2lCa0dJZjBzRVFDQUdJUWtNQlFzZ0JnMEZBa0FDUUNBRktBS282d0ZCQVVjTkFDQUZLQUtrNndFaUNVVU5BQ0FGS0FLVTZ3RkZEUUFnQ1NnQ0JFRUJheUlISUFVb0F0enBBU0lLclVLSGxhK3ZtTGJlbTU1L2ZrTEp6OW15OGVXNjZpZUZRaGVKUXMvVzA3N1N4NnZaUW41QytmUGQ4Wm4ybWFzV2ZDSS9RaUdJSUQrRlFzL1cwNzdTeDZ2WlFuNGlQMElkaUNBL2hVTDU4OTN4bWZhWnF4WitJajlDSUlnZ1A0V25jU0VHSUFrb0FnQWhGUU5BUVFBaENBSkFJQlVnQmtFQ2RHb29BZ0FpQ1VVTkFDQUpLQUlJUVFoSkRRQWdDU2dDQkNJU0tBQUFRYmZJd3VGK1J3MEFJQklvQUFRaENBc2dDQ0FLUndSQUlBWWdCM0ZCQVdvaEJpQUlEUUVMQ3lBSlJRMEFJQVVRR0NBRlFYODJBcURyQVNBRklBazJBcFRyQVNBRklBVW9BdHpwQVNJSU5nS1k2d0VNQVFzZ0JTZ0MzT2tCSVFnTEFrQWdDRVVOQUNBRktBS1k2d0VnQ0VZTkFFRmdJUWtNQmdzQ1FDQUZLQUxnNlFFRVFDQUZJQVVvQXVqcUFTSUpSVFlDN09vQklBa05BU0FGUXZucTBORG55YUhrNFFBM0E2anFBU0FGUWdBM0E2RHFBU0FGUXMvVzA3N1N4NnZaUWpjRG1Pb0JJQVZDMXV1Qzd1cjlpZlhnQURjRGtPb0JJQVZDQURjRGlPb0JJQ0pCQUVFb0VBTWFEQUVMSUFWQkFEWUM3T29CQ3lBQklCMXFJU1VnQlNBRktRUG82UUVnRHExOE53UG82UUVnQXlBT2F5RURJQUlnRG1vaEFpQWRJUTREUUNBQ0lBTWdCRUVzYWhBZEloVkJpSDlMQkVBZ0ZTRUpEQVlMSUFOQkEyc2lOU0FWU1EwRUlBSkJBMm9oRzBGc0lRa0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRUtBSXNEZ01DQVFBVkN5QVZRZi8vQjBzTkV5QVZRUU5KRFJJZ0JTa0R5T2tCSVQ4Q1FBSkFJQnN0QUFBaUNVRURjU0lhUVFGckRnTUdBUUFIQ3lBRktBS0E2Z0VOQUVGaUlRa01GUXNnRlVFRlNRMFNJQnNvQUFBaEF3Si9Ba0FDUUFKQUlBbEJBblpCQTNFaUNVRUNhdzRDQVFJQUN5QUpRUUJISVFjZ0EwRUVka0gvQjNFaEMwRURJUVlnQTBFT2RrSC9CM0VNQWd0QkJDRUdJQU5CQkhaQi8vOEFjU0VMUVFFaEJ5QURRUkoyREFFTElBTkJCSFpCLy84UGNTSUxRWUNBQ0VzTkUwRUJJUWRCQlNFR0lBSXRBQWRCQ25RZ0EwRVdkbklMSWdnZ0Jtb2lDU0FWU3cwU0FrQWdDMEdCQmtrTkFDQUZLQUtjNndGRkRRQkJBQ0VEQTBBZ0EwR0RnQUZMRFFFZ0EwRkFheUVEREFBTEFBc2dCaUFiYWlFUElCcEJBMGNOQmlBRktBSU1JZ0l0QUFGQkNIUWhBeUFIRFFjZ0EwVU5DQ0FFUWZBQWFpQVBJQWdRRFNJRFFZaC9TdzBKSUFKQkJHb2hCaUFMSUJ4cUloSkJBMnNoQ2tFQUlBSXZBUUpyUVI5eElRY2dIQ0VEQTBBZ0JFSHdBR29RRDBVZ0F5QUtTWEVFUUNBRElBWWdCQ2dDY0NJSUlBUW9BblFpRDNRZ0IzWkJBblJxSWdJdkFRQTdBQUFnQXlBQ0xRQURhaUlESUFZZ0NDQVBJQUl0QUFKcUlnaDBJQWQyUVFKMGFpSUNMd0VBT3dBQUlBUWdDQ0FDTFFBQ2FqWUNkQ0FESUFJdEFBTnFJUU1NQVFVZ0VrRUNheUVJQTBBZ0JFSHdBR29RRHlFUElBUW9BbkFoQ2lBRUtBSjBJUUlnQXlBSVN5QVBja1VFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pQ2k4QkFEc0FBQ0FFSUFJZ0NpMEFBbW8yQW5RZ0F5QUtMUUFEYWlFRERBRUxDd05BSUFNZ0NFMEVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lEeThCQURzQUFDQURJQTh0QUFOcUlRTWdBaUFQTFFBQ2FpRUNEQUVMQ3dKQUlBTWdFazhOQUNBRElBWWdDaUFDZENBSGRrRUNkR29pQXkwQUFEb0FBQ0FETFFBRFFRRkdCRUFnQWlBRExRQUNhaUVDREFFTElBSkJIMHNOQUVFZ0lBSWdBeTBBQW1vaUFpQUNRU0JQR3lFQ0MwRnNRV3dnQ3lBRUtBSjRJQVFvQW54SEd5QUNRU0JIR3lFRERBc0xBQXNBQ3lBRUtBSTBJZ0lnSlNBT2Ewc05DaUFPUlFSQVFRQWhDU0FDRFFJTURnc2dEaUFiTFFBQUlBSVFBeG9nQWlFSkRBd0xJQlVnSlNBT2Ewc05DU0FPRFFGQkFDRUpJQlZGRFF3TFFiWi9JUWtNRVFzZ0RpQWJJQlVRQWhvZ0ZTRUpEQW9MSUJ3Z0d3Si9Ba0FDUUFKQUlBbEJBblpCQTNGQkFXc09Bd0VBQWdBTElBbEJBM1loQTBFQkRBSUxJQnN2QUFCQkJIWWhBMEVDREFFTElCVkJCRWtORGlBQ0x3QURJQUl0QUFWQkVIUnlJZ0pCajRDQUFVc05EaUFDUVFSMklRTkJBd3NpQW1vdEFBQWdBMEVnYWhBRElRa2dCU0FETmdLQTZ3RWdCU0FKTmdMdzZnRWdBa0VCYWlFSkRBVUxJQlVDZndKQUFrQUNRQ0FKUVFKMlFRTnhRUUZyRGdNQkFBSUFDeUFKUVFOMklRTkJBUXdDQ3lBYkx3QUFRUVIySVFOQkFnd0JDeUFDTHdBRElBSXRBQVZCRUhSeVFRUjJJUU5CQXdzaUFpQURhaUlKUVNCcVNRUkFJQWtnRlVzTkRTQWNJQUlnRzJvZ0F4QUNJUUlnQlNBRE5nS0E2d0VnQlNBQ05nTHc2Z0VnQWlBRGFpSUNRZ0EzQUJnZ0FrSUFOd0FRSUFKQ0FEY0FDQ0FDUWdBM0FBQU1CUXNnQlNBRE5nS0E2d0VnQlNBQ0lCdHFOZ0x3NmdFTUJBc2dCMFVFUUNBZUlBOGdDQ0FVRUJRaUFrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGU0VEREFNTElBdEZJQWhGY2cwTElBdEJDSFlpQXlBSUlBdEpCSDhnQ0VFRWRDQUxiZ1ZCRHd0QkdHd2lBa0dNQ0dvb0FnQnNJQUpCaUFocUtBSUFhaUlHUVFOMklBWnFJQUpCZ0FocUtBSUFJQUpCaEFocUtBSUFJQU5zYWtrRVFDTUFRUkJySWhBa0FDQWVLQUlBSVFNZ0ZFSHdCR3BCQUVIc0FCQURJUVpCVkNFQ0FrQWdBMEgvQVhFaURFRU1TdzBBQWtBZ0ZFSGNDV29nQmlBUVFRaHFJQkJCREdvZ0R5QUlJQlJCM0F0cUloY1FDeUlTUVloL1N3MEFJQkFvQWd3aUJpQU1TdzBCSUJSQnFBVnFJUTBnRkVHa0JXb2hOaUFlUVFScUlSRWdBMEdBZ0lCNGNTRTNJQVpCQVdvaUV5RUNJQVloQXdOQUlBSWlCMEVCYXlFQ0lBTWlDa0VCYXlFRElCUWdDa0VDZEdvb0F2QUVSUTBBQzBFQklBY2dCMEVCVFJzaEZrRUFJUWRCQVNFQ0EwQWdBaUFXUndSQUlCUWdBa0VDZENJRGFpZ0M4QVFoR0NBRElBMXFJQWMyQWdBZ0FrRUJhaUVDSUFjZ0dHb2hCd3dCQ3dzZ0RTQUhOZ0lBUVFBaEFpQVFLQUlJSVFNRFFDQUNJQU5IQkVBZ0RTQUNJQlJxUWR3SmFpMEFBQ0lZUVFKMGFpSVpJQmtvQWdBaUdVRUJhallDQUNBVUlCbEJBWFJxSWhrZ0dEb0EzUVVnR1NBQ09nRGNCU0FDUVFGcUlRSU1BUXNMUVFBaEF5QU5RUUEyQWdBZ0RDQUdRWDl6YWlFR1FRRWhBZ05BSUFJZ0ZrY0VRQ0FVSUFKQkFuUnFJZzBnQXpZQ0FDQU5LQUx3QkNBQ0lBWnFkQ0FEYWlFRElBSkJBV29oQWd3QkN3c2dEQ0FUSUFwcklnWnJRUUZxSVFvZ0JpRURBMEFnQXlBS1NRUkFJQlFnQTBFMGJHb2hEVUVCSVFJRFFDQUNJQlpIQkVBZ0RTQUNRUUowSWhocUlCUWdHR29vQWdBZ0EzWTJBZ0FnQWtFQmFpRUNEQUVMQ3lBRFFRRnFJUU1NQVFzTElCY2dGRUUwRUFJaE9DQVVRWkFNYWlFNUlCTWdER3NoT2lBVVFkd0ZhaUVYUVFBaENnTkFBa0FDUUNBSElBcEhCRUJCQVNBTUlCTWdGeUFLUVFGMGFpSUNMUUFCSWcxcklnTnJJaGgwSVJrZ0FpMEFBQ0VXSURnZ0RVRUNkR29pSHlnQ0FDRUNJQVlnR0UwRVFDQTJRUUVnQXlBNmFpSU5JQTFCQVV3YklpQkJBblFpSkdvb0FnQWhEU0E1SUJRZ0EwRTBiR3BCTkJBQ0lTRWdEVUVCZENFbUlCRWdBa0VDZEdvaEl5QWdRUUZORFFJZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRWdJQ0VnSkdvb0FnQWhKRUVBSVFJRFFDQUNJQ1JHRFFNZ0l5QUNRUUowYWlBZ05nRUFJQUpCQVdvaEFnd0FDd0FMSUFJZ0FpQVphaUlOSUFJZ0RVc2JJUTBnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFREEwQWdBaUFOUmcwRElCRWdBa0VDZEdvZ0F6WUJBQ0FDUVFGcUlRSU1BQXNBQ3lBZUlBeEJFSFFnTjNJZ0RISkJnQUp5TmdJQURBTUxJQWNnRFdzaEpDQVhJQ1pxSVNaQkFDRU5BMEFnRFNBa1JnMEJRUUVnR0NBVElDWWdEVUVCZEdvaUp5MEFBU0lDYXlJN2EzUWlQQ0FoSUFKQkFuUnFJaUFvQWdBaUFtb2hQU0FESUR0cVFSQjBRWUNBL0FkeElDY3RBQUJCQ0hSeUlCWnlRWUNBZ0JCeUlTY0RRQ0FqSUFKQkFuUnFJQ2MyQVFBZ0FrRUJhaUlDSUQxSkRRQUxJQ0FnSUNnQ0FDQThhallDQUNBTlFRRnFJUTBNQUFzQUN5QWZJQjhvQWdBZ0dXbzJBZ0FnQ2tFQmFpRUtEQUFMQUFzZ0VpRUNDeUFRUVJCcUpBQWdBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRmlFRERBTUxJQjRnRHlBSUlCUVFGQ0lDUVloL1N5QUNJQWhQY2cwTElCd2dDeUFDSUE5cUlBZ2dBbXNnSGhBWElRTU1BZ3NnQXdSQUlCd2dDeUFQSUFnZ0FoQVdJUU1NQWdzZ0hDQUxJQThnQ0NBQ0VCY2hBd3dCQ3lBY0lBc2dEeUFJSUFJUUZTRURDeUFEUVloL1N3MElJQVVnQ3pZQ2dPc0JJQVVnSERZQzhPb0JJQVZCQVRZQ2dPb0JJQnBCQWtZRVFDQUZJQjQyQWd3TElBc2dIR29pQWtJQU53QUFJQUpDQURjQUdDQUNRZ0EzQUJBZ0FrSUFOd0FJSUFsQmlIOUxEUW9MSUFrZ0ZVWU5DQ0FWSUFscklRWWdCU2dDbk9zQklRb0NRQ0FKSUJ0cUlnTXRBQUFpRDBVRVFFRUJJUUpCQUNFUFFiaC9JUWtnQmtFQlJnMEJEQXNMQW44Z0EwRUJhaUFQd0NJQ1FRQk9EUUFhSUFKQmYwWUVRQ0FHUVFOSURRc2dBeThBQVVHQS9nRnFJUThnQTBFRGFnd0JDeUFHUVFKSURRb2dBeTBBQVNBUFFRaDBja0dBZ0FKcklROGdBMEVDYWdzaEVrRzRmeUVKSUJKQkFXb2lBaUFWSUJ0cUlnZExEUW9nTENBRklCSXRBQUFpRWtFR2RrRWpRUWtnQWlBSElBSnJRY0FRUWRBUlFmQVNJQVVvQW9UcUFTQUtJQThnRkJBaElnbEJpSDlMRFFnZ0t5QW9JQkpCQkhaQkEzRkJIMEVJSUFJZ0NXb2lBaUFISUFKclFZQUxRWUFNUVlBWElBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlDRUdJZjBzTkNFRnNJUWtnS2lBdElCSkJBblpCQTNGQk5FRUpJQUlnQ0dvaUFpQUhJQUpyUVlBTlFlQU9RWkFaSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUIwR0lmMHNOQ2lBQ0lBZHFJQU5ySWdJaENTQUNRWWgvU3cwS0N5QU9JQTlCQUV4eURRRUxRYnAvSVFrTUNBc2dKU0FPYXlFSklBWWdBbXNoQmlBQ0lBTnFJUWNDUUFKQUFrQWdDa1VFUUNBUFFRbElJQVVwQThqcEFVS0JnSUFJVkhJTkFpQW9LQUlBSWdKQkNHb2hFaUFDS0FJRUlRcEJBQ0VEUVFBaEFnTkFJQU1nQ25aRkJFQWdBaUFTSUFOQkEzUnFMUUFDUVJaTGFpRUNJQU5CQVdvaEF3d0JDd3NnQlVFQU5nS2M2d0VnQWtFSUlBcHJkRUVVVHcwQkRBTUxJQVZCQURZQ25Pc0JDeUFFSUFVb0F2RHFBU0lETmdMY0FTQUpJQTVxSVJZZ0F5QUZLQUtBNndGcUlSY0NRQ0FQUlFSQUlBNGhCd3dCQ3lBRktBSzQ2UUVoR2lBRktBSzA2UUVoR0NBRktBS3c2UUVoRWlBRlFRRTJBb1RxQVVFQUlRTURRQ0FEUVFOSEJFQWdCQ0FEUVFKMElnSnFJQUlnQldwQnJOQUJhaWdDQURZQ1pDQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFUaHFJZ0lnQnlBR0VBMUJpSDlMRFFOQkNDQVBJQTlCQ0U0YklSOGdOQ0FDSUFVb0FnQVFIaUF6SUFJZ0JTZ0NDQkFlSURJZ0FpQUZLQUlFRUI0Z0RpQVNheUVaUVFBaENBTkFJQVJCT0dvUUQwRURSaUFJSUI5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdkQkVIWWlFVUgvQVhFaEN5QUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZ3hCRUhZaUlVSC9BWEVoRUNBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUVlnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNrSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lLYXlJTklBSWdBaUFOU3hzaUV5QUthallDUENBR0lBUW9BamdnQ25SQkFDQVRhM1lnQWlBVGF5SVRkR29oQ2lBRVFUaHFFQThhSUFJZ0RVME5BU0FFSUFRb0Fqd2lBaUFUYWpZQ1BDQUVLQUk0SUFKMFFRQWdFMnQySUFwcUlRb01BUXNnQkNBQ0lBUW9BandpRFdvMkFqd2dCQ2dDT0NBTmRFRUFJQXByZGlBR2FpRUtJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQW8yQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBREJFQWdCQ2dDWkNFS0RBTUxJQVFvQW1naENnd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQVlnQTBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdaRklBWnFJUW9nQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlBbzJBbVFMcHlFQ0lFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQkJxTmdJOElBUW9BamdnQm5SQkFDQWhhM1lnQW1vaEFnc2dDeUFRYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUF0cU5nSThJQVFvQWpnZ0JuUkJBQ0FSYTNZZ0Eyb2hBd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lCa0VBSUFkQkdIWWlDeUFFS0FJOGFpSVFhM1lnQzBFQ2RFR2dIV29vQWdCeElBZEIvLzhEY1dvMkFrd2dCQ0FRSUF4QkdIWWlCMm9pQ3pZQ1BDQUVJQWRCQW5SQm9CMXFLQUlBSUFaQkFDQUxhM1p4SUF4Qi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ1pCR0hZaUJ5QUVLQUk4YWlJTE5nSThJQVFnQjBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUF0cmRuRWdCa0gvL3dOeGFqWUNWQ0FFUWZBQWFpQUlRUXhzYWlJR0lBbzJBZ2dnQmlBQ05nSUVJQVlnQXpZQ0FDQUlRUUZxSVFnZ0F5QVphaUFDYWlFWkRBRUxDeUFJSUI5SURRTWdGa0VnYXlFaElBNGhCd05BSUFSQk9Hb1FEMEVEUmlBSUlBOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnWkJFSFlpSTBIL0FYRWhDaUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWcxQkVIWWlJRUgvQVhFaEV5QUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFNZ1FVSWdpQ0JBUWlDSXB5RUxBa0FnUWtJUWlLY2lERUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJTWF5SVJJQUlnQWlBUlN4c2lFQ0FNYWpZQ1BDQURJQVFvQWpnZ0RIUkJBQ0FRYTNZZ0FpQVFheUlNZEdvaEVDQUVRVGhxRUE4YUlBSWdFVTBOQVNBRUlBUW9BandpQWlBTWFqWUNQQ0FFS0FJNElBSjBRUUFnREd0MklCQnFJUkFNQVFzZ0JDQUNJQVFvQWp3aUVHbzJBandnQkNnQ09DQVFkRUVBSUF4cmRpQURhaUVRSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUJBMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQUxCRUFnQkNnQ1pDRVFEQU1MSUFRb0FtZ2hFQXdCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFNZ0MwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnTkZJQU5xSVJBZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQkEyQW1RTHB5RU1JRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUJOcU5nSThJQVFvQWpnZ0FuUkJBQ0FnYTNZZ0RHb2hEQXNnQ2lBVGFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lBcHFOZ0k4SUFRb0FqZ2dBblJCQUNBamEzWWdDMm9oQ3dzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQWtFQUlBWkJHSFlpQXlBRUtBSThhaUlLYTNZZ0EwRUNkRUdnSFdvb0FnQnhJQVpCLy84RGNXbzJBa3dnQkNBS0lBMUJHSFlpQTJvaUJqWUNQQ0FFSUFOQkFuUkJvQjFxS0FJQUlBSkJBQ0FHYTNaeElBMUIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdKQkdIWWlBeUFFS0FJOGFpSUdOZ0k4SUFRZ0EwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBWnJkbkVnQWtILy93TnhhallDVkFKQUFrQUNRQ0FFS0FMY0FTSURJQVJCOEFCcUlBaEJCM0ZCREd4cUloTW9BZ0FpRVdvaUl5QVhTdzBBSUFjZ0V5Z0NCQ0lOSUJGcUlncHFJQ0ZMRFFBZ0NrRWdhaUFXSUFkclRRMEJDeUFFSUJNb0FnZzJBaGdnQkNBVEtRSUFOd01RSUFjZ0ZpQUVRUkJxSUFSQjNBRnFJQmNnRWlBWUlCb1FIeUVLREFFTElBY2dFV29oQWlBVEtBSUlJUVlnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0FKQUlCRkJFVWtOQUNBSElBTXBBQkEzQUJBZ0J5QURLUUFZTndBWUlCRkJFR3RCRVVnTkFDQURRUkJxSVFNZ0IwRWdhaUVSQTBBZ0VTQURLUUFRTndBQUlCRWdBeWtBR0RjQUNDQVJJQU1wQUNBM0FCQWdFU0FES1FBb053QVlJQU5CSUdvaEF5QVJRU0JxSWhFZ0Fra05BQXNMSUFJZ0Jtc2hBeUFFSUNNMkF0d0JJQUlnRW1zZ0Jra0VRQ0FHSUFJZ0dHdExEUWNnR2lBYUlBTWdFbXNpQTJvaUVTQU5hazhFUUNBQ0lCRWdEUkFLR2d3Q0N5QURJQTFxSVEwZ0FpQVJRUUFnQTJzUUNpQURheUVDSUJJaEF3c2dCa0VRVHdSQUlBSWdBeWtBQURjQUFDQUNJQU1wQUFnM0FBZ2dEVUVSU0EwQklBSWdEV29oQmlBQ1FSQnFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBR1NRMEFDd3dCQ3dKQUlBWkJCMDBFUUNBQ0lBTXRBQUE2QUFBZ0FpQURMUUFCT2dBQklBSWdBeTBBQWpvQUFpQUNJQU10QUFNNkFBTWdBaUFESUFaQkFuUWlCa0hBSG1vb0FnQnFJZ01vQUFBMkFBUWdBeUFHUWVBZWFpZ0NBR3NoQXd3QkN5QUNJQU1wQUFBM0FBQUxJQTFCQ1VrTkFDQUNJQTFxSVJFZ0FrRUlhaUlHSUFOQkNHb2lBMnRCRDB3RVFBTkFJQVlnQXlrQUFEY0FBQ0FEUVFocUlRTWdCa0VJYWlJR0lCRkpEUUFNQWdzQUN5QUdJQU1wQUFBM0FBQWdCaUFES1FBSU53QUlJQTFCR1VnTkFDQUNRUmhxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQVJTUTBBQ3dzZ0NrR0lmMHNFUUNBS0lRa01CZ1VnRXlBUU5nSUlJQk1nRERZQ0JDQVRJQXMyQWdBZ0NFRUJhaUVJSUFjZ0Ntb2hCeUFMSUJscUlBeHFJUmtNQWdzQUN3c2dDQ0FQU0EwRElBZ2dIMnNoQmdOQUFrQWdCaUFQVGdSQVFRQWhBd05BSUFOQkEwWU5BaUFGSUFOQkFuUWlBbXBCck5BQmFpQUNJQVJxS0FKa05nSUFJQU5CQVdvaEF3d0FDd0FMQWtBQ1FBSkFJQVFvQXR3QklnTWdCRUh3QUdvZ0JrRUhjVUVNYkdvaUNDZ0NBQ0lNYWlJUUlCZExEUUFnQnlBSUtBSUVJZ3NnREdvaUNtb2dJVXNOQUNBS1FTQnFJQllnQjJ0TkRRRUxJQVFnQ0NnQ0NEWUNLQ0FFSUFncEFnQTNBeUFnQnlBV0lBUkJJR29nQkVIY0FXb2dGeUFTSUJnZ0doQWZJUW9NQVFzZ0J5QU1haUVDSUFnb0FnZ2hDQ0FISUFNcEFBQTNBQUFnQnlBREtRQUlOd0FJQWtBZ0RFRVJTUTBBSUFjZ0F5a0FFRGNBRUNBSElBTXBBQmczQUJnZ0RFRVFhMEVSU0EwQUlBTkJFR29oQXlBSFFTQnFJUXdEUUNBTUlBTXBBQkEzQUFBZ0RDQURLUUFZTndBSUlBd2dBeWtBSURjQUVDQU1JQU1wQUNnM0FCZ2dBMEVnYWlFRElBeEJJR29pRENBQ1NRMEFDd3NnQWlBSWF5RURJQVFnRURZQzNBRWdBaUFTYXlBSVNRUkFJQWdnQWlBWWEwc05CeUFhSUJvZ0F5QVNheUlEYWlJTUlBdHFUd1JBSUFJZ0RDQUxFQW9hREFJTElBTWdDMm9oQ3lBQ0lBeEJBQ0FEYXhBS0lBTnJJUUlnRWlFREN5QUlRUkJQQkVBZ0FpQURLUUFBTndBQUlBSWdBeWtBQ0RjQUNDQUxRUkZJRFFFZ0FpQUxhaUVJSUFKQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFJZ0F5MEFBRG9BQUNBQ0lBTXRBQUU2QUFFZ0FpQURMUUFDT2dBQ0lBSWdBeTBBQXpvQUF5QUNJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBSWdBeWtBQURjQUFBc2dDMEVKU1EwQUlBSWdDMm9oRENBQ1FRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0RFa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dDMEVaU0EwQUlBSkJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBeEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0dCU0FHUVFGcUlRWWdCeUFLYWlFSERBSUxBQXNMSUFRb0F0d0JJUU1MUWJwL0lRa2dGeUFEYXlJQ0lCWWdCMnRMRFFJZ0J3Ui9JQWNnQXlBQ0VBSWdBbW9GUVFBTElBNXJJUWtNQWdzZ0JVRUFOZ0tjNndFTElBUWdCU2dDOE9vQklnTTJBdHdCSUFrZ0Rtb2hEQ0FESUFVb0FvRHJBV29oRUFKQUlBOUZCRUFnRGlFR0RBRUxJQVVvQXJqcEFTRU5JQVVvQXJUcEFTRVRJQVVvQXJEcEFTRVNJQVZCQVRZQ2hPb0JRUUFoQXdOQUlBTkJBMGNFUUNBRUlBTkJBblFpQW1vZ0FpQUZha0dzMEFGcUtBSUFOZ0tjQVNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUWZBQWFpSUNJQWNnQmhBTlFZaC9TdzBCSURFZ0FpQUZLQUlBRUI0Z01DQUNJQVVvQWdnUUhpQXZJQUlnQlNnQ0JCQWVJQXhCSUdzaEdDQU9JUVlEUUNBRUtBS0lBU0FFS0FLRUFVRURkR29wQWdBaVFLY2lDa0VRZGlJWlFmOEJjU0VMSUFRb0FwZ0JJQVFvQXBRQlFRTjBhaWtDQUNKQnB5SVdRUkIySWg5Qi93RnhJUm9nQkNnQ2tBRWdCQ2dDakFGQkEzUnFLUUlBSWtKQ0lJaW5JUWNnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NkQ0lJYXlJUklBSWdBaUFSU3hzaUZ5QUlhallDZENBSElBUW9BbkFnQ0hSQkFDQVhhM1lnQWlBWGF5SVhkR29oQ0NBRVFmQUFhaEFQR2lBQ0lCRk5EUUVnQkNBRUtBSjBJZ0lnRjJvMkFuUWdCQ2dDY0NBQ2RFRUFJQmRyZGlBSWFpRUlEQUVMSUFRZ0FpQUVLQUowSWhGcU5nSjBJQVFvQW5BZ0VYUkJBQ0FJYTNZZ0Iyb2hDQ0FFUWZBQWFoQVBHZ3NnQkNrQ25BRWhSQ0FFSUFnMkFwd0JJQVFnUkRjQ29BRU1BUXNDUUNBQ1JRUkFJQU1FUUNBRUtBS2NBU0VJREFNTElBUW9BcUFCSVFnTUFRc2dCQ0FFS0FKMElnSkJBV28yQW5RQ2Z5QUhJQU5GYWlBRUtBSndJQUowUVI5MmFpSUNRUU5HQkVBZ0JDZ0NuQUZCQVdzTUFRc2dBa0VDZENBRWFpZ0NuQUVMSWdkRklBZHFJUWdnQWtFQlJ3UkFJQVFnQkNnQ29BRTJBcVFCQ3dzZ0JDQUVLQUtjQVRZQ29BRWdCQ0FJTmdLY0FRdW5JUUlnUVVLQWdQd0hnMUJGQkVBZ0JDQUVLQUowSWdjZ0dtbzJBblFnQkNnQ2NDQUhkRUVBSUI5cmRpQUNhaUVDQ3lBTElCcHFRUlJQQkVBZ0JFSHdBR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ2RDSUhJQXRxTmdKMElBUW9BbkFnQjNSQkFDQVphM1lnQTJvaEF3c2dCRUh3QUdvUUR4b2dCQ0FFS0FKd0lnZEJBQ0FLUVJoMklnc2dCQ2dDZEdvaUdtdDJJQXRCQW5SQm9CMXFLQUlBY1NBS1FmLy9BM0ZxTmdLRUFTQUVJQm9nRmtFWWRpSUthaUlMTmdKMElBUWdDa0VDZEVHZ0hXb29BZ0FnQjBFQUlBdHJkbkVnRmtILy93TnhhallDbEFFZ0JFSHdBR29RRHhvZ0JDQkNweUlIUVJoMklnb2dCQ2dDZEdvaUN6WUNkQ0FFSUFwQkFuUkJvQjFxS0FJQUlBUW9BbkJCQUNBTGEzWnhJQWRCLy84RGNXbzJBb3dCSUFRZ0F6WUNPQ0FFSUFJMkFqd2dCQ0FJTmdKQUFrQUNRQUpBSUFRb0F0d0JJZ3NnQTJvaUZpQVFTdzBBSUFZZ0FpQURhaUlLYWlBWVN3MEFJQXBCSUdvZ0RDQUdhMDBOQVFzZ0JDQUVRVUJyS0FJQU5nSUlJQVFnQkNrRE9EY0RBQ0FHSUF3Z0JDQUVRZHdCYWlBUUlCSWdFeUFORUI4aENnd0JDeUFESUFacUlRY2dCaUFMS1FBQU53QUFJQVlnQ3lrQUNEY0FDQUpBSUFOQkVVa05BQ0FHSUFzcEFCQTNBQkFnQmlBTEtRQVlOd0FZSUFOQkVHdEJFVWdOQUNBTFFSQnFJUU1nQmtFZ2FpRUxBMEFnQ3lBREtRQVFOd0FBSUFzZ0F5a0FHRGNBQ0NBTElBTXBBQ0EzQUJBZ0N5QURLUUFvTndBWUlBTkJJR29oQXlBTFFTQnFJZ3NnQjBrTkFBc0xJQWNnQ0dzaEF5QUVJQlkyQXR3QklBY2dFbXNnQ0VrRVFDQUlJQWNnRTJ0TERRUWdEU0FOSUFNZ0Vtc2lBMm9pQ3lBQ2FrOEVRQ0FISUFzZ0FoQUtHZ3dDQ3lBSElBdEJBQ0FEYXhBS0lBUWdBaUFEYWlJQ05nSThJQU5ySVFjZ0VpRURDeUFJUVJCUEJFQWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQ0FDUVJGSURRRWdBaUFIYWlFSUlBZEJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBY2dBeTBBQURvQUFDQUhJQU10QUFFNkFBRWdCeUFETFFBQ09nQUNJQWNnQXkwQUF6b0FBeUFISUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQWNnQXlrQUFEY0FBQXNnQWtFSlNRMEFJQUlnQjJvaEN5QUhRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dDMGtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQWtFWlNBMEFJQWRCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXRKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdEQ3lBR0lBcHFJUVlnQkVId0FHb1FEeUVESUE5QkFXc2lEdzBBQzBFQUlRSWdBMEVDU1EwQkEwQWdBa0VEUndSQUlBVWdBa0VDZENJRGFrR3MwQUZxSUFNZ0JHb29BcHdCTmdJQUlBSkJBV29oQWd3QkN3c2dCQ2dDM0FFaEF3dEJ1bjhoQ1NBUUlBTnJJZ0lnRENBR2Ewc05BQ0FHQkg4Z0JpQURJQUlRQWlBQ2FnVkJBQXNnRG1zaENRc2dDVUdJZjBzTkJnc0NRQ0FGS0FMczZnRkZEUUFnQlNBRktRT0k2Z0VnQ2ExOE53T0k2Z0VDUUNBRktBTFE2Z0VpQWlBSmFpSUlRUjlOQkVBZ0RrVU5BU0FDSUNKcUlBNGdDUkFDR2lBRktBTFE2Z0VnQ1dvaENBd0JDeUFPSVFNZ0FnUkFJQUlnSW1vZ0EwRWdJQUpyRUFJYUlBVW9BdERxQVNFQ0lBVkJBRFlDME9vQklBVWdCU2tEa09vQklBVXBBTERxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRGtPb0JJQVVnQlNrRG1Pb0JJQVVwQUxqcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RtT29CSUFVZ0JTa0RvT29CSUFVcEFNRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEb09vQklBVWdCU2tEcU9vQklBVXBBTWpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRHFPb0JJQU1nQW10QklHb2hBd3NnQ1NBT2FpSUNJQU5CSUdwUEJFQWdBa0VnYXlFR0lBVXBBNmpxQVNFL0lBVXBBNkRxQVNGQUlBVXBBNWpxQVNGQklBVXBBNURxQVNGQ0EwQWdBeWtBR0VMUDF0Tyswc2VyMlVKK0lEOThRaCtKUW9lVnI2K1l0dDZibm45K0lUOGdBeWtBRUVMUDF0Tyswc2VyMlVKK0lFQjhRaCtKUW9lVnI2K1l0dDZibm45K0lVQWdBeWtBQ0VMUDF0Tyswc2VyMlVKK0lFRjhRaCtKUW9lVnI2K1l0dDZibm45K0lVRWdBeWtBQUVMUDF0Tyswc2VyMlVKK0lFSjhRaCtKUW9lVnI2K1l0dDZibm45K0lVSWdBMEVnYWlJRElBWk5EUUFMSUFVZ1B6Y0RxT29CSUFVZ1FEY0RvT29CSUFVZ1FUY0RtT29CSUFVZ1FqY0RrT29CQ3lBQ0lBTk5EUUVnSWlBRElBSWdBMnNpQ0JBQ0dnc2dCU0FJTmdMUTZnRUxJRFVnRldzaEF5QVZJQnRxSVFJZ0NTQU9haUVPSUFRb0FqQkZEUUFMSUNrcEF3QWlQMEovVVNBL0lBNGdIV3VzVVhKRkJFQkJiQ0VKREFZTElBVW9BdURwQVFSQVFXb2hDU0FEUVFSSkRRWWdCU2dDNk9vQlJRUkFJQ0lnQlNnQzBPb0JhaUVLQW40Z0JTa0RpT29CSWo5Q0lGb0VRQ0FGS1FPWTZnRWlRRUlIaVNBRktRT1E2Z0VpUVVJQmlYd2dCU2tEb09vQklrSkNESWw4SUFVcEE2anFBU0pEUWhLSmZDQkJRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOUlFQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZvVkNoNVd2cjVpMjNwdWVmMzVDbmFPMTZvT3hqWXI2QUgwZ1FrTFAxdE8rMHNlcjJVSitRaCtKUW9lVnI2K1l0dDZibm45K2hVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNCRFFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5REFFTElBVXBBNkRxQVVMRno5bXk4ZVc2NmlkOEN5QS9mQ0UvSUNJaEJnTkFJQW9nQmtFSWFpSUhUd1JBSUFZcEFBQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUliaVVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0UvSUFjaEJnd0JDd3NDUUNBS0lBWkJCR29pQ0VrRVFDQUdJUWdNQVFzZ0JqVUFBRUtIbGErdm1MYmVtNTUvZmlBL2hVSVhpVUxQMXRPKzBzZXIyVUorUXZuejNmR1o5cG1yRm53aFB3c0RRQ0FJSUFwSkJFQWdDREVBQUVMRno5bXk4ZVc2NmlkK0lEK0ZRZ3VKUW9lVnI2K1l0dDZibm45K0lUOGdDRUVCYWlFSURBRUxDeUFDS0FBQUlEOUNJWWdnUDRWQ3o5YlR2dExIcTlsQ2ZpSS9RaDJJSUQrRlF2bnozZkdaOXBtckZuNGlQMElnaUNBL2hhZEhEUWNMSUFOQkJHc2hBeUFDUVFScUlRSUxJQTRnSFdzaUNVR0pmMDhOQkNBQklBbHJJUUVnQ1NBZGFpRWRRUUVoUGd3QkN3dEJ1SDhoQnlBRERRUWdIU0FBYXlFSERBUUxRV3doQ1F3QkMwRzRmeUVKQzBHNGZ5RUhJQWxCZGtZZ1BuRU5BUXNnQ1NFSEN5Z0NBQTBBSUFWQi9Pb0JhaWdDQUNFQklBVkIrT29CYWlnQ0FDRUFJQVVRR0NBRktBS3c2d0VnQUNBQkVCTWdCVUVBTmdLdzZ3RWdCU2dDcE9zQklnSUVRQUpBQWtBQ1FBSkFJQUlvQWdBaUF3UkFJQUJGRFFJZ0FTQURJQUFSQWdBTUFRc2dBRVVOQWdzZ0FTQUNJQUFSQWdBTUFnc2dBeEFHQ3lBQ0VBWUxJQVZCQURZQ3BPc0JDeUFBQkVBZ0FTQUZJQUFSQWdBTUFRc2dCUkFHQ3lBRVFlQUJhaVFBSUFjTEM2Z1ZDUUJCaUFnTERRRUFBQUFCQUFBQUFnQUFBQUlBUWFBSUM3TUdBUUFBQUFFQUFBQUNBQUFBQWdBQUFDWUFBQUNDQUFBQUlRVUFBRW9BQUFCbkNBQUFKZ0FBQU1BQkFBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUtRQUFBQ3dDQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBTHdBQUFNb0NBQUNBQUFBQWlnVUFBRW9BQUFDRUNRQUFOUUFBQUhNREFBQ0FBQUFBblFVQUFFb0FBQUNnQ1FBQVBRQUFBSUVEQUFDQUFBQUE2d1VBQUVzQUFBQStDZ0FBUkFBQUFKNERBQUNBQUFBQVRRWUFBRXNBQUFDcUNnQUFTd0FBQUxNREFBQ0FBQUFBd1FZQUFFMEFBQUFmRFFBQVRRQUFBRk1FQUFDQUFBQUFJd2dBQUZFQUFBQ21Ed0FBVkFBQUFKa0VBQUNBQUFBQVN3a0FBRmNBQUFDeEVnQUFXQUFBQU5vRUFBQ0FBQUFBYndrQUFGMEFBQUFqRkFBQVZBQUFBRVVGQUFDQUFBQUFWQW9BQUdvQUFBQ01GQUFBYWdBQUFLOEZBQUNBQUFBQWRna0FBSHdBQUFCT0VBQUFmQUFBQU5JQ0FBQ0FBQUFBWXdjQUFKRUFBQUNRQndBQWtnQUFBQUFBQUFBQkFBQUFBUUFBQUFVQUFBQU5BQUFBSFFBQUFEMEFBQUI5QUFBQS9RQUFBUDBCQUFEOUF3QUEvUWNBQVAwUEFBRDlId0FBL1Q4QUFQMS9BQUQ5L3dBQS9mOEJBUDMvQXdEOS93Y0EvZjhQQVAzL0h3RDkvejhBL2Y5L0FQMy8vd0Q5Ly84Qi9mLy9BLzMvL3dmOS8vOFAvZi8vSC8zLy96LzkvLzkvQUFBQUFBRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVJBQUFBRWdBQUFCTUFBQUFVQUFBQUZRQUFBQllBQUFBWEFBQUFHQUFBQUJrQUFBQWFBQUFBR3dBQUFCd0FBQUFkQUFBQUhnQUFBQjhBQUFBREFBQUFCQUFBQUFVQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFCRUFBQUFTQUFBQUV3QUFBQlFBQUFBVkFBQUFGZ0FBQUJjQUFBQVlBQUFBR1FBQUFCb0FBQUFiQUFBQUhBQUFBQjBBQUFBZUFBQUFId0FBQUNBQUFBQWhBQUFBSWdBQUFDTUFBQUFsQUFBQUp3QUFBQ2tBQUFBckFBQUFMd0FBQURNQUFBQTdBQUFBUXdBQUFGTUFBQUJqQUFBQWd3QUFBQU1CQUFBREFnQUFBd1FBQUFNSUFBQURFQUFBQXlBQUFBTkFBQUFEZ0FBQUF3QUJBRUhnRHd0UkFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVVBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBQUFBUUFFSEVFQXVMQVFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBU0FBQUFGQUFBQUJZQUFBQVlBQUFBSEFBQUFDQUFBQUFvQUFBQU1BQUFBRUFBQUFDQUFBQUFBQUVBQUFBQ0FBQUFCQUFBQUFnQUFBQVFBQUFBSUFBQUFFQUFBQUNBQUFBQUFBRUFRWkFTQytZRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBQkFBQUFCQUFBQUFnQUFBQUFBQUFBQVFBQkFRWUFBQUFBQUFBRUFBQUFBQkFBQUFRQUFBQUFJQUFBQlFFQUFBQUFBQUFGQXdBQUFBQUFBQVVFQUFBQUFBQUFCUVlBQUFBQUFBQUZCd0FBQUFBQUFBVUpBQUFBQUFBQUJRb0FBQUFBQUFBRkRBQUFBQUFBQUFZT0FBQUFBQUFCQlJBQUFBQUFBQUVGRkFBQUFBQUFBUVVXQUFBQUFBQUNCUndBQUFBQUFBTUZJQUFBQUFBQUJBVXdBQUFBSUFBR0JVQUFBQUFBQUFjRmdBQUFBQUFBQ0FZQUFRQUFBQUFLQmdBRUFBQUFBQXdHQUJBQUFDQUFBQVFBQUFBQUFBQUFCQUVBQUFBQUFBQUZBZ0FBQUNBQUFBVUVBQUFBQUFBQUJRVUFBQUFnQUFBRkJ3QUFBQUFBQUFVSUFBQUFJQUFBQlFvQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUlBQUJCUkFBQUFBQUFBRUZFZ0FBQUNBQUFRVVdBQUFBQUFBQ0JSZ0FBQUFnQUFNRklBQUFBQUFBQXdVb0FBQUFBQUFHQkVBQUFBQVFBQVlFUUFBQUFDQUFCd1dBQUFBQUFBQUpCZ0FDQUFBQUFBc0dBQWdBQURBQUFBUUFBQUFBRUFBQUJBRUFBQUFnQUFBRkFnQUFBQ0FBQUFVREFBQUFJQUFBQlFVQUFBQWdBQUFGQmdBQUFDQUFBQVVJQUFBQUlBQUFCUWtBQUFBZ0FBQUZDd0FBQUNBQUFBVU1BQUFBQUFBQUJnOEFBQUFnQUFFRkVnQUFBQ0FBQVFVVUFBQUFJQUFDQlJnQUFBQWdBQUlGSEFBQUFDQUFBd1VvQUFBQUlBQUVCVEFBQUFBQUFCQUdBQUFCQUFBQUR3WUFnQUFBQUFBT0JnQkFBQUFBQUEwR0FDQUFRWUFYQzRjQ0FRQUJBUVVBQUFBQUFBQUZBQUFBQUFBQUJnUTlBQUFBQUFBSkJmMEJBQUFBQUE4Ri9YOEFBQUFBRlFYOS94OEFBQUFEQlFVQUFBQUFBQWNFZlFBQUFBQUFEQVg5RHdBQUFBQVNCZjMvQXdBQUFCY0YvZjkvQUFBQUJRVWRBQUFBQUFBSUJQMEFBQUFBQUE0Ri9UOEFBQUFBRkFYOS93OEFBQUFDQlFFQUFBQVFBQWNFZlFBQUFBQUFDd1g5QndBQUFBQVJCZjMvQVFBQUFCWUYvZjgvQUFBQUJBVU5BQUFBRUFBSUJQMEFBQUFBQUEwRi9SOEFBQUFBRXdYOS93Y0FBQUFCQlFFQUFBQVFBQVlFUFFBQUFBQUFDZ1g5QXdBQUFBQVFCZjMvQUFBQUFCd0YvZi8vRHdBQUd3WDkvLzhIQUFBYUJmMy8vd01BQUJrRi9mLy9BUUFBR0FYOS8vOEFRWkFaQzRZRUFRQUJBUVlBQUFBQUFBQUdBd0FBQUFBQUFBUUVBQUFBSUFBQUJRVUFBQUFBQUFBRkJnQUFBQUFBQUFVSUFBQUFBQUFBQlFrQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUFBQUFCaEFBQUFBQUFBQUdFd0FBQUFBQUFBWVdBQUFBQUFBQUJoa0FBQUFBQUFBR0hBQUFBQUFBQUFZZkFBQUFBQUFBQmlJQUFBQUFBQUVHSlFBQUFBQUFBUVlwQUFBQUFBQUNCaThBQUFBQUFBTUdPd0FBQUFBQUJBWlRBQUFBQUFBSEJvTUFBQUFBQUFrR0F3SUFBQkFBQUFRRUFBQUFBQUFBQkFVQUFBQWdBQUFGQmdBQUFBQUFBQVVIQUFBQUlBQUFCUWtBQUFBQUFBQUZDZ0FBQUFBQUFBWU1BQUFBQUFBQUJnOEFBQUFBQUFBR0VnQUFBQUFBQUFZVkFBQUFBQUFBQmhnQUFBQUFBQUFHR3dBQUFBQUFBQVllQUFBQUFBQUFCaUVBQUFBQUFBRUdJd0FBQUFBQUFRWW5BQUFBQUFBQ0Jpc0FBQUFBQUFNR013QUFBQUFBQkFaREFBQUFBQUFGQm1NQUFBQUFBQWdHQXdFQUFDQUFBQVFFQUFBQU1BQUFCQVFBQUFBUUFBQUVCUUFBQUNBQUFBVUhBQUFBSUFBQUJRZ0FBQUFnQUFBRkNnQUFBQ0FBQUFVTEFBQUFBQUFBQmc0QUFBQUFBQUFHRVFBQUFBQUFBQVlVQUFBQUFBQUFCaGNBQUFBQUFBQUdHZ0FBQUFBQUFBWWRBQUFBQUFBQUJpQUFBQUFBQUJBR0F3QUJBQUFBRHdZRGdBQUFBQUFPQmdOQUFBQUFBQTBHQXlBQUFBQUFEQVlERUFBQUFBQUxCZ01JQUFBQUFBb0dBd1FBUWFRZEM5a0JBUUFBQUFNQUFBQUhBQUFBRHdBQUFCOEFBQUEvQUFBQWZ3QUFBUDhBQUFEL0FRQUEvd01BQVA4SEFBRC9Ed0FBL3g4QUFQOC9BQUQvZndBQS8vOEFBUC8vQVFELy93TUEvLzhIQVAvL0R3RC8veDhBLy84L0FQLy9md0QvLy84QS8vLy9BZi8vL3dQLy8vOEgvLy8vRC8vLy94Ly8vLzgvLy8vL2Z3QUFBQUFCQUFBQUFnQUFBQVFBQUFBQUFBQUFBZ0FBQUFRQUFBQUlBQUFBQUFBQUFBRUFBQUFDQUFBQUFRQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBZ0FBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0JCZ0I4TEE0QVJBUT09Ijt2YXIgc2U9bmV3IEpBLENlPSExO2FzeW5jIGZ1bmN0aW9uIF9JKEEsdCxlKXtsZXQgST1udWxsO3R5cGVvZiBBIT0ic3RyaW5nIj9JPUEuaHJlZjpBLnN0YXJ0c1dpdGgoImh0dHAiKT9JPUE6ST1gJHt0fS8ke0F9YCxJLmVuZHNXaXRoKCIuanMiKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC0zKSksSS5lbmRzV2l0aCgiLndhc20iKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC01KSksSS5lbmRzV2l0aCgiLndhc20uenN0IikmJihJPUkuc3Vic3RyaW5nKDAsSS5sZW5ndGgtOSkpO2xldCByPWAke0l9Lndhc21gLG89YXdhaXQgTEEuZ2V0KGAke3J9LnpzdGAse3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLHBhcmFtczplfSk7Q2V8fChhd2FpdCBzZS5pbml0KCksQ2U9ITApO2xldCBDPXNlLmRlY29kZShuZXcgVWludDhBcnJheShvLmRhdGEpKS5idWZmZXI7cmV0dXJuKGF3YWl0IGltcG9ydChgJHtJfS5qc2ApKS5kZWZhdWx0KHt3YXNtQmluYXJ5OkN9KX12YXIgQmU9X0k7dmFyIGJBPW5ldyBNYXA7YXN5bmMgZnVuY3Rpb24gWEkoQSx0LGUpe2xldCBJPUEscj1BLG89bnVsbDtyZXR1cm4gdHlwZW9mIEEhPSJzdHJpbmciJiYoST1uZXcgVVJMKEEuaHJlZikscj1JLmhyZWYpLGJBLmhhcyhyKT9vPWF3YWl0IGJBLmdldChyKTooYkEuc2V0KHIsQmUoSSx0LGUpKSxvPWF3YWl0IGJBLmdldChyKSksb312YXIgYWU9WEk7dmFyIHpJPXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm1MaXN0OiJUcmFuc2Zvcm1MaXN0IixKc29uQ29tcGF0aWJsZToiSnNvbkNvbXBhdGlibGUifSxoPXpJO3ZhciB2ST17SW50ODoiaW50OCIsVUludDg6InVpbnQ4IixJbnQxNjoiaW50MTYiLFVJbnQxNjoidWludDE2IixJbnQzMjoiaW50MzIiLFVJbnQzMjoidWludDMyIixJbnQ2NDoiaW50NjQiLFVJbnQ2NDoidWludDY0IixTaXplVmFsdWVUeXBlOiJ1aW50NjQiLElkZW50aWZpZXJUeXBlOiJ1aW50NjQiLEluZGV4VmFsdWVUeXBlOiJpbnQ2NCIsT2Zmc2V0VmFsdWVUeXBlOiJpbnQ2NCJ9LFI9dkk7dmFyICRJPXtGbG9hdDMyOiJmbG9hdDMyIixGbG9hdDY0OiJmbG9hdDY0IixTcGFjZVByZWNpc2lvblR5cGU6ImZsb2F0NjQifSx6PSRJO2Z1bmN0aW9uIEFyKEEsdCl7bGV0IGU9bnVsbDtzd2l0Y2goQSl7Y2FzZSBSLlVJbnQ4OntlPW5ldyBVaW50OEFycmF5KHQpO2JyZWFrfWNhc2UgUi5JbnQ4OntlPW5ldyBJbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBSLlVJbnQxNjp7ZT1uZXcgVWludDE2QXJyYXkodCk7YnJlYWt9Y2FzZSBSLkludDE2OntlPW5ldyBJbnQxNkFycmF5KHQpO2JyZWFrfWNhc2UgUi5VSW50MzI6e2U9bmV3IFVpbnQzMkFycmF5KHQpO2JyZWFrfWNhc2UgUi5JbnQzMjp7ZT1uZXcgSW50MzJBcnJheSh0KTticmVha31jYXNlIFIuVUludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdVaW50NjRBcnJheT09ImZ1bmN0aW9uIj9lPW5ldyBCaWdVaW50NjRBcnJheSh0KTplPW5ldyBVaW50OEFycmF5KHQpO2JyZWFrfWNhc2UgUi5JbnQ2NDp7dHlwZW9mIGdsb2JhbFRoaXMuQmlnSW50NjRBcnJheT09ImZ1bmN0aW9uIj9lPW5ldyBCaWdJbnQ2NEFycmF5KHQpOmU9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSB6LkZsb2F0MzI6e2U9bmV3IEZsb2F0MzJBcnJheSh0KTticmVha31jYXNlIHouRmxvYXQ2NDp7ZT1uZXcgRmxvYXQ2NEFycmF5KHQpO2JyZWFrfWNhc2UibnVsbCI6e2U9bnVsbDticmVha31jYXNlIG51bGw6e2U9bnVsbDticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVHlwZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgVHlwZWRBcnJheSIpfXJldHVybiBlfXZhciBIPUFyO3ZhciBjZT10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcj09ImZ1bmN0aW9uIixRZT1uZXcgVGV4dEVuY29kZXIsRWU9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpO2Z1bmN0aW9uIHRyKEEsdCl7bGV0IGU9e2ZsYWdzOiJyIixlbmNvZGluZzoiYmluYXJ5In0sST1BLmZzX29wZW4odCxlLmZsYWdzKSxvPUEuZnNfc3RhdCh0KS5zaXplLGc9bnVsbDtjZT9nPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihvKTpnPW5ldyBBcnJheUJ1ZmZlcihvKTtsZXQgQz1uZXcgVWludDhBcnJheShnKTtyZXR1cm4gQS5mc19yZWFkKEksQywwLG8sMCksQS5mc19jbG9zZShJKSxDfWZ1bmN0aW9uIGZlKEEsdCxlKXtsZXQgST1udWxsO2NlP0k9bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUpOkk9bmV3IEFycmF5QnVmZmVyKGUpO2xldCByPW5ldyBVaW50OEFycmF5KEkpLG89bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLHQsZSk7cmV0dXJuIHIuc2V0KG8pLHJ9ZnVuY3Rpb24geShBLHQsZSxJKXtsZXQgcj0wO3JldHVybiB0IT09bnVsbCYmKHI9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfYXJyYXlfYWxsb2MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsZSxJLHQuYnVmZmVyLmJ5dGVMZW5ndGhdKSxBLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHIpKSxyfWZ1bmN0aW9uIFQoQSx0LGUpe2xldCBJPUpTT04uc3RyaW5naWZ5KHQpLHI9QS5sZW5ndGhCeXRlc1VURjgoSSkrMSxvPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2pzb25fYWxsb2MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsZSxyXSk7QS5zdHJpbmdUb1VURjgoSSxvLHIpfWZ1bmN0aW9uIEYoQSx0LGUsSSl7bGV0IHI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxlXSksbz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LGVdKSxnPWZlKEEscixvKTtyZXR1cm4gSChJLGcuYnVmZmVyKX1mdW5jdGlvbiBzQShBLHQpe2xldCBlPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9qc29uX2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIl0sWzAsdF0pLEk9QS5VVEY4VG9TdHJpbmcoZSk7cmV0dXJuIEpTT04ucGFyc2UoSSl9ZnVuY3Rpb24gZXIoQSx0LGUsSSl7SSE9bnVsbCYmSS5sZW5ndGg+MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKGEsbil7c3dpdGNoKGEudHlwZSl7Y2FzZSBoLlRleHRTdHJlYW06e2xldCBzPVFlLmVuY29kZShhLmRhdGEuZGF0YSksZj15KEEscyxuLDApLEI9e3NpemU6cy5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtUKEEsQixuKTticmVha31jYXNlIGguSnNvbkNvbXBhdGlibGU6e2xldCBzPVFlLmVuY29kZShKU09OLnN0cmluZ2lmeShhLmRhdGEpKSxmPXkoQSxzLG4sMCksQj17c2l6ZTpzLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O1QoQSxCLG4pO2JyZWFrfWNhc2UgaC5CaW5hcnlTdHJlYW06e2xldCBzPWEuZGF0YS5kYXRhLGY9eShBLHMsbiwwKSxCPXtzaXplOnMuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07VChBLEIsbik7YnJlYWt9Y2FzZSBoLlRleHRGaWxlOntBLmZzX3dyaXRlRmlsZShhLmRhdGEucGF0aCxhLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBoLkJpbmFyeUZpbGU6e0EuZnNfd3JpdGVGaWxlKGEuZGF0YS5wYXRoLGEuZGF0YS5kYXRhKTticmVha31jYXNlIGguSW1hZ2U6e2xldCBzPWEuZGF0YSxmPXkoQSxzLmRhdGEsbiwwKSxCPXkoQSxzLmRpcmVjdGlvbixuLDEpLEU9dHlwZW9mIHMubWV0YWRhdGE/LmVudHJpZXM8InUiP0FycmF5LmZyb20ocy5tZXRhZGF0YS5lbnRyaWVzKCkpOltdLGw9e2ltYWdlVHlwZTpzLmltYWdlVHlwZSxuYW1lOnMubmFtZSxvcmlnaW46cy5vcmlnaW4sc3BhY2luZzpzLnNwYWNpbmcsZGlyZWN0aW9uOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gLHNpemU6cy5zaXplLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbWV0YWRhdGE6RX07VChBLGwsbik7YnJlYWt9Y2FzZSBoLk1lc2g6e2xldCBzPWEuZGF0YSxmPXkoQSxzLnBvaW50cyxuLDApLEI9eShBLHMuY2VsbHMsbiwxKSxFPXkoQSxzLnBvaW50RGF0YSxuLDIpLGw9eShBLHMuY2VsbERhdGEsbiwzKSxjPXttZXNoVHlwZTpzLm1lc2hUeXBlLG5hbWU6cy5uYW1lLG51bWJlck9mUG9pbnRzOnMubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG51bWJlck9mQ2VsbHM6cy5udW1iZXJPZkNlbGxzLGNlbGxzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gLGNlbGxCdWZmZXJTaXplOnMuY2VsbEJ1ZmZlclNpemUsbnVtYmVyT2ZQb2ludFBpeGVsczpzLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gLG51bWJlck9mQ2VsbFBpeGVsczpzLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YH07VChBLGMsbik7YnJlYWt9Y2FzZSBoLlBvaW50U2V0OntsZXQgcz1hLmRhdGEsZj15KEEscy5wb2ludHMsbiwwKSxCPXkoQSxzLnBvaW50RGF0YSxuLDEpLEU9e3BvaW50U2V0VHlwZTpzLnBvaW50U2V0VHlwZSxuYW1lOnMubmFtZSxudW1iZXJPZlBvaW50czpzLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxudW1iZXJPZlBvaW50UGl4ZWxzOnMubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWB9O1QoQSxFLG4pO2JyZWFrfWNhc2UgaC5UcmFuc2Zvcm1MaXN0OntsZXQgcz1hLmRhdGEsZj1bXTtzLmZvckVhY2goKEIsRSk9PntsZXQgYz1gZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3koQSxCLmZpeGVkUGFyYW1ldGVycyxuLEUqMil9YCxTPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7eShBLEIucGFyYW1ldGVycyxuLEUqMisxKX1gLEQ9e3RyYW5zZm9ybVR5cGU6Qi50cmFuc2Zvcm1UeXBlLG51bWJlck9mRml4ZWRQYXJhbWV0ZXJzOkIubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnMsbnVtYmVyT2ZQYXJhbWV0ZXJzOkIubnVtYmVyT2ZQYXJhbWV0ZXJzLG5hbWU6Qi5uYW1lLGlucHV0U3BhY2VOYW1lOkIuaW5wdXRTcGFjZU5hbWUsb3V0cHV0U3BhY2VOYW1lOkIub3V0cHV0U3BhY2VOYW1lLHBhcmFtZXRlcnM6UyxmaXhlZFBhcmFtZXRlcnM6Y307Zi5wdXNoKEQpfSksVChBLGYsbik7YnJlYWt9Y2FzZSBoLlBvbHlEYXRhOntsZXQgcz1hLmRhdGEsZj15KEEscy5wb2ludHMsbiwwKSxCPXkoQSxzLnZlcnRpY2VzLG4sMSksRT15KEEscy5saW5lcyxuLDIpLGw9eShBLHMucG9seWdvbnMsbiwzKSxjPXkoQSxzLnRyaWFuZ2xlU3RyaXBzLG4sNCkscD15KEEscy5wb2ludERhdGEsbiw1KSxTPXkoQSxzLnBvaW50RGF0YSxuLDYpLEQ9e3BvbHlEYXRhVHlwZTpzLnBvbHlEYXRhVHlwZSxuYW1lOnMubmFtZSxudW1iZXJPZlBvaW50czpzLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6cy52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWAsbGluZXNCdWZmZXJTaXplOnMubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gLHBvbHlnb25zQnVmZmVyU2l6ZTpzLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6cy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZQb2ludFBpeGVsczpzLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7cH1gLG51bWJlck9mQ2VsbFBpeGVsczpzLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1N9YH07VChBLEQsbik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IHI9QS5zdGFja1NhdmUoKSxvPTA7dHJ5e289QS5jYWxsTWFpbih0LnNsaWNlKCkpfWNhdGNoKGEpe3Rocm93IHR5cGVvZiBhPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKGEpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLGF9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShyKX1sZXQgZz1BLmdldE1vZHVsZVN0ZG91dCgpLEM9QS5nZXRNb2R1bGVTdGRlcnIoKSxRPVtdO3JldHVybiBlIT1udWxsJiZlLmxlbmd0aD4wJiZvPT09MCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGEsbil7bGV0IHM9bnVsbDtzd2l0Y2goYS50eXBlKXtjYXNlIGguVGV4dFN0cmVhbTp7bGV0IEI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbiwwXSksRT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxuLDBdKSxsPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixCLEUpO3M9e2RhdGE6RWUuZGVjb2RlKGwpfTticmVha31jYXNlIGguSnNvbkNvbXBhdGlibGU6e2xldCBCPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG4sMF0pLEU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbiwwXSksbD1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQixFKTtzPUpTT04ucGFyc2UoRWUuZGVjb2RlKGwpKTticmVha31jYXNlIGguQmluYXJ5U3RyZWFtOntsZXQgQj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxuLDBdKSxFPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG4sMF0pO3M9e2RhdGE6ZmUoQSxCLEUpfTticmVha31jYXNlIGguVGV4dEZpbGU6e3M9e3BhdGg6YS5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKGEuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBoLkJpbmFyeUZpbGU6e3M9e3BhdGg6YS5kYXRhLnBhdGgsZGF0YTp0cihBLGEuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBoLkltYWdlOntsZXQgQj1zQShBLG4pO0IuZGF0YT1GKEEsbiwwLEIuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEIuZGlyZWN0aW9uPUYoQSxuLDEsei5GbG9hdDY0KSxCLm1ldGFkYXRhPW5ldyBNYXAoQi5tZXRhZGF0YSkscz1CO2JyZWFrfWNhc2UgaC5NZXNoOntsZXQgQj1zQShBLG4pO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1GKEEsbiwwLEIubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpCLnBvaW50cz1IKEIubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZkNlbGxzPjA/Qi5jZWxscz1GKEEsbiwxLEIubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOkIuY2VsbHM9SChCLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qi5wb2ludERhdGE9RihBLG4sMixCLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpCLnBvaW50RGF0YT1IKEIubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbFBpeGVscz4wP0IuY2VsbERhdGE9RihBLG4sMyxCLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkIuY2VsbERhdGE9SChCLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzPUI7YnJlYWt9Y2FzZSBoLlBvaW50U2V0OntsZXQgQj1zQShBLG4pO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1GKEEsbiwwLEIucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qi5wb2ludHM9SChCLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mUG9pbnRQaXhlbHM+MD9CLnBvaW50RGF0YT1GKEEsbiwxLEIucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpCLnBvaW50RGF0YT1IKEIucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscz1CO2JyZWFrfWNhc2UgaC5UcmFuc2Zvcm1MaXN0OntsZXQgQj1zQShBLG4pO0IuZm9yRWFjaCgoRSxsKT0+e0UubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM+MCYmKEJbbF0uZml4ZWRQYXJhbWV0ZXJzPUYoQSxuLGwqMixFLnRyYW5zZm9ybVR5cGUucGFyYW1ldGVyc1ZhbHVlVHlwZSkpLEUubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM+MCYmKEJbbF0ucGFyYW1ldGVycz1GKEEsbixsKjIrMSxFLnRyYW5zZm9ybVR5cGUucGFyYW1ldGVyc1ZhbHVlVHlwZSkpfSkscz1CO2JyZWFrfWNhc2UgaC5Qb2x5RGF0YTp7bGV0IEI9c0EoQSxuKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9RihBLG4sMCx6LkZsb2F0MzIpOkIucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksQi52ZXJ0aWNlc0J1ZmZlclNpemU+MD9CLnZlcnRpY2VzPUYoQSxuLDEsUi5VSW50MzIpOkIudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEIubGluZXNCdWZmZXJTaXplPjA/Qi5saW5lcz1GKEEsbiwyLFIuVUludDMyKTpCLmxpbmVzPW5ldyBVaW50MzJBcnJheSxCLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0IucG9seWdvbnM9RihBLG4sMyxSLlVJbnQzMik6Qi5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksQi50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9CLnRyaWFuZ2xlU3RyaXBzPUYoQSxuLDQsUi5VSW50MzIpOkIudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPUYoQSxuLDUsQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkIucG9pbnREYXRhPUgoQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbFBpeGVscz4wP0IuY2VsbERhdGE9RihBLG4sNixCLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpCLmNlbGxEYXRhPUgoQi5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHM9QjticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBmPXt0eXBlOmEudHlwZSxkYXRhOnN9O1EucHVzaChmKX0pLHtyZXR1cm5WYWx1ZTpvLHN0ZG91dDpnLHN0ZGVycjpDLG91dHB1dHM6UX19dmFyIGxlPWVyO3ZhciBJcj10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gcnIoQSx0KXtpZihBPT1udWxsKXJldHVybltdO2xldCBlPVtdO2ZvcihsZXQgST0wO0k8QS5sZW5ndGg7SSsrKXtsZXQgcj1vcihBW0ldLHQpO3IhPT1udWxsJiZlLnB1c2gocil9cmV0dXJuIGV9ZnVuY3Rpb24gb3IoQSx0KXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCBlPW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP2U9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYoZT1BKSxJciYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6dD9lOmUuc2xpY2UoMCl9dmFyIHVlPXJyO2Z1bmN0aW9uIGdyKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBEZT1ncjtmdW5jdGlvbiBpcihBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgaGU9aXI7ZnVuY3Rpb24gbnIoQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGRlPW5yO2FzeW5jIGZ1bmN0aW9uIHNyKEEsdCxlLEkpe2xldCByPWxlKEEsdCxlLEkpLG89W107cmV0dXJuIHIub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2lmKGcudHlwZT09PWguQmluYXJ5U3RyZWFtfHxnLnR5cGU9PT1oLkJpbmFyeUZpbGUpe2xldCBDPWcuZGF0YTtvLnB1c2goQyl9ZWxzZSBpZihnLnR5cGU9PT1oLkltYWdlKXtsZXQgQz1nLmRhdGE7by5wdXNoKC4uLkRlKEMpKX1lbHNlIGlmKGcudHlwZT09PWguTWVzaCl7bGV0IEM9Zy5kYXRhO28ucHVzaCguLi5oZShDKSl9ZWxzZSBpZihnLnR5cGU9PT1oLlBvbHlEYXRhKXtsZXQgQz1nLmRhdGE7by5wdXNoKC4uLmRlKEMpKX19KSxNQShyLHVlKG8sITApKX12YXIgeWU9c3I7dmFyIENyPXtydW5QaXBlbGluZTphc3luYyBmdW5jdGlvbihBLHQsZSxJLHIsbyl7bGV0IGc9YXdhaXQgYWUoQSx0LG8pO3JldHVybiBhd2FpdCB5ZShnLGUsSSxyKX19O2ZBKENyKTslMEEvKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOiUwQSUwQWNvbWxpbmsvZGlzdC9lc20vY29tbGluay5tanM6JTBBICAoKiolMEEgICAqIEBsaWNlbnNlJTBBICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDJTBBICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCUwQSAgICopJTBBKi8lMEEnO1R0KEt0KTtleHBvcnR7eHIgYXMgZGVmYXVsdFBhcmFtZXRlck1hcCxXciBhcyBlbGFzdGl4LFAgYXMgZ2V0RGVmYXVsdFdlYldvcmtlcixIIGFzIGdldFBpcGVsaW5lV29ya2VyVXJsLHggYXMgZ2V0UGlwZWxpbmVzQmFzZVVybCx2ciBhcyByZWFkUGFyYW1ldGVyRmlsZXMsRmEgYXMgc2V0RGVmYXVsdFdlYldvcmtlcixUdCBhcyBzZXRQaXBlbGluZVdvcmtlclVybCxkYSBhcyBzZXRQaXBlbGluZXNCYXNlVXJsLGp0IGFzIHZlcnNpb24sVnIgYXMgd3JpdGVQYXJhbWV0ZXJGaWxlc307Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246Cgpjb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAgICopCiovCg==""" +default_js_module = """data:text/javascript;base64,dmFyIHh0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgUHQ9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSl4dChBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIFd0PSIxLjAuMiIsanQ9V3Q7dmFyIHZ0PXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sVT12dDt2YXIgWnQ9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LGo9WnQ7ZnVuY3Rpb24gVnQoQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIFUuVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBVLkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIFUuVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIFUuSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSBVLlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSBVLkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgVS5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBVLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIGouRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2Ugai5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIEo9VnQ7dmFyIFh0PXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm1MaXN0OiJUcmFuc2Zvcm1MaXN0IixKc29uQ29tcGF0aWJsZToiSnNvbkNvbXBhdGlibGUifSx1PVh0O3ZhciBSZT1TeW1ib2woIkNvbWxpbmsucHJveHkiKSx6dD1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxaQT1TeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5IiksakE9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLERBPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxVZT1BPT50eXBlb2YgQT09Im9iamVjdCImJkEhPT1udWxsfHx0eXBlb2YgQT09ImZ1bmN0aW9uIixfdD17Y2FuSGFuZGxlOkE9PlVlKEEpJiZBW1JlXSxzZXJpYWxpemUoQSl7bGV0e3BvcnQxOmUscG9ydDI6dH09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBOZShBLGUpLFt0LFt0XV19LGRlc2VyaWFsaXplKEEpe3JldHVybiBBLnN0YXJ0KCksVkEoQSl9fSwkdD17Y2FuSGFuZGxlOkE9PlVlKEEpJiZEQSBpbiBBLHNlcmlhbGl6ZSh7dmFsdWU6QX0pe2xldCBlO3JldHVybiBBIGluc3RhbmNlb2YgRXJyb3I/ZT17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTpBLm1lc3NhZ2UsbmFtZTpBLm5hbWUsc3RhY2s6QS5zdGFja319OmU9e2lzRXJyb3I6ITEsdmFsdWU6QX0sW2UsW11dfSxkZXNlcmlhbGl6ZShBKXt0aHJvdyBBLmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoQS52YWx1ZS5tZXNzYWdlKSxBLnZhbHVlKTpBLnZhbHVlfX0sa2U9bmV3IE1hcChbWyJwcm94eSIsX3RdLFsidGhyb3ciLCR0XV0pO2Z1bmN0aW9uIEFJKEEsZSl7Zm9yKGxldCB0IG9mIEEpaWYoZT09PXR8fHQ9PT0iKiJ8fHQgaW5zdGFuY2VvZiBSZWdFeHAmJnQudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBOZShBLGU9Z2xvYmFsVGhpcyx0PVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIEkocil7aWYoIXJ8fCFyLmRhdGEpcmV0dXJuO2lmKCFBSSh0LHIub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtyLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDppLHR5cGU6ZyxwYXRoOnN9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LHIuZGF0YSksbD0oci5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcCh2KSxDO3RyeXtsZXQgbz1zLnNsaWNlKDAsLTEpLnJlZHVjZSgoYyxCKT0+Y1tCXSxBKSxhPXMucmVkdWNlKChjLEIpPT5jW0JdLEEpO3N3aXRjaChnKXtjYXNlIkdFVCI6Qz1hO2JyZWFrO2Nhc2UiU0VUIjpvW3Muc2xpY2UoLTEpWzBdXT12KHIuZGF0YS52YWx1ZSksQz0hMDticmVhaztjYXNlIkFQUExZIjpDPWEuYXBwbHkobyxsKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBjPW5ldyBhKC4uLmwpO0M9aUkoYyl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpjLHBvcnQyOkJ9PW5ldyBNZXNzYWdlQ2hhbm5lbDtOZShBLEIpLEM9WEEoYyxbY10pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6Qz12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKG8pe0M9e3ZhbHVlOm8sW0RBXTowfX1Qcm9taXNlLnJlc29sdmUoQykuY2F0Y2gobz0+KHt2YWx1ZTpvLFtEQV06MH0pKS50aGVuKG89PntsZXRbYSxjXT13QShvKTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aWQ6aX0pLGMpLGc9PT0iUkVMRUFTRSImJihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEkpLEdlKGUpLGpBIGluIEEmJnR5cGVvZiBBW2pBXT09ImZ1bmN0aW9uIiYmQVtqQV0oKSl9KS5jYXRjaChvPT57bGV0W2EsY109d0Eoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtEQV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtpZDppfSksYyl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBlSShBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBHZShBKXtlSShBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIFZBKEEsZSl7cmV0dXJuIHZBKEEsW10sZSl9ZnVuY3Rpb24gaEEoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIGJlKEEpe3JldHVybiBWKEEse3R5cGU6IlJFTEVBU0UifSkudGhlbigoKT0+e0dlKEEpfSl9dmFyIHlBPW5ldyBXZWFrTWFwLG1BPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoQT0+e2xldCBlPSh5QS5nZXQoQSl8fDApLTE7eUEuc2V0KEEsZSksZT09PTAmJmJlKEEpfSk7ZnVuY3Rpb24gdEkoQSxlKXtsZXQgdD0oeUEuZ2V0KGUpfHwwKSsxO3lBLnNldChlLHQpLG1BJiZtQS5yZWdpc3RlcihBLGUsQSl9ZnVuY3Rpb24gSUkoQSl7bUEmJm1BLnVucmVnaXN0ZXIoQSl9ZnVuY3Rpb24gdkEoQSxlPVtdLHQ9ZnVuY3Rpb24oKXt9KXtsZXQgST0hMSxyPW5ldyBQcm94eSh0LHtnZXQoaSxnKXtpZihoQShJKSxnPT09WkEpcmV0dXJuKCk9PntJSShyKSxiZShBKSxJPSEwfTtpZihnPT09InRoZW4iKXtpZihlLmxlbmd0aD09PTApcmV0dXJue3RoZW46KCk9PnJ9O2xldCBzPVYoQSx7dHlwZToiR0VUIixwYXRoOmUubWFwKGw9PmwudG9TdHJpbmcoKSl9KS50aGVuKHYpO3JldHVybiBzLnRoZW4uYmluZChzKX1yZXR1cm4gdkEoQSxbLi4uZSxnXSl9LHNldChpLGcscyl7aEEoSSk7bGV0W2wsQ109d0Eocyk7cmV0dXJuIFYoQSx7dHlwZToiU0VUIixwYXRoOlsuLi5lLGddLm1hcChvPT5vLnRvU3RyaW5nKCkpLHZhbHVlOmx9LEMpLnRoZW4odil9LGFwcGx5KGksZyxzKXtoQShJKTtsZXQgbD1lW2UubGVuZ3RoLTFdO2lmKGw9PT16dClyZXR1cm4gVihBLHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKHYpO2lmKGw9PT0iYmluZCIpcmV0dXJuIHZBKEEsZS5zbGljZSgwLC0xKSk7bGV0W0Msb109RmUocyk7cmV0dXJuIFYoQSx7dHlwZToiQVBQTFkiLHBhdGg6ZS5tYXAoYT0+YS50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6Q30sbykudGhlbih2KX0sY29uc3RydWN0KGksZyl7aEEoSSk7bGV0W3MsbF09RmUoZyk7cmV0dXJuIFYoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOmUubWFwKEM9PkMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnN9LGwpLnRoZW4odil9fSk7cmV0dXJuIHRJKHIsQSkscn1mdW5jdGlvbiBySShBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBGZShBKXtsZXQgZT1BLm1hcCh3QSk7cmV0dXJuW2UubWFwKHQ9PnRbMF0pLHJJKGUubWFwKHQ9PnRbMV0pKV19dmFyIExlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFhBKEEsZSl7cmV0dXJuIExlLnNldChBLGUpLEF9ZnVuY3Rpb24gaUkoQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W1JlXTohMH0pfWZ1bmN0aW9uIHdBKEEpe2ZvcihsZXRbZSx0XW9mIGtlKWlmKHQuY2FuSGFuZGxlKEEpKXtsZXRbSSxyXT10LnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6ZSx2YWx1ZTpJfSxyXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0sTGUuZ2V0KEEpfHxbXV19ZnVuY3Rpb24gdihBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBrZS5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIFYoQSxlLHQpe3JldHVybiBuZXcgUHJvbWlzZShJPT57bGV0IHI9Z0koKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoZyl7IWcuZGF0YXx8IWcuZGF0YS5pZHx8Zy5kYXRhLmlkIT09cnx8KEEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSksSShnLmRhdGEpKX0pLEEuc3RhcnQmJkEuc3RhcnQoKSxBLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnJ9LGUpLHQpfSl9ZnVuY3Rpb24gZ0koKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfWZ1bmN0aW9uIHJBKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6b0l9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOl9BfT1PYmplY3Qse2l0ZXJhdG9yOkZBLHRvU3RyaW5nVGFnOlllfT1TeW1ib2wsUkE9KEE9PmU9PntsZXQgdD1vSS5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksRz1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+UkEoZSk9PT1BKSxVQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6WH09QXJyYXksaUE9VUEoInVuZGVmaW5lZCIpO2Z1bmN0aW9uIGdBKEEpe3JldHVybiBBIT09bnVsbCYmIWlBKEEpJiZBLmNvbnN0cnVjdG9yIT09bnVsbCYmIWlBKEEuY29uc3RydWN0b3IpJiZrKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciBIZT1HKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIG5JKEEpe2xldCBlO3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/ZT1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6ZT1BJiZBLmJ1ZmZlciYmSGUoQS5idWZmZXIpLGV9dmFyIGFJPVVBKCJzdHJpbmciKSxrPVVBKCJmdW5jdGlvbiIpLHFlPVVBKCJudW1iZXIiKSxvQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLHNJPUE9PkE9PT0hMHx8QT09PSExLFNBPUE9PntpZihSQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCBlPV9BKEEpO3JldHVybihlPT09bnVsbHx8ZT09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGwpJiYhKFllIGluIEEpJiYhKEZBIGluIEEpfSxDST1BPT57aWYoIW9BKEEpfHxnQShBKSlyZXR1cm4hMTt0cnl7cmV0dXJuIE9iamVjdC5rZXlzKEEpLmxlbmd0aD09PTAmJk9iamVjdC5nZXRQcm90b3R5cGVPZihBKT09PU9iamVjdC5wcm90b3R5cGV9Y2F0Y2h7cmV0dXJuITF9fSxCST1HKCJEYXRlIiksUUk9RygiRmlsZSIpLEVJPUcoIkJsb2IiKSxsST1HKCJGaWxlTGlzdCIpLGNJPUE9Pm9BKEEpJiZrKEEucGlwZSksZkk9QT0+e2xldCBlO3JldHVybiBBJiYodHlwZW9mIEZvcm1EYXRhPT0iZnVuY3Rpb24iJiZBIGluc3RhbmNlb2YgRm9ybURhdGF8fGsoQS5hcHBlbmQpJiYoKGU9UkEoQSkpPT09ImZvcm1kYXRhInx8ZT09PSJvYmplY3QiJiZrKEEudG9TdHJpbmcpJiZBLnRvU3RyaW5nKCk9PT0iW29iamVjdCBGb3JtRGF0YV0iKSl9LHVJPUcoIlVSTFNlYXJjaFBhcmFtcyIpLFtwSSxkSSxoSSxESV09WyJSZWFkYWJsZVN0cmVhbSIsIlJlcXVlc3QiLCJSZXNwb25zZSIsIkhlYWRlcnMiXS5tYXAoRykseUk9QT0+QS50cmltP0EudHJpbSgpOkEucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpO2Z1bmN0aW9uIG5BKEEsZSx7YWxsT3duS2V5czp0PSExfT17fSl7aWYoQT09PW51bGx8fHR5cGVvZiBBPiJ1IilyZXR1cm47bGV0IEkscjtpZih0eXBlb2YgQSE9Im9iamVjdCImJihBPVtBXSksWChBKSlmb3IoST0wLHI9QS5sZW5ndGg7STxyO0krKyllLmNhbGwobnVsbCxBW0ldLEksQSk7ZWxzZXtpZihnQShBKSlyZXR1cm47bGV0IGk9dD9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKTpPYmplY3Qua2V5cyhBKSxnPWkubGVuZ3RoLHM7Zm9yKEk9MDtJPGc7SSsrKXM9aVtJXSxlLmNhbGwobnVsbCxBW3NdLHMsQSl9fWZ1bmN0aW9uIE9lKEEsZSl7aWYoZ0EoQSkpcmV0dXJuIG51bGw7ZT1lLnRvTG93ZXJDYXNlKCk7bGV0IHQ9T2JqZWN0LmtleXMoQSksST10Lmxlbmd0aCxyO2Zvcig7SS0tID4wOylpZihyPXRbSV0sZT09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4gcjtyZXR1cm4gbnVsbH12YXIgWj10eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6Z2xvYmFsLFRlPUE9PiFpQShBKSYmQSE9PVo7ZnVuY3Rpb24gekEoKXtsZXR7Y2FzZWxlc3M6QX09VGUodGhpcykmJnRoaXN8fHt9LGU9e30sdD0oSSxyKT0+e2xldCBpPUEmJk9lKGUscil8fHI7U0EoZVtpXSkmJlNBKEkpP2VbaV09ekEoZVtpXSxJKTpTQShJKT9lW2ldPXpBKHt9LEkpOlgoSSk/ZVtpXT1JLnNsaWNlKCk6ZVtpXT1JfTtmb3IobGV0IEk9MCxyPWFyZ3VtZW50cy5sZW5ndGg7STxyO0krKylhcmd1bWVudHNbSV0mJm5BKGFyZ3VtZW50c1tJXSx0KTtyZXR1cm4gZX12YXIgbUk9KEEsZSx0LHthbGxPd25LZXlzOkl9PXt9KT0+KG5BKGUsKHIsaSk9Pnt0JiZrKHIpP0FbaV09ckEocix0KTpBW2ldPXJ9LHthbGxPd25LZXlzOkl9KSxBKSx3ST1BPT4oQS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihBPUEuc2xpY2UoMSkpLEEpLFNJPShBLGUsdCxJKT0+e0EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUsSSksQS5wcm90b3R5cGUuY29uc3RydWN0b3I9QSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwic3VwZXIiLHt2YWx1ZTplLnByb3RvdHlwZX0pLHQmJk9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUsdCl9LEZJPShBLGUsdCxJKT0+e2xldCByLGksZyxzPXt9O2lmKGU9ZXx8e30sQT09bnVsbClyZXR1cm4gZTtkb3tmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKSxpPXIubGVuZ3RoO2ktLSA+MDspZz1yW2ldLCghSXx8SShnLEEsZSkpJiYhc1tnXSYmKGVbZ109QVtnXSxzW2ddPSEwKTtBPXQhPT0hMSYmX0EoQSl9d2hpbGUoQSYmKCF0fHx0KEEsZSkpJiZBIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIGV9LFJJPShBLGUsdCk9PntBPVN0cmluZyhBKSwodD09PXZvaWQgMHx8dD5BLmxlbmd0aCkmJih0PUEubGVuZ3RoKSx0LT1lLmxlbmd0aDtsZXQgST1BLmluZGV4T2YoZSx0KTtyZXR1cm4gSSE9PS0xJiZJPT09dH0sVUk9QT0+e2lmKCFBKXJldHVybiBudWxsO2lmKFgoQSkpcmV0dXJuIEE7bGV0IGU9QS5sZW5ndGg7aWYoIXFlKGUpKXJldHVybiBudWxsO2xldCB0PW5ldyBBcnJheShlKTtmb3IoO2UtLSA+MDspdFtlXT1BW2VdO3JldHVybiB0fSxrST0oQT0+ZT0+QSYmZSBpbnN0YW5jZW9mIEEpKHR5cGVvZiBVaW50OEFycmF5PCJ1IiYmX0EoVWludDhBcnJheSkpLE5JPShBLGUpPT57bGV0IEk9KEEmJkFbRkFdKS5jYWxsKEEpLHI7Zm9yKDsocj1JLm5leHQoKSkmJiFyLmRvbmU7KXtsZXQgaT1yLnZhbHVlO2UuY2FsbChBLGlbMF0saVsxXSl9fSxHST0oQSxlKT0+e2xldCB0LEk9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspSS5wdXNoKHQpO3JldHVybiBJfSxiST1HKCJIVE1MRm9ybUVsZW1lbnQiKSxMST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LEkscil7cmV0dXJuIEkudG9VcHBlckNhc2UoKStyfSksTWU9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLEpJPUcoIlJlZ0V4cCIpLEtlPShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSksST17fTtuQSh0LChyLGkpPT57bGV0IGc7KGc9ZShyLGksQSkpIT09ITEmJihJW2ldPWd8fHIpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxJKX0sTUk9QT0+e0tlKEEsKGUsdCk9PntpZihrKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YodCkhPT0tMSlyZXR1cm4hMTtsZXQgST1BW3RdO2lmKGsoSSkpe2lmKGUuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gZSl7ZS53cml0YWJsZT0hMTtyZXR1cm59ZS5zZXR8fChlLnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCAnIit0KyInIil9KX19KX0sWUk9KEEsZSk9PntsZXQgdD17fSxJPXI9PntyLmZvckVhY2goaT0+e3RbaV09ITB9KX07cmV0dXJuIFgoQSk/SShBKTpJKFN0cmluZyhBKS5zcGxpdChlKSksdH0sSEk9KCk9Pnt9LHFJPShBLGUpPT5BIT1udWxsJiZOdW1iZXIuaXNGaW5pdGUoQT0rQSk/QTplO2Z1bmN0aW9uIE9JKEEpe3JldHVybiEhKEEmJmsoQS5hcHBlbmQpJiZBW1llXT09PSJGb3JtRGF0YSImJkFbRkFdKX12YXIgVEk9QT0+e2xldCBlPW5ldyBBcnJheSgxMCksdD0oSSxyKT0+e2lmKG9BKEkpKXtpZihlLmluZGV4T2YoSSk+PTApcmV0dXJuO2lmKGdBKEkpKXJldHVybiBJO2lmKCEoInRvSlNPTiJpbiBJKSl7ZVtyXT1JO2xldCBpPVgoSSk/W106e307cmV0dXJuIG5BKEksKGcscyk9PntsZXQgbD10KGcscisxKTshaUEobCkmJihpW3NdPWwpfSksZVtyXT12b2lkIDAsaX19cmV0dXJuIEl9O3JldHVybiB0KEEsMCl9LEtJPUcoIkFzeW5jRnVuY3Rpb24iKSx4ST1BPT5BJiYob0EoQSl8fGsoQSkpJiZrKEEudGhlbikmJmsoQS5jYXRjaCkseGU9KChBLGUpPT5BP3NldEltbWVkaWF0ZTplPygodCxJKT0+KFouYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtzb3VyY2U6cixkYXRhOml9KT0+e3I9PT1aJiZpPT09dCYmSS5sZW5ndGgmJkkuc2hpZnQoKSgpfSwhMSkscj0+e0kucHVzaChyKSxaLnBvc3RNZXNzYWdlKHQsIioiKX0pKShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsW10pOnQ9PnNldFRpbWVvdXQodCkpKHR5cGVvZiBzZXRJbW1lZGlhdGU9PSJmdW5jdGlvbiIsayhaLnBvc3RNZXNzYWdlKSksUEk9dHlwZW9mIHF1ZXVlTWljcm90YXNrPCJ1Ij9xdWV1ZU1pY3JvdGFzay5iaW5kKFopOnR5cGVvZiBwcm9jZXNzPCJ1IiYmcHJvY2Vzcy5uZXh0VGlja3x8eGUsV0k9QT0+QSE9bnVsbCYmayhBW0ZBXSksbj17aXNBcnJheTpYLGlzQXJyYXlCdWZmZXI6SGUsaXNCdWZmZXI6Z0EsaXNGb3JtRGF0YTpmSSxpc0FycmF5QnVmZmVyVmlldzpuSSxpc1N0cmluZzphSSxpc051bWJlcjpxZSxpc0Jvb2xlYW46c0ksaXNPYmplY3Q6b0EsaXNQbGFpbk9iamVjdDpTQSxpc0VtcHR5T2JqZWN0OkNJLGlzUmVhZGFibGVTdHJlYW06cEksaXNSZXF1ZXN0OmRJLGlzUmVzcG9uc2U6aEksaXNIZWFkZXJzOkRJLGlzVW5kZWZpbmVkOmlBLGlzRGF0ZTpCSSxpc0ZpbGU6UUksaXNCbG9iOkVJLGlzUmVnRXhwOkpJLGlzRnVuY3Rpb246ayxpc1N0cmVhbTpjSSxpc1VSTFNlYXJjaFBhcmFtczp1SSxpc1R5cGVkQXJyYXk6a0ksaXNGaWxlTGlzdDpsSSxmb3JFYWNoOm5BLG1lcmdlOnpBLGV4dGVuZDptSSx0cmltOnlJLHN0cmlwQk9NOndJLGluaGVyaXRzOlNJLHRvRmxhdE9iamVjdDpGSSxraW5kT2Y6UkEsa2luZE9mVGVzdDpHLGVuZHNXaXRoOlJJLHRvQXJyYXk6VUksZm9yRWFjaEVudHJ5Ok5JLG1hdGNoQWxsOkdJLGlzSFRNTEZvcm06YkksaGFzT3duUHJvcGVydHk6TWUsaGFzT3duUHJvcDpNZSxyZWR1Y2VEZXNjcmlwdG9yczpLZSxmcmVlemVNZXRob2RzOk1JLHRvT2JqZWN0U2V0OllJLHRvQ2FtZWxDYXNlOkxJLG5vb3A6SEksdG9GaW5pdGVOdW1iZXI6cUksZmluZEtleTpPZSxnbG9iYWw6Wixpc0NvbnRleHREZWZpbmVkOlRlLGlzU3BlY0NvbXBsaWFudEZvcm06T0ksdG9KU09OT2JqZWN0OlRJLGlzQXN5bmNGbjpLSSxpc1RoZW5hYmxlOnhJLHNldEltbWVkaWF0ZTp4ZSxhc2FwOlBJLGlzSXRlcmFibGU6V0l9O2Z1bmN0aW9uIHooQSxlLHQsSSxyKXtFcnJvci5jYWxsKHRoaXMpLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6dGhpcy5zdGFjaz1uZXcgRXJyb3IoKS5zdGFjayx0aGlzLm1lc3NhZ2U9QSx0aGlzLm5hbWU9IkF4aW9zRXJyb3IiLGUmJih0aGlzLmNvZGU9ZSksdCYmKHRoaXMuY29uZmlnPXQpLEkmJih0aGlzLnJlcXVlc3Q9SSksciYmKHRoaXMucmVzcG9uc2U9cix0aGlzLnN0YXR1cz1yLnN0YXR1cz9yLnN0YXR1czpudWxsKX1uLmluaGVyaXRzKHosRXJyb3Ise3RvSlNPTjpmdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpuLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMuc3RhdHVzfX19KTt2YXIgUGU9ei5wcm90b3R5cGUsV2U9e307WyJFUlJfQkFEX09QVElPTl9WQUxVRSIsIkVSUl9CQURfT1BUSU9OIiwiRUNPTk5BQk9SVEVEIiwiRVRJTUVET1VUIiwiRVJSX05FVFdPUksiLCJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTIiwiRVJSX0RFUFJFQ0FURUQiLCJFUlJfQkFEX1JFU1BPTlNFIiwiRVJSX0JBRF9SRVFVRVNUIiwiRVJSX0NBTkNFTEVEIiwiRVJSX05PVF9TVVBQT1JUIiwiRVJSX0lOVkFMSURfVVJMIl0uZm9yRWFjaChBPT57V2VbQV09e3ZhbHVlOkF9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeixXZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFBlLCJpc0F4aW9zRXJyb3IiLHt2YWx1ZTohMH0pO3ouZnJvbT0oQSxlLHQsSSxyLGkpPT57bGV0IGc9T2JqZWN0LmNyZWF0ZShQZSk7cmV0dXJuIG4udG9GbGF0T2JqZWN0KEEsZyxmdW5jdGlvbihsKXtyZXR1cm4gbCE9PUVycm9yLnByb3RvdHlwZX0scz0+cyE9PSJpc0F4aW9zRXJyb3IiKSx6LmNhbGwoZyxBLm1lc3NhZ2UsZSx0LEksciksZy5jYXVzZT1BLGcubmFtZT1BLm5hbWUsaSYmT2JqZWN0LmFzc2lnbihnLGkpLGd9O3ZhciBwPXo7dmFyIGtBPW51bGw7ZnVuY3Rpb24gJEEoQSl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChBKXx8bi5pc0FycmF5KEEpfWZ1bmN0aW9uIHZlKEEpe3JldHVybiBuLmVuZHNXaXRoKEEsIltdIik/QS5zbGljZSgwLC0yKTpBfWZ1bmN0aW9uIGplKEEsZSx0KXtyZXR1cm4gQT9BLmNvbmNhdChlKS5tYXAoZnVuY3Rpb24ocixpKXtyZXR1cm4gcj12ZShyKSwhdCYmaT8iWyIrcisiXSI6cn0pLmpvaW4odD8iLiI6IiIpOmV9ZnVuY3Rpb24gakkoQSl7cmV0dXJuIG4uaXNBcnJheShBKSYmIUEuc29tZSgkQSl9dmFyIHZJPW4udG9GbGF0T2JqZWN0KG4se30sbnVsbCxmdW5jdGlvbihlKXtyZXR1cm4vXmlzW0EtWl0vLnRlc3QoZSl9KTtmdW5jdGlvbiBaSShBLGUsdCl7aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7ZT1lfHxuZXcoa0F8fEZvcm1EYXRhKSx0PW4udG9GbGF0T2JqZWN0KHQse21ldGFUb2tlbnM6ITAsZG90czohMSxpbmRleGVzOiExfSwhMSxmdW5jdGlvbihmLFEpe3JldHVybiFuLmlzVW5kZWZpbmVkKFFbZl0pfSk7bGV0IEk9dC5tZXRhVG9rZW5zLHI9dC52aXNpdG9yfHxvLGk9dC5kb3RzLGc9dC5pbmRleGVzLGw9KHQuQmxvYnx8dHlwZW9mIEJsb2I8InUiJiZCbG9iKSYmbi5pc1NwZWNDb21wbGlhbnRGb3JtKGUpO2lmKCFuLmlzRnVuY3Rpb24ocikpdGhyb3cgbmV3IFR5cGVFcnJvcigidmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmdW5jdGlvbiBDKEUpe2lmKEU9PT1udWxsKXJldHVybiIiO2lmKG4uaXNEYXRlKEUpKXJldHVybiBFLnRvSVNPU3RyaW5nKCk7aWYobi5pc0Jvb2xlYW4oRSkpcmV0dXJuIEUudG9TdHJpbmcoKTtpZighbCYmbi5pc0Jsb2IoRSkpdGhyb3cgbmV3IHAoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIG4uaXNBcnJheUJ1ZmZlcihFKXx8bi5pc1R5cGVkQXJyYXkoRSk/bCYmdHlwZW9mIEJsb2I9PSJmdW5jdGlvbiI/bmV3IEJsb2IoW0VdKTpCdWZmZXIuZnJvbShFKTpFfWZ1bmN0aW9uIG8oRSxmLFEpe2xldCBkPUU7aWYoRSYmIVEmJnR5cGVvZiBFPT0ib2JqZWN0Iil7aWYobi5lbmRzV2l0aChmLCJ7fSIpKWY9ST9mOmYuc2xpY2UoMCwtMiksRT1KU09OLnN0cmluZ2lmeShFKTtlbHNlIGlmKG4uaXNBcnJheShFKSYmakkoRSl8fChuLmlzRmlsZUxpc3QoRSl8fG4uZW5kc1dpdGgoZiwiW10iKSkmJihkPW4udG9BcnJheShFKSkpcmV0dXJuIGY9dmUoZiksZC5mb3JFYWNoKGZ1bmN0aW9uKHksTyl7IShuLmlzVW5kZWZpbmVkKHkpfHx5PT09bnVsbCkmJmUuYXBwZW5kKGc9PT0hMD9qZShbZl0sTyxpKTpnPT09bnVsbD9mOmYrIltdIixDKHkpKX0pLCExfXJldHVybiAkQShFKT8hMDooZS5hcHBlbmQoamUoUSxmLGkpLEMoRSkpLCExKX1sZXQgYT1bXSxjPU9iamVjdC5hc3NpZ24odkkse2RlZmF1bHRWaXNpdG9yOm8sY29udmVydFZhbHVlOkMsaXNWaXNpdGFibGU6JEF9KTtmdW5jdGlvbiBCKEUsZil7aWYoIW4uaXNVbmRlZmluZWQoRSkpe2lmKGEuaW5kZXhPZihFKSE9PS0xKXRocm93IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gIitmLmpvaW4oIi4iKSk7YS5wdXNoKEUpLG4uZm9yRWFjaChFLGZ1bmN0aW9uKGQsaCl7KCEobi5pc1VuZGVmaW5lZChkKXx8ZD09PW51bGwpJiZyLmNhbGwoZSxkLG4uaXNTdHJpbmcoaCk/aC50cmltKCk6aCxmLGMpKT09PSEwJiZCKGQsZj9mLmNvbmNhdChoKTpbaF0pfSksYS5wb3AoKX19aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSBtdXN0IGJlIGFuIG9iamVjdCIpO3JldHVybiBCKEEpLGV9dmFyIHg9Wkk7ZnVuY3Rpb24gWmUoQSl7bGV0IGU9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisiLCIlMDAiOiJcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csZnVuY3Rpb24oSSl7cmV0dXJuIGVbSV19KX1mdW5jdGlvbiBWZShBLGUpe3RoaXMuX3BhaXJzPVtdLEEmJngoQSx0aGlzLGUpfXZhciBYZT1WZS5wcm90b3R5cGU7WGUuYXBwZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy5fcGFpcnMucHVzaChbZSx0XSl9O1hlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe2xldCB0PWU/ZnVuY3Rpb24oSSl7cmV0dXJuIGUuY2FsbCh0aGlzLEksWmUpfTpaZTtyZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uKHIpe3JldHVybiB0KHJbMF0pKyI9Iit0KHJbMV0pfSwiIikuam9pbigiJiIpfTt2YXIgTkE9VmU7ZnVuY3Rpb24gVkkoQSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9ZnVuY3Rpb24gYUEoQSxlLHQpe2lmKCFlKXJldHVybiBBO2xldCBJPXQmJnQuZW5jb2RlfHxWSTtuLmlzRnVuY3Rpb24odCkmJih0PXtzZXJpYWxpemU6dH0pO2xldCByPXQmJnQuc2VyaWFsaXplLGk7aWYocj9pPXIoZSx0KTppPW4uaXNVUkxTZWFyY2hQYXJhbXMoZSk/ZS50b1N0cmluZygpOm5ldyBOQShlLHQpLnRvU3RyaW5nKEkpLGkpe2xldCBnPUEuaW5kZXhPZigiIyIpO2chPT0tMSYmKEE9QS5zbGljZSgwLGcpKSxBKz0oQS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStpfXJldHVybiBBfXZhciBBZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaGFuZGxlcnM9W119dXNlKGUsdCxJKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOkk/SS5zeW5jaHJvbm91czohMSxydW5XaGVuOkk/SS5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfWVqZWN0KGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfWNsZWFyKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfWZvckVhY2goZSl7bi5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oSSl7SSE9PW51bGwmJmUoSSl9KX19LGVlPUFlO3ZhciBHQT17c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX07dmFyIHplPXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM8InUiP1VSTFNlYXJjaFBhcmFtczpOQTt2YXIgX2U9dHlwZW9mIEZvcm1EYXRhPCJ1Ij9Gb3JtRGF0YTpudWxsO3ZhciAkZT10eXBlb2YgQmxvYjwidSI/QmxvYjpudWxsO3ZhciBBdD17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczp6ZSxGb3JtRGF0YTpfZSxCbG9iOiRlfSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07dmFyIHJlPXt9O1B0KHJlLHtoYXNCcm93c2VyRW52OigpPT5JZSxoYXNTdGFuZGFyZEJyb3dzZXJFbnY6KCk9PlhJLGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjooKT0+ekksbmF2aWdhdG9yOigpPT50ZSxvcmlnaW46KCk9Pl9JfSk7dmFyIEllPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLHRlPXR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3J8fHZvaWQgMCxYST1JZSYmKCF0ZXx8WyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZih0ZS5wcm9kdWN0KTwwKSx6ST10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8InUiJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsX0k9SWUmJndpbmRvdy5sb2NhdGlvbi5ocmVmfHwiaHR0cDovL2xvY2FsaG9zdCI7dmFyIEQ9ey4uLnJlLC4uLkF0fTtmdW5jdGlvbiBpZShBLGUpe3JldHVybiB4KEEsbmV3IEQuY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMse3Zpc2l0b3I6ZnVuY3Rpb24odCxJLHIsaSl7cmV0dXJuIEQuaXNOb2RlJiZuLmlzQnVmZmVyKHQpPyh0aGlzLmFwcGVuZChJLHQudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6aS5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LC4uLmV9KX1mdW5jdGlvbiAkSShBKXtyZXR1cm4gbi5tYXRjaEFsbCgvXHcrfFxbKFx3KildL2csQSkubWFwKGU9PmVbMF09PT0iW10iPyIiOmVbMV18fGVbMF0pfWZ1bmN0aW9uIEFyKEEpe2xldCBlPXt9LHQ9T2JqZWN0LmtleXMoQSksSSxyPXQubGVuZ3RoLGk7Zm9yKEk9MDtJPHI7SSsrKWk9dFtJXSxlW2ldPUFbaV07cmV0dXJuIGV9ZnVuY3Rpb24gZXIoQSl7ZnVuY3Rpb24gZSh0LEkscixpKXtsZXQgZz10W2krK107aWYoZz09PSJfX3Byb3RvX18iKXJldHVybiEwO2xldCBzPU51bWJlci5pc0Zpbml0ZSgrZyksbD1pPj10Lmxlbmd0aDtyZXR1cm4gZz0hZyYmbi5pc0FycmF5KHIpP3IubGVuZ3RoOmcsbD8obi5oYXNPd25Qcm9wKHIsZyk/cltnXT1bcltnXSxJXTpyW2ddPUksIXMpOigoIXJbZ118fCFuLmlzT2JqZWN0KHJbZ10pKSYmKHJbZ109W10pLGUodCxJLHJbZ10saSkmJm4uaXNBcnJheShyW2ddKSYmKHJbZ109QXIocltnXSkpLCFzKX1pZihuLmlzRm9ybURhdGEoQSkmJm4uaXNGdW5jdGlvbihBLmVudHJpZXMpKXtsZXQgdD17fTtyZXR1cm4gbi5mb3JFYWNoRW50cnkoQSwoSSxyKT0+e2UoJEkoSSkscix0LDApfSksdH1yZXR1cm4gbnVsbH12YXIgYkE9ZXI7ZnVuY3Rpb24gdHIoQSxlLHQpe2lmKG4uaXNTdHJpbmcoQSkpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShBKSxuLnRyaW0oQSl9Y2F0Y2goSSl7aWYoSS5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBJfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkoQSl9dmFyIGdlPXt0cmFuc2l0aW9uYWw6R0EsYWRhcHRlcjpbInhociIsImh0dHAiLCJmZXRjaCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7bGV0IEk9dC5nZXRDb250ZW50VHlwZSgpfHwiIixyPUkuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPi0xLGk9bi5pc09iamVjdChlKTtpZihpJiZuLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksbi5pc0Zvcm1EYXRhKGUpKXJldHVybiByP0pTT04uc3RyaW5naWZ5KGJBKGUpKTplO2lmKG4uaXNBcnJheUJ1ZmZlcihlKXx8bi5pc0J1ZmZlcihlKXx8bi5pc1N0cmVhbShlKXx8bi5pc0ZpbGUoZSl8fG4uaXNCbG9iKGUpfHxuLmlzUmVhZGFibGVTdHJlYW0oZSkpcmV0dXJuIGU7aWYobi5pc0FycmF5QnVmZmVyVmlldyhlKSlyZXR1cm4gZS5idWZmZXI7aWYobi5pc1VSTFNlYXJjaFBhcmFtcyhlKSlyZXR1cm4gdC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLCExKSxlLnRvU3RyaW5nKCk7bGV0IHM7aWYoaSl7aWYoSS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT4tMSlyZXR1cm4gaWUoZSx0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO2lmKChzPW4uaXNGaWxlTGlzdChlKSl8fEkuaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXtsZXQgbD10aGlzLmVudiYmdGhpcy5lbnYuRm9ybURhdGE7cmV0dXJuIHgocz97ImZpbGVzW10iOmV9OmUsbCYmbmV3IGwsdGhpcy5mb3JtU2VyaWFsaXplcil9fXJldHVybiBpfHxyPyh0LnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiwhMSksdHIoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7bGV0IHQ9dGhpcy50cmFuc2l0aW9uYWx8fGdlLnRyYW5zaXRpb25hbCxJPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcscj10aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihuLmlzUmVzcG9uc2UoZSl8fG4uaXNSZWFkYWJsZVN0cmVhbShlKSlyZXR1cm4gZTtpZihlJiZuLmlzU3RyaW5nKGUpJiYoSSYmIXRoaXMucmVzcG9uc2VUeXBlfHxyKSl7bGV0IGc9ISh0JiZ0LnNpbGVudEpTT05QYXJzaW5nKSYmcjt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2gocyl7aWYoZyl0aHJvdyBzLm5hbWU9PT0iU3ludGF4RXJyb3IiP3AuZnJvbShzLHAuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk6c319cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOkQuY2xhc3Nlcy5Gb3JtRGF0YSxCbG9iOkQuY2xhc3Nlcy5CbG9ifSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIsIkNvbnRlbnQtVHlwZSI6dm9pZCAwfX19O24uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giXSxBPT57Z2UuaGVhZGVyc1tBXT17fX0pO3ZhciBfPWdlO3ZhciBJcj1uLnRvT2JqZWN0U2V0KFsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0pLGV0PUE9PntsZXQgZT17fSx0LEkscjtyZXR1cm4gQSYmQS5zcGxpdChgCmApLmZvckVhY2goZnVuY3Rpb24oZyl7cj1nLmluZGV4T2YoIjoiKSx0PWcuc3Vic3RyaW5nKDAscikudHJpbSgpLnRvTG93ZXJDYXNlKCksST1nLnN1YnN0cmluZyhyKzEpLnRyaW0oKSwhKCF0fHxlW3RdJiZJclt0XSkmJih0PT09InNldC1jb29raWUiP2VbdF0/ZVt0XS5wdXNoKEkpOmVbdF09W0ldOmVbdF09ZVt0XT9lW3RdKyIsICIrSTpJKX0pLGV9O3ZhciB0dD1TeW1ib2woImludGVybmFscyIpO2Z1bmN0aW9uIHNBKEEpe3JldHVybiBBJiZTdHJpbmcoQSkudHJpbSgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gTEEoQSl7cmV0dXJuIEE9PT0hMXx8QT09bnVsbD9BOm4uaXNBcnJheShBKT9BLm1hcChMQSk6U3RyaW5nKEEpfWZ1bmN0aW9uIHJyKEEpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD0vKFteXHMsOz1dKylccyooPzo9XHMqKFteLDtdKykpPy9nLEk7Zm9yKDtJPXQuZXhlYyhBKTspZVtJWzFdXT1JWzJdO3JldHVybiBlfXZhciBpcj1BPT4vXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBvZShBLGUsdCxJLHIpe2lmKG4uaXNGdW5jdGlvbihJKSlyZXR1cm4gSS5jYWxsKHRoaXMsZSx0KTtpZihyJiYoZT10KSwhIW4uaXNTdHJpbmcoZSkpe2lmKG4uaXNTdHJpbmcoSSkpcmV0dXJuIGUuaW5kZXhPZihJKSE9PS0xO2lmKG4uaXNSZWdFeHAoSSkpcmV0dXJuIEkudGVzdChlKX19ZnVuY3Rpb24gZ3IoQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcZF0pKFx3KikvZywoZSx0LEkpPT50LnRvVXBwZXJDYXNlKCkrSSl9ZnVuY3Rpb24gb3IoQSxlKXtsZXQgdD1uLnRvQ2FtZWxDYXNlKCIgIitlKTtbImdldCIsInNldCIsImhhcyJdLmZvckVhY2goST0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLEkrdCx7dmFsdWU6ZnVuY3Rpb24ocixpLGcpe3JldHVybiB0aGlzW0ldLmNhbGwodGhpcyxlLHIsaSxnKX0sY29uZmlndXJhYmxlOiEwfSl9KX12YXIgJD1jbGFzc3tjb25zdHJ1Y3RvcihlKXtlJiZ0aGlzLnNldChlKX1zZXQoZSx0LEkpe2xldCByPXRoaXM7ZnVuY3Rpb24gaShzLGwsQyl7bGV0IG89c0EobCk7aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIpO2xldCBhPW4uZmluZEtleShyLG8pOyghYXx8clthXT09PXZvaWQgMHx8Qz09PSEwfHxDPT09dm9pZCAwJiZyW2FdIT09ITEpJiYoclthfHxsXT1MQShzKSl9bGV0IGc9KHMsbCk9Pm4uZm9yRWFjaChzLChDLG8pPT5pKEMsbyxsKSk7aWYobi5pc1BsYWluT2JqZWN0KGUpfHxlIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcilnKGUsdCk7ZWxzZSBpZihuLmlzU3RyaW5nKGUpJiYoZT1lLnRyaW0oKSkmJiFpcihlKSlnKGV0KGUpLHQpO2Vsc2UgaWYobi5pc09iamVjdChlKSYmbi5pc0l0ZXJhYmxlKGUpKXtsZXQgcz17fSxsLEM7Zm9yKGxldCBvIG9mIGUpe2lmKCFuLmlzQXJyYXkobykpdGhyb3cgVHlwZUVycm9yKCJPYmplY3QgaXRlcmF0b3IgbXVzdCByZXR1cm4gYSBrZXktdmFsdWUgcGFpciIpO3NbQz1vWzBdXT0obD1zW0NdKT9uLmlzQXJyYXkobCk/Wy4uLmwsb1sxXV06W2wsb1sxXV06b1sxXX1nKHMsdCl9ZWxzZSBlIT1udWxsJiZpKHQsZSxJKTtyZXR1cm4gdGhpc31nZXQoZSx0KXtpZihlPXNBKGUpLGUpe2xldCBJPW4uZmluZEtleSh0aGlzLGUpO2lmKEkpe2xldCByPXRoaXNbSV07aWYoIXQpcmV0dXJuIHI7aWYodD09PSEwKXJldHVybiBycihyKTtpZihuLmlzRnVuY3Rpb24odCkpcmV0dXJuIHQuY2FsbCh0aGlzLHIsSSk7aWYobi5pc1JlZ0V4cCh0KSlyZXR1cm4gdC5leGVjKHIpO3Rocm93IG5ldyBUeXBlRXJyb3IoInBhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uIil9fX1oYXMoZSx0KXtpZihlPXNBKGUpLGUpe2xldCBJPW4uZmluZEtleSh0aGlzLGUpO3JldHVybiEhKEkmJnRoaXNbSV0hPT12b2lkIDAmJighdHx8b2UodGhpcyx0aGlzW0ldLEksdCkpKX1yZXR1cm4hMX1kZWxldGUoZSx0KXtsZXQgST10aGlzLHI9ITE7ZnVuY3Rpb24gaShnKXtpZihnPXNBKGcpLGcpe2xldCBzPW4uZmluZEtleShJLGcpO3MmJighdHx8b2UoSSxJW3NdLHMsdCkpJiYoZGVsZXRlIElbc10scj0hMCl9fXJldHVybiBuLmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGkpOmkoZSkscn1jbGVhcihlKXtsZXQgdD1PYmplY3Qua2V5cyh0aGlzKSxJPXQubGVuZ3RoLHI9ITE7Zm9yKDtJLS07KXtsZXQgaT10W0ldOyghZXx8b2UodGhpcyx0aGlzW2ldLGksZSwhMCkpJiYoZGVsZXRlIHRoaXNbaV0scj0hMCl9cmV0dXJuIHJ9bm9ybWFsaXplKGUpe2xldCB0PXRoaXMsST17fTtyZXR1cm4gbi5mb3JFYWNoKHRoaXMsKHIsaSk9PntsZXQgZz1uLmZpbmRLZXkoSSxpKTtpZihnKXt0W2ddPUxBKHIpLGRlbGV0ZSB0W2ldO3JldHVybn1sZXQgcz1lP2dyKGkpOlN0cmluZyhpKS50cmltKCk7cyE9PWkmJmRlbGV0ZSB0W2ldLHRbc109TEEociksSVtzXT0hMH0pLHRoaXN9Y29uY2F0KC4uLmUpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLC4uLmUpfXRvSlNPTihlKXtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBuLmZvckVhY2godGhpcywoSSxyKT0+e0khPW51bGwmJkkhPT0hMSYmKHRbcl09ZSYmbi5pc0FycmF5KEkpP0kuam9pbigiLCAiKTpJKX0pLHR9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpfXRvU3RyaW5nKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2UsdF0pPT5lKyI6ICIrdCkuam9pbihgCmApfWdldFNldENvb2tpZSgpe3JldHVybiB0aGlzLmdldCgic2V0LWNvb2tpZSIpfHxbXX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpcz9lOm5ldyB0aGlzKGUpfXN0YXRpYyBjb25jYXQoZSwuLi50KXtsZXQgST1uZXcgdGhpcyhlKTtyZXR1cm4gdC5mb3JFYWNoKHI9Pkkuc2V0KHIpKSxJfXN0YXRpYyBhY2Nlc3NvcihlKXtsZXQgST0odGhpc1t0dF09dGhpc1t0dF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxyPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIGkoZyl7bGV0IHM9c0EoZyk7SVtzXXx8KG9yKHIsZyksSVtzXT0hMCl9cmV0dXJuIG4uaXNBcnJheShlKT9lLmZvckVhY2goaSk6aShlKSx0aGlzfX07JC5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7bi5yZWR1Y2VEZXNjcmlwdG9ycygkLnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQoSSl7dGhpc1t0XT1JfX19KTtuLmZyZWV6ZU1ldGhvZHMoJCk7dmFyIFM9JDtmdW5jdGlvbiBDQShBLGUpe2xldCB0PXRoaXN8fF8sST1lfHx0LHI9Uy5mcm9tKEkuaGVhZGVycyksaT1JLmRhdGE7cmV0dXJuIG4uZm9yRWFjaChBLGZ1bmN0aW9uKHMpe2k9cy5jYWxsKHQsaSxyLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLHIubm9ybWFsaXplKCksaX1mdW5jdGlvbiBCQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIEl0KEEsZSx0KXtwLmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLHAuRVJSX0NBTkNFTEVELGUsdCksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1uLmluaGVyaXRzKEl0LHAse19fQ0FOQ0VMX186ITB9KTt2YXIgTT1JdDtmdW5jdGlvbiBRQShBLGUsdCl7bGV0IEk9dC5jb25maWcudmFsaWRhdGVTdGF0dXM7IXQuc3RhdHVzfHwhSXx8SSh0LnN0YXR1cyk/QSh0KTplKG5ldyBwKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrdC5zdGF0dXMsW3AuRVJSX0JBRF9SRVFVRVNULHAuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcih0LnN0YXR1cy8xMDApLTRdLHQuY29uZmlnLHQucmVxdWVzdCx0KSl9ZnVuY3Rpb24gbmUoQSl7bGV0IGU9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWMoQSk7cmV0dXJuIGUmJmVbMV18fCIifWZ1bmN0aW9uIG5yKEEsZSl7QT1BfHwxMDtsZXQgdD1uZXcgQXJyYXkoQSksST1uZXcgQXJyYXkoQSkscj0wLGk9MCxnO3JldHVybiBlPWUhPT12b2lkIDA/ZToxZTMsZnVuY3Rpb24obCl7bGV0IEM9RGF0ZS5ub3coKSxvPUlbaV07Z3x8KGc9QyksdFtyXT1sLElbcl09QztsZXQgYT1pLGM9MDtmb3IoO2EhPT1yOyljKz10W2ErK10sYT1hJUE7aWYocj0ocisxKSVBLHI9PT1pJiYoaT0oaSsxKSVBKSxDLWc8ZSlyZXR1cm47bGV0IEI9byYmQy1vO3JldHVybiBCP01hdGgucm91bmQoYyoxZTMvQik6dm9pZCAwfX12YXIgcnQ9bnI7ZnVuY3Rpb24gYXIoQSxlKXtsZXQgdD0wLEk9MWUzL2UscixpLGc9KEMsbz1EYXRlLm5vdygpKT0+e3Q9byxyPW51bGwsaSYmKGNsZWFyVGltZW91dChpKSxpPW51bGwpLEEoLi4uQyl9O3JldHVyblsoLi4uQyk9PntsZXQgbz1EYXRlLm5vdygpLGE9by10O2E+PUk/ZyhDLG8pOihyPUMsaXx8KGk9c2V0VGltZW91dCgoKT0+e2k9bnVsbCxnKHIpfSxJLWEpKSl9LCgpPT5yJiZnKHIpXX12YXIgaXQ9YXI7dmFyIEFBPShBLGUsdD0zKT0+e2xldCBJPTAscj1ydCg1MCwyNTApO3JldHVybiBpdChpPT57bGV0IGc9aS5sb2FkZWQscz1pLmxlbmd0aENvbXB1dGFibGU/aS50b3RhbDp2b2lkIDAsbD1nLUksQz1yKGwpLG89Zzw9cztJPWc7bGV0IGE9e2xvYWRlZDpnLHRvdGFsOnMscHJvZ3Jlc3M6cz9nL3M6dm9pZCAwLGJ5dGVzOmwscmF0ZTpDfHx2b2lkIDAsZXN0aW1hdGVkOkMmJnMmJm8/KHMtZykvQzp2b2lkIDAsZXZlbnQ6aSxsZW5ndGhDb21wdXRhYmxlOnMhPW51bGwsW2U/ImRvd25sb2FkIjoidXBsb2FkIl06ITB9O0EoYSl9LHQpfSxhZT0oQSxlKT0+e2xldCB0PUEhPW51bGw7cmV0dXJuW0k9PmVbMF0oe2xlbmd0aENvbXB1dGFibGU6dCx0b3RhbDpBLGxvYWRlZDpJfSksZVsxXV19LHNlPUE9PiguLi5lKT0+bi5hc2FwKCgpPT5BKC4uLmUpKTt2YXIgZ3Q9RC5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/KChBLGUpPT50PT4odD1uZXcgVVJMKHQsRC5vcmlnaW4pLEEucHJvdG9jb2w9PT10LnByb3RvY29sJiZBLmhvc3Q9PT10Lmhvc3QmJihlfHxBLnBvcnQ9PT10LnBvcnQpKSkobmV3IFVSTChELm9yaWdpbiksRC5uYXZpZ2F0b3ImJi8obXNpZXx0cmlkZW50KS9pLnRlc3QoRC5uYXZpZ2F0b3IudXNlckFnZW50KSk6KCk9PiEwO3ZhciBvdD1ELmhhc1N0YW5kYXJkQnJvd3NlckVudj97d3JpdGUoQSxlLHQsSSxyLGkpe2xldCBnPVtBKyI9IitlbmNvZGVVUklDb21wb25lbnQoZSldO24uaXNOdW1iZXIodCkmJmcucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHQpLnRvR01UU3RyaW5nKCkpLG4uaXNTdHJpbmcoSSkmJmcucHVzaCgicGF0aD0iK0kpLG4uaXNTdHJpbmcocikmJmcucHVzaCgiZG9tYWluPSIrciksaT09PSEwJiZnLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1nLmpvaW4oIjsgIil9LHJlYWQoQSl7bGV0IGU9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK0ErIik9KFteO10qKSIpKTtyZXR1cm4gZT9kZWNvZGVVUklDb21wb25lbnQoZVszXSk6bnVsbH0scmVtb3ZlKEEpe3RoaXMud3JpdGUoQSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZSgpe30scmVhZCgpe3JldHVybiBudWxsfSxyZW1vdmUoKXt9fTtmdW5jdGlvbiBDZShBKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KEEpfWZ1bmN0aW9uIEJlKEEsZSl7cmV0dXJuIGU/QS5yZXBsYWNlKC9cLz9cLyQvLCIiKSsiLyIrZS5yZXBsYWNlKC9eXC8rLywiIik6QX1mdW5jdGlvbiBFQShBLGUsdCl7bGV0IEk9IUNlKGUpO3JldHVybiBBJiYoSXx8dD09ITEpP0JlKEEsZSk6ZX12YXIgbnQ9QT0+QSBpbnN0YW5jZW9mIFM/ey4uLkF9OkE7ZnVuY3Rpb24gYihBLGUpe2U9ZXx8e307bGV0IHQ9e307ZnVuY3Rpb24gSShDLG8sYSxjKXtyZXR1cm4gbi5pc1BsYWluT2JqZWN0KEMpJiZuLmlzUGxhaW5PYmplY3Qobyk/bi5tZXJnZS5jYWxsKHtjYXNlbGVzczpjfSxDLG8pOm4uaXNQbGFpbk9iamVjdChvKT9uLm1lcmdlKHt9LG8pOm4uaXNBcnJheShvKT9vLnNsaWNlKCk6b31mdW5jdGlvbiByKEMsbyxhLGMpe2lmKG4uaXNVbmRlZmluZWQobykpe2lmKCFuLmlzVW5kZWZpbmVkKEMpKXJldHVybiBJKHZvaWQgMCxDLGEsYyl9ZWxzZSByZXR1cm4gSShDLG8sYSxjKX1mdW5jdGlvbiBpKEMsbyl7aWYoIW4uaXNVbmRlZmluZWQobykpcmV0dXJuIEkodm9pZCAwLG8pfWZ1bmN0aW9uIGcoQyxvKXtpZihuLmlzVW5kZWZpbmVkKG8pKXtpZighbi5pc1VuZGVmaW5lZChDKSlyZXR1cm4gSSh2b2lkIDAsQyl9ZWxzZSByZXR1cm4gSSh2b2lkIDAsbyl9ZnVuY3Rpb24gcyhDLG8sYSl7aWYoYSBpbiBlKXJldHVybiBJKEMsbyk7aWYoYSBpbiBBKXJldHVybiBJKHZvaWQgMCxDKX1sZXQgbD17dXJsOmksbWV0aG9kOmksZGF0YTppLGJhc2VVUkw6Zyx0cmFuc2Zvcm1SZXF1ZXN0OmcsdHJhbnNmb3JtUmVzcG9uc2U6ZyxwYXJhbXNTZXJpYWxpemVyOmcsdGltZW91dDpnLHRpbWVvdXRNZXNzYWdlOmcsd2l0aENyZWRlbnRpYWxzOmcsd2l0aFhTUkZUb2tlbjpnLGFkYXB0ZXI6ZyxyZXNwb25zZVR5cGU6Zyx4c3JmQ29va2llTmFtZTpnLHhzcmZIZWFkZXJOYW1lOmcsb25VcGxvYWRQcm9ncmVzczpnLG9uRG93bmxvYWRQcm9ncmVzczpnLGRlY29tcHJlc3M6ZyxtYXhDb250ZW50TGVuZ3RoOmcsbWF4Qm9keUxlbmd0aDpnLGJlZm9yZVJlZGlyZWN0OmcsdHJhbnNwb3J0OmcsaHR0cEFnZW50OmcsaHR0cHNBZ2VudDpnLGNhbmNlbFRva2VuOmcsc29ja2V0UGF0aDpnLHJlc3BvbnNlRW5jb2Rpbmc6Zyx2YWxpZGF0ZVN0YXR1czpzLGhlYWRlcnM6KEMsbyxhKT0+cihudChDKSxudChvKSxhLCEwKX07cmV0dXJuIG4uZm9yRWFjaChPYmplY3Qua2V5cyh7Li4uQSwuLi5lfSksZnVuY3Rpb24obyl7bGV0IGE9bFtvXXx8cixjPWEoQVtvXSxlW29dLG8pO24uaXNVbmRlZmluZWQoYykmJmEhPT1zfHwodFtvXT1jKX0pLHR9dmFyIEpBPUE9PntsZXQgZT1iKHt9LEEpLHtkYXRhOnQsd2l0aFhTUkZUb2tlbjpJLHhzcmZIZWFkZXJOYW1lOnIseHNyZkNvb2tpZU5hbWU6aSxoZWFkZXJzOmcsYXV0aDpzfT1lO2UuaGVhZGVycz1nPVMuZnJvbShnKSxlLnVybD1hQShFQShlLmJhc2VVUkwsZS51cmwsZS5hbGxvd0Fic29sdXRlVXJscyksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxzJiZnLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgocy51c2VybmFtZXx8IiIpKyI6Iisocy5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQocy5wYXNzd29yZCkpOiIiKSkpO2xldCBsO2lmKG4uaXNGb3JtRGF0YSh0KSl7aWYoRC5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fEQuaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KWcuc2V0Q29udGVudFR5cGUodm9pZCAwKTtlbHNlIGlmKChsPWcuZ2V0Q29udGVudFR5cGUoKSkhPT0hMSl7bGV0W0MsLi4ub109bD9sLnNwbGl0KCI7IikubWFwKGE9PmEudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik6W107Zy5zZXRDb250ZW50VHlwZShbQ3x8Im11bHRpcGFydC9mb3JtLWRhdGEiLC4uLm9dLmpvaW4oIjsgIikpfX1pZihELmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKEkmJm4uaXNGdW5jdGlvbihJKSYmKEk9SShlKSksSXx8SSE9PSExJiZndChlLnVybCkpKXtsZXQgQz1yJiZpJiZvdC5yZWFkKGkpO0MmJmcuc2V0KHIsQyl9cmV0dXJuIGV9O3ZhciBzcj10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLGF0PXNyJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxJKXtsZXQgcj1KQShBKSxpPXIuZGF0YSxnPVMuZnJvbShyLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6cyxvblVwbG9hZFByb2dyZXNzOmwsb25Eb3dubG9hZFByb2dyZXNzOkN9PXIsbyxhLGMsQixFO2Z1bmN0aW9uIGYoKXtCJiZCKCksRSYmRSgpLHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobyksci5zaWduYWwmJnIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixvKX1sZXQgUT1uZXcgWE1MSHR0cFJlcXVlc3Q7US5vcGVuKHIubWV0aG9kLnRvVXBwZXJDYXNlKCksci51cmwsITApLFEudGltZW91dD1yLnRpbWVvdXQ7ZnVuY3Rpb24gZCgpe2lmKCFRKXJldHVybjtsZXQgeT1TLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBRJiZRLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxSPXtkYXRhOiFzfHxzPT09InRleHQifHxzPT09Impzb24iP1EucmVzcG9uc2VUZXh0OlEucmVzcG9uc2Usc3RhdHVzOlEuc3RhdHVzLHN0YXR1c1RleHQ6US5zdGF0dXNUZXh0LGhlYWRlcnM6eSxjb25maWc6QSxyZXF1ZXN0OlF9O1FBKGZ1bmN0aW9uKFcpe3QoVyksZigpfSxmdW5jdGlvbihXKXtJKFcpLGYoKX0sUiksUT1udWxsfSJvbmxvYWRlbmQiaW4gUT9RLm9ubG9hZGVuZD1kOlEub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IVF8fFEucmVhZHlTdGF0ZSE9PTR8fFEuc3RhdHVzPT09MCYmIShRLnJlc3BvbnNlVVJMJiZRLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChkKX0sUS5vbmFib3J0PWZ1bmN0aW9uKCl7USYmKEkobmV3IHAoIlJlcXVlc3QgYWJvcnRlZCIscC5FQ09OTkFCT1JURUQsQSxRKSksUT1udWxsKX0sUS5vbmVycm9yPWZ1bmN0aW9uKCl7SShuZXcgcCgiTmV0d29yayBFcnJvciIscC5FUlJfTkVUV09SSyxBLFEpKSxRPW51bGx9LFEub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IE89ci50aW1lb3V0PyJ0aW1lb3V0IG9mICIrci50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLFI9ci50cmFuc2l0aW9uYWx8fEdBO3IudGltZW91dEVycm9yTWVzc2FnZSYmKE89ci50aW1lb3V0RXJyb3JNZXNzYWdlKSxJKG5ldyBwKE8sUi5jbGFyaWZ5VGltZW91dEVycm9yP3AuRVRJTUVET1VUOnAuRUNPTk5BQk9SVEVELEEsUSkpLFE9bnVsbH0saT09PXZvaWQgMCYmZy5zZXRDb250ZW50VHlwZShudWxsKSwic2V0UmVxdWVzdEhlYWRlciJpbiBRJiZuLmZvckVhY2goZy50b0pTT04oKSxmdW5jdGlvbihPLFIpe1Euc2V0UmVxdWVzdEhlYWRlcihSLE8pfSksbi5pc1VuZGVmaW5lZChyLndpdGhDcmVkZW50aWFscyl8fChRLndpdGhDcmVkZW50aWFscz0hIXIud2l0aENyZWRlbnRpYWxzKSxzJiZzIT09Impzb24iJiYoUS5yZXNwb25zZVR5cGU9ci5yZXNwb25zZVR5cGUpLEMmJihbYyxFXT1BQShDLCEwKSxRLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixjKSksbCYmUS51cGxvYWQmJihbYSxCXT1BQShsKSxRLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsYSksUS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVuZCIsQikpLChyLmNhbmNlbFRva2VufHxyLnNpZ25hbCkmJihvPXk9PntRJiYoSSgheXx8eS50eXBlP25ldyBNKG51bGwsQSxRKTp5KSxRLmFib3J0KCksUT1udWxsKX0sci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobyksci5zaWduYWwmJihyLnNpZ25hbC5hYm9ydGVkP28oKTpyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbykpKTtsZXQgaD1uZShyLnVybCk7aWYoaCYmRC5wcm90b2NvbHMuaW5kZXhPZihoKT09PS0xKXtJKG5ldyBwKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK2grIjoiLHAuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59US5zZW5kKGl8fG51bGwpfSl9O3ZhciBDcj0oQSxlKT0+e2xldHtsZW5ndGg6dH09QT1BP0EuZmlsdGVyKEJvb2xlYW4pOltdO2lmKGV8fHQpe2xldCBJPW5ldyBBYm9ydENvbnRyb2xsZXIscixpPWZ1bmN0aW9uKEMpe2lmKCFyKXtyPSEwLHMoKTtsZXQgbz1DIGluc3RhbmNlb2YgRXJyb3I/Qzp0aGlzLnJlYXNvbjtJLmFib3J0KG8gaW5zdGFuY2VvZiBwP286bmV3IE0obyBpbnN0YW5jZW9mIEVycm9yP28ubWVzc2FnZTpvKSl9fSxnPWUmJnNldFRpbWVvdXQoKCk9PntnPW51bGwsaShuZXcgcChgdGltZW91dCAke2V9IG9mIG1zIGV4Y2VlZGVkYCxwLkVUSU1FRE9VVCkpfSxlKSxzPSgpPT57QSYmKGcmJmNsZWFyVGltZW91dChnKSxnPW51bGwsQS5mb3JFYWNoKEM9PntDLnVuc3Vic2NyaWJlP0MudW5zdWJzY3JpYmUoaSk6Qy5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsaSl9KSxBPW51bGwpfTtBLmZvckVhY2goQz0+Qy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsaSkpO2xldHtzaWduYWw6bH09STtyZXR1cm4gbC51bnN1YnNjcmliZT0oKT0+bi5hc2FwKHMpLGx9fSxzdD1Dcjt2YXIgQnI9ZnVuY3Rpb24qKEEsZSl7bGV0IHQ9QS5ieXRlTGVuZ3RoO2lmKCFlfHx0PGUpe3lpZWxkIEE7cmV0dXJufWxldCBJPTAscjtmb3IoO0k8dDspcj1JK2UseWllbGQgQS5zbGljZShJLHIpLEk9cn0sUXI9YXN5bmMgZnVuY3Rpb24qKEEsZSl7Zm9yIGF3YWl0KGxldCB0IG9mIEVyKEEpKXlpZWxkKkJyKHQsZSl9LEVyPWFzeW5jIGZ1bmN0aW9uKihBKXtpZihBW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSl7eWllbGQqQTtyZXR1cm59bGV0IGU9QS5nZXRSZWFkZXIoKTt0cnl7Zm9yKDs7KXtsZXR7ZG9uZTp0LHZhbHVlOkl9PWF3YWl0IGUucmVhZCgpO2lmKHQpYnJlYWs7eWllbGQgSX19ZmluYWxseXthd2FpdCBlLmNhbmNlbCgpfX0sUWU9KEEsZSx0LEkpPT57bGV0IHI9UXIoQSxlKSxpPTAsZyxzPWw9PntnfHwoZz0hMCxJJiZJKGwpKX07cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7YXN5bmMgcHVsbChsKXt0cnl7bGV0e2RvbmU6Qyx2YWx1ZTpvfT1hd2FpdCByLm5leHQoKTtpZihDKXtzKCksbC5jbG9zZSgpO3JldHVybn1sZXQgYT1vLmJ5dGVMZW5ndGg7aWYodCl7bGV0IGM9aSs9YTt0KGMpfWwuZW5xdWV1ZShuZXcgVWludDhBcnJheShvKSl9Y2F0Y2goQyl7dGhyb3cgcyhDKSxDfX0sY2FuY2VsKGwpe3JldHVybiBzKGwpLHIucmV0dXJuKCl9fSx7aGlnaFdhdGVyTWFyazoyfSl9O3ZhciBZQT10eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJnR5cGVvZiBSZXF1ZXN0PT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2U9PSJmdW5jdGlvbiIsQnQ9WUEmJnR5cGVvZiBSZWFkYWJsZVN0cmVhbT09ImZ1bmN0aW9uIixscj1ZQSYmKHR5cGVvZiBUZXh0RW5jb2Rlcj09ImZ1bmN0aW9uIj8oQT0+ZT0+QS5lbmNvZGUoZSkpKG5ldyBUZXh0RW5jb2Rlcik6YXN5bmMgQT0+bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKEEpLmFycmF5QnVmZmVyKCkpKSxRdD0oQSwuLi5lKT0+e3RyeXtyZXR1cm4hIUEoLi4uZSl9Y2F0Y2h7cmV0dXJuITF9fSxjcj1CdCYmUXQoKCk9PntsZXQgQT0hMSxlPW5ldyBSZXF1ZXN0KEQub3JpZ2luLHtib2R5Om5ldyBSZWFkYWJsZVN0cmVhbSxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gQT0hMCwiaGFsZiJ9fSkuaGVhZGVycy5oYXMoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBBJiYhZX0pLEN0PTY0KjEwMjQsRWU9QnQmJlF0KCgpPT5uLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCIiKS5ib2R5KSksTUE9e3N0cmVhbTpFZSYmKEE9PkEuYm9keSl9O1lBJiYoQT0+e1sidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaChlPT57IU1BW2VdJiYoTUFbZV09bi5pc0Z1bmN0aW9uKEFbZV0pP3Q9PnRbZV0oKToodCxJKT0+e3Rocm93IG5ldyBwKGBSZXNwb25zZSB0eXBlICcke2V9JyBpcyBub3Qgc3VwcG9ydGVkYCxwLkVSUl9OT1RfU1VQUE9SVCxJKX0pfSl9KShuZXcgUmVzcG9uc2UpO3ZhciBmcj1hc3luYyBBPT57aWYoQT09bnVsbClyZXR1cm4gMDtpZihuLmlzQmxvYihBKSlyZXR1cm4gQS5zaXplO2lmKG4uaXNTcGVjQ29tcGxpYW50Rm9ybShBKSlyZXR1cm4oYXdhaXQgbmV3IFJlcXVlc3QoRC5vcmlnaW4se21ldGhvZDoiUE9TVCIsYm9keTpBfSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KEEpfHxuLmlzQXJyYXlCdWZmZXIoQSkpcmV0dXJuIEEuYnl0ZUxlbmd0aDtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKEEpJiYoQT1BKyIiKSxuLmlzU3RyaW5nKEEpKXJldHVybihhd2FpdCBscihBKSkuYnl0ZUxlbmd0aH0sdXI9YXN5bmMoQSxlKT0+e2xldCB0PW4udG9GaW5pdGVOdW1iZXIoQS5nZXRDb250ZW50TGVuZ3RoKCkpO3JldHVybiB0Pz9mcihlKX0sRXQ9WUEmJihhc3luYyBBPT57bGV0e3VybDplLG1ldGhvZDp0LGRhdGE6SSxzaWduYWw6cixjYW5jZWxUb2tlbjppLHRpbWVvdXQ6ZyxvbkRvd25sb2FkUHJvZ3Jlc3M6cyxvblVwbG9hZFByb2dyZXNzOmwscmVzcG9uc2VUeXBlOkMsaGVhZGVyczpvLHdpdGhDcmVkZW50aWFsczphPSJzYW1lLW9yaWdpbiIsZmV0Y2hPcHRpb25zOmN9PUpBKEEpO0M9Qz8oQysiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IEI9c3QoW3IsaSYmaS50b0Fib3J0U2lnbmFsKCldLGcpLEUsZj1CJiZCLnVuc3Vic2NyaWJlJiYoKCk9PntCLnVuc3Vic2NyaWJlKCl9KSxRO3RyeXtpZihsJiZjciYmdCE9PSJnZXQiJiZ0IT09ImhlYWQiJiYoUT1hd2FpdCB1cihvLEkpKSE9PTApe2xldCBSPW5ldyBSZXF1ZXN0KGUse21ldGhvZDoiUE9TVCIsYm9keTpJLGR1cGxleDoiaGFsZiJ9KSxLO2lmKG4uaXNGb3JtRGF0YShJKSYmKEs9Ui5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikpJiZvLnNldENvbnRlbnRUeXBlKEspLFIuYm9keSl7bGV0W1csZEFdPWFlKFEsQUEoc2UobCkpKTtJPVFlKFIuYm9keSxDdCxXLGRBKX19bi5pc1N0cmluZyhhKXx8KGE9YT8iaW5jbHVkZSI6Im9taXQiKTtsZXQgZD0iY3JlZGVudGlhbHMiaW4gUmVxdWVzdC5wcm90b3R5cGU7RT1uZXcgUmVxdWVzdChlLHsuLi5jLHNpZ25hbDpCLG1ldGhvZDp0LnRvVXBwZXJDYXNlKCksaGVhZGVyczpvLm5vcm1hbGl6ZSgpLnRvSlNPTigpLGJvZHk6SSxkdXBsZXg6ImhhbGYiLGNyZWRlbnRpYWxzOmQ/YTp2b2lkIDB9KTtsZXQgaD1hd2FpdCBmZXRjaChFLGMpLHk9RWUmJihDPT09InN0cmVhbSJ8fEM9PT0icmVzcG9uc2UiKTtpZihFZSYmKHN8fHkmJmYpKXtsZXQgUj17fTtbInN0YXR1cyIsInN0YXR1c1RleHQiLCJoZWFkZXJzIl0uZm9yRWFjaChTZT0+e1JbU2VdPWhbU2VdfSk7bGV0IEs9bi50b0Zpbml0ZU51bWJlcihoLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKSxbVyxkQV09cyYmYWUoSyxBQShzZShzKSwhMCkpfHxbXTtoPW5ldyBSZXNwb25zZShRZShoLmJvZHksQ3QsVywoKT0+e2RBJiZkQSgpLGYmJmYoKX0pLFIpfUM9Q3x8InRleHQiO2xldCBPPWF3YWl0IE1BW24uZmluZEtleShNQSxDKXx8InRleHQiXShoLEEpO3JldHVybiF5JiZmJiZmKCksYXdhaXQgbmV3IFByb21pc2UoKFIsSyk9PntRQShSLEsse2RhdGE6TyxoZWFkZXJzOlMuZnJvbShoLmhlYWRlcnMpLHN0YXR1czpoLnN0YXR1cyxzdGF0dXNUZXh0Omguc3RhdHVzVGV4dCxjb25maWc6QSxyZXF1ZXN0OkV9KX0pfWNhdGNoKGQpe3Rocm93IGYmJmYoKSxkJiZkLm5hbWU9PT0iVHlwZUVycm9yIiYmL0xvYWQgZmFpbGVkfGZldGNoL2kudGVzdChkLm1lc3NhZ2UpP09iamVjdC5hc3NpZ24obmV3IHAoIk5ldHdvcmsgRXJyb3IiLHAuRVJSX05FVFdPUkssQSxFKSx7Y2F1c2U6ZC5jYXVzZXx8ZH0pOnAuZnJvbShkLGQmJmQuY29kZSxBLEUpfX0pO3ZhciBsZT17aHR0cDprQSx4aHI6YXQsZmV0Y2g6RXR9O24uZm9yRWFjaChsZSwoQSxlKT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOmV9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6ZX0pfX0pO3ZhciBsdD1BPT5gLSAke0F9YCxwcj1BPT5uLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITEsSEE9e2dldEFkYXB0ZXI6QT0+e0E9bi5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6ZX09QSx0LEkscj17fTtmb3IobGV0IGk9MDtpPGU7aSsrKXt0PUFbaV07bGV0IGc7aWYoST10LCFwcih0KSYmKEk9bGVbKGc9U3RyaW5nKHQpKS50b0xvd2VyQ2FzZSgpXSxJPT09dm9pZCAwKSl0aHJvdyBuZXcgcChgVW5rbm93biBhZGFwdGVyICcke2d9J2ApO2lmKEkpYnJlYWs7cltnfHwiIyIraV09SX1pZighSSl7bGV0IGk9T2JqZWN0LmVudHJpZXMocikubWFwKChbcyxsXSk9PmBhZGFwdGVyICR7c30gYCsobD09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGc9ZT9pLmxlbmd0aD4xP2BzaW5jZSA6CmAraS5tYXAobHQpLmpvaW4oYApgKToiICIrbHQoaVswXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgcCgiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2csIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiBJfSxhZGFwdGVyczpsZX07ZnVuY3Rpb24gY2UoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IE0obnVsbCxBKX1mdW5jdGlvbiBxQShBKXtyZXR1cm4gY2UoQSksQS5oZWFkZXJzPVMuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT1DQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSksSEEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fF8uYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihJKXtyZXR1cm4gY2UoQSksSS5kYXRhPUNBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLEkpLEkuaGVhZGVycz1TLmZyb20oSS5oZWFkZXJzKSxJfSxmdW5jdGlvbihJKXtyZXR1cm4gQkEoSSl8fChjZShBKSxJJiZJLnJlc3BvbnNlJiYoSS5yZXNwb25zZS5kYXRhPUNBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLEkucmVzcG9uc2UpLEkucmVzcG9uc2UuaGVhZGVycz1TLmZyb20oSS5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KEkpfSl9dmFyIE9BPSIxLjExLjAiO3ZhciBUQT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKEEsZSk9PntUQVtBXT1mdW5jdGlvbihJKXtyZXR1cm4gdHlwZW9mIEk9PT1BfHwiYSIrKGU8MT8ibiAiOiIgIikrQX19KTt2YXIgY3Q9e307VEEudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxJKXtmdW5jdGlvbiByKGksZyl7cmV0dXJuIltBeGlvcyB2IitPQSsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2krIiciK2crKEk/Ii4gIitJOiIiKX1yZXR1cm4oaSxnLHMpPT57aWYoZT09PSExKXRocm93IG5ldyBwKHIoZywiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkscC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIHQmJiFjdFtnXSYmKGN0W2ddPSEwLGNvbnNvbGUud2FybihyKGcsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKGksZyxzKTohMH19O1RBLnNwZWxsaW5nPWZ1bmN0aW9uKGUpe3JldHVybih0LEkpPT4oY29uc29sZS53YXJuKGAke0l9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7ZX1gKSwhMCl9O2Z1bmN0aW9uIGRyKEEsZSx0KXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IHAoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLHAuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCBJPU9iamVjdC5rZXlzKEEpLHI9SS5sZW5ndGg7Zm9yKDtyLS0gPjA7KXtsZXQgaT1JW3JdLGc9ZVtpXTtpZihnKXtsZXQgcz1BW2ldLGw9cz09PXZvaWQgMHx8ZyhzLGksQSk7aWYobCE9PSEwKXRocm93IG5ldyBwKCJvcHRpb24gIitpKyIgbXVzdCBiZSAiK2wscC5FUlJfQkFEX09QVElPTl9WQUxVRSk7Y29udGludWV9aWYodCE9PSEwKXRocm93IG5ldyBwKCJVbmtub3duIG9wdGlvbiAiK2kscC5FUlJfQkFEX09QVElPTil9fXZhciBsQT17YXNzZXJ0T3B0aW9uczpkcix2YWxpZGF0b3JzOlRBfTt2YXIgWT1sQS52YWxpZGF0b3JzLGVBPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZGVmYXVsdHM9ZXx8e30sdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IGVlLHJlc3BvbnNlOm5ldyBlZX19YXN5bmMgcmVxdWVzdChlLHQpe3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChlLHQpfWNhdGNoKEkpe2lmKEkgaW5zdGFuY2VvZiBFcnJvcil7bGV0IHI9e307RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uocik6cj1uZXcgRXJyb3I7bGV0IGk9ci5zdGFjaz9yLnN0YWNrLnJlcGxhY2UoL14uK1xuLywiIik6IiI7dHJ5e0kuc3RhY2s/aSYmIVN0cmluZyhJLnN0YWNrKS5lbmRzV2l0aChpLnJlcGxhY2UoL14uK1xuLitcbi8sIiIpKSYmKEkuc3RhY2srPWAKYCtpKTpJLnN0YWNrPWl9Y2F0Y2h7fX10aHJvdyBJfX1fcmVxdWVzdChlLHQpe3R5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LHQ9Yih0aGlzLmRlZmF1bHRzLHQpO2xldHt0cmFuc2l0aW9uYWw6SSxwYXJhbXNTZXJpYWxpemVyOnIsaGVhZGVyczppfT10O0khPT12b2lkIDAmJmxBLmFzc2VydE9wdGlvbnMoSSx7c2lsZW50SlNPTlBhcnNpbmc6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpZLnRyYW5zaXRpb25hbChZLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKX0sITEpLHIhPW51bGwmJihuLmlzRnVuY3Rpb24ocik/dC5wYXJhbXNTZXJpYWxpemVyPXtzZXJpYWxpemU6cn06bEEuYXNzZXJ0T3B0aW9ucyhyLHtlbmNvZGU6WS5mdW5jdGlvbixzZXJpYWxpemU6WS5mdW5jdGlvbn0sITApKSx0LmFsbG93QWJzb2x1dGVVcmxzIT09dm9pZCAwfHwodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyE9PXZvaWQgMD90LmFsbG93QWJzb2x1dGVVcmxzPXRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHM6dC5hbGxvd0Fic29sdXRlVXJscz0hMCksbEEuYXNzZXJ0T3B0aW9ucyh0LHtiYXNlVXJsOlkuc3BlbGxpbmcoImJhc2VVUkwiKSx3aXRoWHNyZlRva2VuOlkuc3BlbGxpbmcoIndpdGhYU1JGVG9rZW4iKX0sITApLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBnPWkmJm4ubWVyZ2UoaS5jb21tb24saVt0Lm1ldGhvZF0pO2kmJm4uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxFPT57ZGVsZXRlIGlbRV19KSx0LmhlYWRlcnM9Uy5jb25jYXQoZyxpKTtsZXQgcz1bXSxsPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihmKXt0eXBlb2YgZi5ydW5XaGVuPT0iZnVuY3Rpb24iJiZmLnJ1bldoZW4odCk9PT0hMXx8KGw9bCYmZi5zeW5jaHJvbm91cyxzLnVuc2hpZnQoZi5mdWxmaWxsZWQsZi5yZWplY3RlZCkpfSk7bGV0IEM9W107dGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbihmKXtDLnB1c2goZi5mdWxmaWxsZWQsZi5yZWplY3RlZCl9KTtsZXQgbyxhPTAsYztpZighbCl7bGV0IEU9W3FBLmJpbmQodGhpcyksdm9pZCAwXTtmb3IoRS51bnNoaWZ0KC4uLnMpLEUucHVzaCguLi5DKSxjPUUubGVuZ3RoLG89UHJvbWlzZS5yZXNvbHZlKHQpO2E8Yzspbz1vLnRoZW4oRVthKytdLEVbYSsrXSk7cmV0dXJuIG99Yz1zLmxlbmd0aDtsZXQgQj10O2ZvcihhPTA7YTxjOyl7bGV0IEU9c1thKytdLGY9c1thKytdO3RyeXtCPUUoQil9Y2F0Y2goUSl7Zi5jYWxsKHRoaXMsUSk7YnJlYWt9fXRyeXtvPXFBLmNhbGwodGhpcyxCKX1jYXRjaChFKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoRSl9Zm9yKGE9MCxjPUMubGVuZ3RoO2E8Yzspbz1vLnRoZW4oQ1thKytdLENbYSsrXSk7cmV0dXJuIG99Z2V0VXJpKGUpe2U9Yih0aGlzLmRlZmF1bHRzLGUpO2xldCB0PUVBKGUuYmFzZVVSTCxlLnVybCxlLmFsbG93QWJzb2x1dGVVcmxzKTtyZXR1cm4gYUEodCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpfX07bi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtlQS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxJKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGIoSXx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KEl8fHt9KS5kYXRhfSkpfX0pO24uZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoSSl7cmV0dXJuIGZ1bmN0aW9uKGksZyxzKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGIoc3x8e30se21ldGhvZDplLGhlYWRlcnM6ST97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6aSxkYXRhOmd9KSl9fWVBLnByb3RvdHlwZVtlXT10KCksZUEucHJvdG90eXBlW2UrIkZvcm0iXT10KCEwKX0pO3ZhciBjQT1lQTt2YXIgZmU9Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXtpZih0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7bGV0IHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGkpe3Q9aX0pO2xldCBJPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4ocj0+e2lmKCFJLl9saXN0ZW5lcnMpcmV0dXJuO2xldCBpPUkuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKDtpLS0gPjA7KUkuX2xpc3RlbmVyc1tpXShyKTtJLl9saXN0ZW5lcnM9bnVsbH0pLHRoaXMucHJvbWlzZS50aGVuPXI9PntsZXQgaSxnPW5ldyBQcm9taXNlKHM9PntJLnN1YnNjcmliZShzKSxpPXN9KS50aGVuKHIpO3JldHVybiBnLmNhbmNlbD1mdW5jdGlvbigpe0kudW5zdWJzY3JpYmUoaSl9LGd9LGUoZnVuY3Rpb24oaSxnLHMpe0kucmVhc29ufHwoSS5yZWFzb249bmV3IE0oaSxnLHMpLHQoSS5yZWFzb24pKX0pfXRocm93SWZSZXF1ZXN0ZWQoKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn1zdWJzY3JpYmUoZSl7aWYodGhpcy5yZWFzb24pe2UodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2goZSk6dGhpcy5fbGlzdGVuZXJzPVtlXX11bnN1YnNjcmliZShlKXtpZighdGhpcy5fbGlzdGVuZXJzKXJldHVybjtsZXQgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX10b0Fib3J0U2lnbmFsKCl7bGV0IGU9bmV3IEFib3J0Q29udHJvbGxlcix0PUk9PntlLmFib3J0KEkpfTtyZXR1cm4gdGhpcy5zdWJzY3JpYmUodCksZS5zaWduYWwudW5zdWJzY3JpYmU9KCk9PnRoaXMudW5zdWJzY3JpYmUodCksZS5zaWduYWx9c3RhdGljIHNvdXJjZSgpe2xldCBlO3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihyKXtlPXJ9KSxjYW5jZWw6ZX19fSxmdD1mZTtmdW5jdGlvbiB1ZShBKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIEEuYXBwbHkobnVsbCx0KX19ZnVuY3Rpb24gcGUoQSl7cmV0dXJuIG4uaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIGRlPXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExfTtPYmplY3QuZW50cmllcyhkZSkuZm9yRWFjaCgoW0EsZV0pPT57ZGVbZV09QX0pO3ZhciB1dD1kZTtmdW5jdGlvbiBwdChBKXtsZXQgZT1uZXcgY0EoQSksdD1yQShjQS5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gbi5leHRlbmQodCxjQS5wcm90b3R5cGUsZSx7YWxsT3duS2V5czohMH0pLG4uZXh0ZW5kKHQsZSxudWxsLHthbGxPd25LZXlzOiEwfSksdC5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIHB0KGIoQSxyKSl9LHR9dmFyIG09cHQoXyk7bS5BeGlvcz1jQTttLkNhbmNlbGVkRXJyb3I9TTttLkNhbmNlbFRva2VuPWZ0O20uaXNDYW5jZWw9QkE7bS5WRVJTSU9OPU9BO20udG9Gb3JtRGF0YT14O20uQXhpb3NFcnJvcj1wO20uQ2FuY2VsPW0uQ2FuY2VsZWRFcnJvcjttLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9O20uc3ByZWFkPXVlO20uaXNBeGlvc0Vycm9yPXBlO20ubWVyZ2VDb25maWc9YjttLkF4aW9zSGVhZGVycz1TO20uZm9ybVRvSlNPTj1BPT5iQShuLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO20uZ2V0QWRhcHRlcj1IQS5nZXRBZGFwdGVyO20uSHR0cFN0YXR1c0NvZGU9dXQ7bS5kZWZhdWx0PW07dmFyIHRBPW07dmFye0F4aW9zOkVuLEF4aW9zRXJyb3I6bG4sQ2FuY2VsZWRFcnJvcjpjbixpc0NhbmNlbDpmbixDYW5jZWxUb2tlbjp1bixWRVJTSU9OOnBuLGFsbDpkbixDYW5jZWw6aG4saXNBeGlvc0Vycm9yOkRuLHNwcmVhZDp5bix0b0Zvcm1EYXRhOm1uLEF4aW9zSGVhZGVyczp3bixIdHRwU3RhdHVzQ29kZTpTbixmb3JtVG9KU09OOkZuLGdldEFkYXB0ZXI6Um4sbWVyZ2VDb25maWc6VW59PXRBO2FzeW5jIGZ1bmN0aW9uIGhyKEEsZSl7bGV0IHQ9QSxJPW51bGw7aWYodD09bnVsbClJPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgcj1hd2FpdCB0QS5nZXQodCx7cmVzcG9uc2VUeXBlOiJibG9iIixwYXJhbXM6ZX0pLGk9VVJMLmNyZWF0ZU9iamVjdFVSTChyLmRhdGEpO0k9bmV3IFdvcmtlcihpLHt0eXBlOiJtb2R1bGUifSl9ZWxzZSBJPW5ldyBXb3JrZXIodCx7dHlwZToibW9kdWxlIn0pO3JldHVybiBJfXZhciBmQT1ocjtmdW5jdGlvbiBkdChBKXtsZXQgZT1WQShBKSx0PUE7cmV0dXJuIHQudGVybWluYXRlZD0hMSx0LndvcmtlclByb3h5PWUsdC5vcmlnaW5hbFRlcm1pbmF0ZT10LnRlcm1pbmF0ZSx0LnRlcm1pbmF0ZT0oKT0+e3QudGVybWluYXRlZD0hMCx0LndvcmtlclByb3h5W1pBXSgpLHQub3JpZ2luYWxUZXJtaW5hdGUoKX0se3dvcmtlclByb3h5OmUsd29ya2VyOnR9fWFzeW5jIGZ1bmN0aW9uIERyKEEsZSx0KXtsZXQgSTtpZihBIT1udWxsKXtsZXQgaT1BO3JldHVybiBpLndvcmtlclByb3h5IT09dm9pZCAwPyhJPWkud29ya2VyUHJveHkse3dvcmtlclByb3h5Okksd29ya2VyOml9KTpkdChBKX1sZXQgcj1hd2FpdCBmQShlLHQpO3JldHVybiBkdChyKX12YXIgaHQ9RHI7dmFyIHVBLFQsRGUsaGU9e2Vudjp7ZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDpmdW5jdGlvbihBKXtEZT1uZXcgVWludDhBcnJheShULmV4cG9ydHMubWVtb3J5LmJ1ZmZlcil9fX0sS0E9Y2xhc3N7aW5pdCgpe3JldHVybiB1QXx8KHR5cGVvZiBmZXRjaDwidSI/dUE9ZmV0Y2goImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsIitEdCkudGhlbihlPT5lLmFycmF5QnVmZmVyKCkpLnRoZW4oZT0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSxoZSkpLnRoZW4odGhpcy5faW5pdCk6dUE9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoQnVmZmVyLmZyb20oRHQsImJhc2U2NCIpLGhlKS50aGVuKHRoaXMuX2luaXQpLHVBKX1faW5pdChlKXtUPWUuaW5zdGFuY2UsaGUuZW52LmVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgoMCl9ZGVjb2RlKGUsdD0wKXtpZighVCl0aHJvdyBuZXcgRXJyb3IoIlpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy4iKTtsZXQgST1lLmJ5dGVMZW5ndGgscj1ULmV4cG9ydHMubWFsbG9jKEkpO0RlLnNldChlLHIpLHQ9dHx8TnVtYmVyKFQuZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKHIsSSkpO2xldCBpPVQuZXhwb3J0cy5tYWxsb2ModCksZz1ULmV4cG9ydHMuWlNURF9kZWNvbXByZXNzKGksdCxyLEkpLHM9RGUuc2xpY2UoaSxpK2cpO3JldHVybiBULmV4cG9ydHMuZnJlZShyKSxULmV4cG9ydHMuZnJlZShpKSxzfX0sRHQ9IkFHRnpiUUVBQUFBQmJnNWdBMzkvZndGL1lBRi9BWDlnQW45L0FHQUJmd0JnQlg5L2YzOS9BWDlnQTM5L2Z3QmdCSDkvZjM4QmYyQUFBWDlnQW45L0FYOWdCMzkvZjM5L2YzOEJmMkFDZjM4QmZtQUlmMzkvZjM5L2YzOEJmMkFGZjM5L2YzOEFZQTUvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9BaWNCQTJWdWRoOWxiWE5qY21sd2RHVnVYMjV2ZEdsbWVWOXRaVzF2Y25sZlozSnZkM1JvQUFNREl5SUhBQUFCQVFNSEF3RUFDUVFBQlFFSUNBRUZCZ1FFQkFNR0FBQUtBQVVMREEwR0JBVUJjQUVCQVFVSEFRR0FBb0NBQWdZSUFYOEJRWUNqQkFzSHJnRUxCbTFsYlc5eWVRSUFCbTFoYkd4dll3QUZCR1p5WldVQUJneGFVMVJFWDJselJYSnliM0lBRWhsYVUxUkVYMlpwYm1SRVpXTnZiWEJ5WlhOelpXUlRhWHBsQUJ3UFdsTlVSRjlrWldOdmJYQnlaWE56QUNJWlgxOXBibVJwY21WamRGOW1kVzVqZEdsdmJsOTBZV0pzWlFFQUVGOWZaWEp5Ym05ZmJHOWpZWFJwYjI0QUFRbHpkR0ZqYTFOaGRtVUFCd3h6ZEdGamExSmxjM1J2Y21VQUNBcHpkR0ZqYTBGc2JHOWpBQWtLaS9JQklnVUFRWVFmQ3pNQkFYOGdBZ1JBSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FEUVFGcUlRTWdBVUVCYWlFQklBSkJBV3NpQWcwQUN3c2dBQXNwQVFGL0lBSUVRQ0FBSVFNRFFDQURJQUU2QUFBZ0EwRUJhaUVESUFKQkFXc2lBZzBBQ3dzZ0FBdHNBUUovUVlBZktBSUFJZ0VnQUVFSGFrRjRjU0lDYWlFQUFrQWdBa0VBSUFBZ0FVMGJEUUFnQUQ4QVFSQjBTd1JBSUFBL0FFRVFkR3RCLy84RGFrRVFka0FBUVg5R0JIOUJBQVZCQUJBQVFRRUxSUTBCQzBHQUh5QUFOZ0lBSUFFUEMwR0VIMEV3TmdJQVFYOEx1U2NCQzM4akFFRVFheUlLSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkI5QUZOQkVCQmlCOG9BZ0FpQmtFUUlBQkJDMnBCZUhFZ0FFRUxTUnNpQlVFRGRpSUFkaUlCUVFOeEJFQUNRQ0FCUVg5elFRRnhJQUJxSWdKQkEzUWlBVUd3SDJvaUFDQUJRYmdmYWlnQ0FDSUJLQUlJSWdSR0JFQkJpQjhnQmtGK0lBSjNjVFlDQUF3QkN5QUVJQUEyQWd3Z0FDQUVOZ0lJQ3lBQlFRaHFJUUFnQVNBQ1FRTjBJZ0pCQTNJMkFnUWdBU0FDYWlJQklBRW9BZ1JCQVhJMkFnUU1Ed3NnQlVHUUh5Z0NBQ0lIVFEwQklBRUVRQUpBUVFJZ0FIUWlBa0VBSUFKcmNpQUJJQUIwY1dnaUFVRURkQ0lBUWJBZmFpSUNJQUJCdUI5cUtBSUFJZ0FvQWdnaUJFWUVRRUdJSHlBR1FYNGdBWGR4SWdZMkFnQU1BUXNnQkNBQ05nSU1JQUlnQkRZQ0NBc2dBQ0FGUVFOeU5nSUVJQUFnQldvaUNDQUJRUU4wSWdFZ0JXc2lCRUVCY2pZQ0JDQUFJQUZxSUFRMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFGQm5COG9BZ0FoQWdKL0lBWkJBU0FIUVFOMmRDSURjVVVFUUVHSUh5QURJQVp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBeUFCSUFJMkFnZ2dBeUFDTmdJTUlBSWdBVFlDRENBQ0lBTTJBZ2dMSUFCQkNHb2hBRUdjSHlBSU5nSUFRWkFmSUFRMkFnQU1Ed3RCakI4b0FnQWlDMFVOQVNBTGFFRUNkRUc0SVdvb0FnQWlBaWdDQkVGNGNTQUZheUVESUFJaEFRTkFBa0FnQVNnQ0VDSUFSUVJBSUFFb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBRmF5SUJJQU1nQVNBRFNTSUJHeUVESUFBZ0FpQUJHeUVDSUFBaEFRd0JDd3NnQWlnQ0dDRUpJQUlnQWlnQ0RDSUVSd1JBUVpnZktBSUFHaUFDS0FJSUlnQWdCRFlDRENBRUlBQTJBZ2dNRGdzZ0FrRVVhaUlCS0FJQUlnQkZCRUFnQWlnQ0VDSUFSUTBESUFKQkVHb2hBUXNEUUNBQklRZ2dBQ0lFUVJScUlnRW9BZ0FpQUEwQUlBUkJFR29oQVNBRUtBSVFJZ0FOQUFzZ0NFRUFOZ0lBREEwTFFYOGhCU0FBUWI5L1N3MEFJQUJCQzJvaUFFRjRjU0VGUVl3ZktBSUFJZ2hGRFFCQkFDQUZheUVEQWtBQ1FBSkFBbjlCQUNBRlFZQUNTUTBBR2tFZklBVkIvLy8vQjBzTkFCb2dCVUVtSUFCQkNIWm5JZ0JyZGtFQmNTQUFRUUYwYTBFK2Fnc2lCMEVDZEVHNElXb29BZ0FpQVVVRVFFRUFJUUFNQVF0QkFDRUFJQVZCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VDQTBBQ1FDQUJLQUlFUVhoeElBVnJJZ1lnQTA4TkFDQUJJUVFnQmlJRERRQkJBQ0VESUFFaEFBd0RDeUFBSUFFb0FoUWlCaUFHSUFFZ0FrRWRka0VFY1dvb0FoQWlBVVliSUFBZ0Joc2hBQ0FDUVFGMElRSWdBUTBBQ3dzZ0FDQUVja1VFUUVFQUlRUkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUdoQkFuUkJ1Q0ZxS0FJQUlRQUxJQUJGRFFFTEEwQWdBQ2dDQkVGNGNTQUZheUlDSUFOSklRRWdBaUFESUFFYklRTWdBQ0FFSUFFYklRUWdBQ2dDRUNJQkJIOGdBUVVnQUNnQ0ZBc2lBQTBBQ3dzZ0JFVU5BQ0FEUVpBZktBSUFJQVZyVHcwQUlBUW9BaGdoQnlBRUlBUW9BZ3dpQWtjRVFFR1lIeWdDQUJvZ0JDZ0NDQ0lBSUFJMkFnd2dBaUFBTmdJSURBd0xJQVJCRkdvaUFTZ0NBQ0lBUlFSQUlBUW9BaEFpQUVVTkF5QUVRUkJxSVFFTEEwQWdBU0VHSUFBaUFrRVVhaUlCS0FJQUlnQU5BQ0FDUVJCcUlRRWdBaWdDRUNJQURRQUxJQVpCQURZQ0FBd0xDeUFGUVpBZktBSUFJZ1JOQkVCQm5COG9BZ0FoQUFKQUlBUWdCV3NpQVVFUVR3UkFJQUFnQldvaUFpQUJRUUZ5TmdJRUlBQWdCR29nQVRZQ0FDQUFJQVZCQTNJMkFnUU1BUXNnQUNBRVFRTnlOZ0lFSUFBZ0JHb2lBU0FCS0FJRVFRRnlOZ0lFUVFBaEFrRUFJUUVMUVpBZklBRTJBZ0JCbkI4Z0FqWUNBQ0FBUVFocUlRQU1EUXNnQlVHVUh5Z0NBQ0lDU1FSQVFaUWZJQUlnQldzaUFUWUNBRUdnSDBHZ0h5Z0NBQ0lBSUFWcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0JVRURjallDQkNBQVFRaHFJUUFNRFF0QkFDRUFJQVZCTDJvaUF3Si9RZUFpS0FJQUJFQkI2Q0lvQWdBTUFRdEI3Q0pDZnpjQ0FFSGtJa0tBb0lDQWdJQUVOd0lBUWVBaUlBcEJER3BCY0hGQjJLclZxZ1Z6TmdJQVFmUWlRUUEyQWdCQnhDSkJBRFlDQUVHQUlBc2lBV29pQmtFQUlBRnJJZ2h4SWdFZ0JVME5ERUhBSWlnQ0FDSUVCRUJCdUNJb0FnQWlCeUFCYWlJSklBZE5JQVFnQ1VseURRMExBa0JCeENJdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVHZ0h5Z0NBQ0lFQkVCQnlDSWhBQU5BSUFRZ0FDZ0NBQ0lIVHdSQUlBY2dBQ2dDQkdvZ0JFc05Bd3NnQUNnQ0NDSUFEUUFMQzBFQUVBUWlBa0YvUmcwRElBRWhCa0hrSWlnQ0FDSUFRUUZySWdRZ0FuRUVRQ0FCSUFKcklBSWdCR3BCQUNBQWEzRnFJUVlMSUFVZ0JrOE5BMEhBSWlnQ0FDSUFCRUJCdUNJb0FnQWlCQ0FHYWlJSUlBUk5JQUFnQ0VseURRUUxJQVlRQkNJQUlBSkhEUUVNQlFzZ0JpQUNheUFJY1NJR0VBUWlBaUFBS0FJQUlBQW9BZ1JxUmcwQklBSWhBQXNnQUVGL1JnMEJJQVZCTUdvZ0JrMEVRQ0FBSVFJTUJBdEI2Q0lvQWdBaUFpQURJQVpyYWtFQUlBSnJjU0lDRUFSQmYwWU5BU0FDSUFacUlRWWdBQ0VDREFNTElBSkJmMGNOQWd0QnhDSkJ4Q0lvQWdCQkJISTJBZ0FMSUFFUUJDSUNRWDlHUVFBUUJDSUFRWDlHY2lBQUlBSk5jZzBGSUFBZ0Ftc2lCaUFGUVNocVRRMEZDMEc0SWtHNElpZ0NBQ0FHYWlJQU5nSUFRYndpS0FJQUlBQkpCRUJCdkNJZ0FEWUNBQXNDUUVHZ0h5Z0NBQ0lEQkVCQnlDSWhBQU5BSUFJZ0FDZ0NBQ0lCSUFBb0FnUWlCR3BHRFFJZ0FDZ0NDQ0lBRFFBTERBUUxRWmdmS0FJQUlnQkJBQ0FBSUFKTkcwVUVRRUdZSHlBQ05nSUFDMEVBSVFCQnpDSWdCallDQUVISUlpQUNOZ0lBUWFnZlFYODJBZ0JCckI5QjRDSW9BZ0EyQWdCQjFDSkJBRFlDQUFOQUlBQkJBM1FpQVVHNEgyb2dBVUd3SDJvaUJEWUNBQ0FCUWJ3ZmFpQUVOZ0lBSUFCQkFXb2lBRUVnUncwQUMwR1VIeUFHUVNocklnQkJlQ0FDYTBFSGNTSUJheUlFTmdJQVFhQWZJQUVnQW1vaUFUWUNBQ0FCSUFSQkFYSTJBZ1FnQUNBQ2FrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBUUxJQUlnQTAwZ0FTQURTM0lOQWlBQUtBSU1RUWh4RFFJZ0FDQUVJQVpxTmdJRVFhQWZJQU5CZUNBRGEwRUhjU0lBYWlJQk5nSUFRWlFmUVpRZktBSUFJQVpxSWdJZ0FHc2lBRFlDQUNBQklBQkJBWEkyQWdRZ0FpQURha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQU1MUVFBaEJBd0tDMEVBSVFJTUNBdEJtQjhvQWdBZ0Frc0VRRUdZSHlBQ05nSUFDeUFDSUFacUlRRkJ5Q0loQUFKQUFrQUNRQU5BSUFFZ0FDZ0NBRWNFUUNBQUtBSUlJZ0FOQVF3Q0N3c2dBQzBBREVFSWNVVU5BUXRCeUNJaEFBTkFJQU1nQUNnQ0FDSUJUd1JBSUFFZ0FDZ0NCR29pQkNBRFN3MERDeUFBS0FJSUlRQU1BQXNBQ3lBQUlBSTJBZ0FnQUNBQUtBSUVJQVpxTmdJRUlBSkJlQ0FDYTBFSGNXb2lCeUFGUVFOeU5nSUVJQUZCZUNBQmEwRUhjV29pQmlBRklBZHFJZ1ZySVFBZ0F5QUdSZ1JBUWFBZklBVTJBZ0JCbEI5QmxCOG9BZ0FnQUdvaUFEWUNBQ0FGSUFCQkFYSTJBZ1FNQ0F0Qm5COG9BZ0FnQmtZRVFFR2NIeUFGTmdJQVFaQWZRWkFmS0FJQUlBQnFJZ0EyQWdBZ0JTQUFRUUZ5TmdJRUlBQWdCV29nQURZQ0FBd0lDeUFHS0FJRUlnTkJBM0ZCQVVjTkJpQURRWGh4SVFrZ0EwSC9BVTBFUUNBR0tBSU1JZ0VnQmlnQ0NDSUNSZ1JBUVlnZlFZZ2ZLQUlBUVg0Z0EwRURkbmR4TmdJQURBY0xJQUlnQVRZQ0RDQUJJQUkyQWdnTUJnc2dCaWdDR0NFSUlBWWdCaWdDRENJQ1J3UkFJQVlvQWdnaUFTQUNOZ0lNSUFJZ0FUWUNDQXdGQ3lBR1FSUnFJZ0VvQWdBaUEwVUVRQ0FHS0FJUUlnTkZEUVFnQmtFUWFpRUJDd05BSUFFaEJDQURJZ0pCRkdvaUFTZ0NBQ0lERFFBZ0FrRVFhaUVCSUFJb0FoQWlBdzBBQ3lBRVFRQTJBZ0FNQkF0QmxCOGdCa0VvYXlJQVFYZ2dBbXRCQjNFaUFXc2lDRFlDQUVHZ0h5QUJJQUpxSWdFMkFnQWdBU0FJUVFGeU5nSUVJQUFnQW1wQktEWUNCRUdrSDBId0lpZ0NBRFlDQUNBRElBUkJKeUFFYTBFSGNXcEJMMnNpQUNBQUlBTkJFR3BKR3lJQlFSczJBZ1FnQVVIUUlpa0NBRGNDRUNBQlFjZ2lLUUlBTndJSVFkQWlJQUZCQ0dvMkFnQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFkUWlRUUEyQWdBZ0FVRVlhaUVBQTBBZ0FFRUhOZ0lFSUFCQkNHb2dBRUVFYWlFQUlBUkpEUUFMSUFFZ0EwWU5BQ0FCSUFFb0FnUkJmbkUyQWdRZ0F5QUJJQU5ySWdKQkFYSTJBZ1FnQVNBQ05nSUFJQUpCL3dGTkJFQWdBa0Y0Y1VHd0gyb2hBQUovUVlnZktBSUFJZ0ZCQVNBQ1FRTjJkQ0lDY1VVRVFFR0lIeUFCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQVNBQUlBTTJBZ2dnQVNBRE5nSU1JQU1nQURZQ0RDQURJQUUyQWdnTUFRdEJIeUVBSUFKQi8vLy9CMDBFUUNBQ1FTWWdBa0VJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBTWdBRFlDSENBRFFnQTNBaEFnQUVFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUJFRUJJQUIwSWdaeFJRUkFRWXdmSUFRZ0JuSTJBZ0FnQVNBRE5nSUFEQUVMSUFKQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQkFOQUlBUWlBU2dDQkVGNGNTQUNSZzBDSUFCQkhYWWhCQ0FBUVFGMElRQWdBU0FFUVFSeGFpSUdLQUlRSWdRTkFBc2dCaUFETmdJUUN5QURJQUUyQWhnZ0F5QUROZ0lNSUFNZ0F6WUNDQXdCQ3lBQktBSUlJZ0FnQXpZQ0RDQUJJQU0yQWdnZ0EwRUFOZ0lZSUFNZ0FUWUNEQ0FESUFBMkFnZ0xRWlFmS0FJQUlnQWdCVTBOQUVHVUh5QUFJQVZySWdFMkFnQkJvQjlCb0I4b0FnQWlBQ0FGYWlJQ05nSUFJQUlnQVVFQmNqWUNCQ0FBSUFWQkEzSTJBZ1FnQUVFSWFpRUFEQWdMUVlRZlFUQTJBZ0JCQUNFQURBY0xRUUFoQWdzZ0NFVU5BQUpBSUFZb0Fod2lBVUVDZEVHNElXb2lCQ2dDQUNBR1JnUkFJQVFnQWpZQ0FDQUNEUUZCakI5QmpCOG9BZ0JCZmlBQmQzRTJBZ0FNQWdzZ0NFRVFRUlFnQ0NnQ0VDQUdSaHRxSUFJMkFnQWdBa1VOQVFzZ0FpQUlOZ0lZSUFZb0FoQWlBUVJBSUFJZ0FUWUNFQ0FCSUFJMkFoZ0xJQVlvQWhRaUFVVU5BQ0FDSUFFMkFoUWdBU0FDTmdJWUN5QUFJQWxxSVFBZ0JpQUphaUlHS0FJRUlRTUxJQVlnQTBGK2NUWUNCQ0FGSUFCQkFYSTJBZ1FnQUNBRmFpQUFOZ0lBSUFCQi93Rk5CRUFnQUVGNGNVR3dIMm9oQVFKL1FZZ2ZLQUlBSWdKQkFTQUFRUU4yZENJQWNVVUVRRUdJSHlBQUlBSnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQVUyQWdnZ0FDQUZOZ0lNSUFVZ0FUWUNEQ0FGSUFBMkFnZ01BUXRCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQVVnQXpZQ0hDQUZRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlBa0VCSUFOMElnUnhSUVJBUVl3ZklBSWdCSEkyQWdBZ0FTQUZOZ0lBREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFnTkFJQUlpQVNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQWlBRFFRRjBJUU1nQVNBQ1FRUnhhaUlFS0FJUUlnSU5BQXNnQkNBRk5nSVFDeUFGSUFFMkFoZ2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUJLQUlJSWdBZ0JUWUNEQ0FCSUFVMkFnZ2dCVUVBTmdJWUlBVWdBVFlDRENBRklBQTJBZ2dMSUFkQkNHb2hBQXdDQ3dKQUlBZEZEUUFDUUNBRUtBSWNJZ0JCQW5SQnVDRnFJZ0VvQWdBZ0JFWUVRQ0FCSUFJMkFnQWdBZzBCUVl3ZklBaEJmaUFBZDNFaUNEWUNBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBUkdHMm9nQWpZQ0FDQUNSUTBCQ3lBQ0lBYzJBaGdnQkNnQ0VDSUFCRUFnQWlBQU5nSVFJQUFnQWpZQ0dBc2dCQ2dDRkNJQVJRMEFJQUlnQURZQ0ZDQUFJQUkyQWhnTEFrQWdBMEVQVFFSQUlBUWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0JHb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBUWdCVUVEY2pZQ0JDQUVJQVZxSWdJZ0EwRUJjallDQkNBQ0lBTnFJQU0yQWdBZ0EwSC9BVTBFUUNBRFFYaHhRYkFmYWlFQUFuOUJpQjhvQWdBaUFVRUJJQU5CQTNaMElnTnhSUVJBUVlnZklBRWdBM0kyQWdBZ0FBd0JDeUFBS0FJSUN5RUJJQUFnQWpZQ0NDQUJJQUkyQWd3Z0FpQUFOZ0lNSUFJZ0FUWUNDQXdCQzBFZklRQWdBMEgvLy84SFRRUkFJQU5CSmlBRFFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hBQXNnQWlBQU5nSWNJQUpDQURjQ0VDQUFRUUowUWJnaGFpRUJBa0FDUUNBSVFRRWdBSFFpQm5GRkJFQkJqQjhnQmlBSWNqWUNBQ0FCSUFJMkFnQU1BUXNnQTBFWklBQkJBWFpyUVFBZ0FFRWZSeHQwSVFBZ0FTZ0NBQ0VGQTBBZ0JTSUJLQUlFUVhoeElBTkdEUUlnQUVFZGRpRUdJQUJCQVhRaEFDQUJJQVpCQkhGcUlnWW9BaEFpQlEwQUN5QUdJQUkyQWhBTElBSWdBVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFFb0FnZ2lBQ0FDTmdJTUlBRWdBallDQ0NBQ1FRQTJBaGdnQWlBQk5nSU1JQUlnQURZQ0NBc2dCRUVJYWlFQURBRUxBa0FnQ1VVTkFBSkFJQUlvQWh3aUFFRUNkRUc0SVdvaUFTZ0NBQ0FDUmdSQUlBRWdCRFlDQUNBRURRRkJqQjhnQzBGK0lBQjNjVFlDQUF3Q0N5QUpRUkJCRkNBSktBSVFJQUpHRzJvZ0JEWUNBQ0FFUlEwQkN5QUVJQWsyQWhnZ0FpZ0NFQ0lBQkVBZ0JDQUFOZ0lRSUFBZ0JEWUNHQXNnQWlnQ0ZDSUFSUTBBSUFRZ0FEWUNGQ0FBSUFRMkFoZ0xBa0FnQTBFUFRRUkFJQUlnQXlBRmFpSUFRUU55TmdJRUlBQWdBbW9pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUlnQlVFRGNqWUNCQ0FDSUFWcUlnUWdBMEVCY2pZQ0JDQURJQVJxSUFNMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFCQm5COG9BZ0FoQVFKL1FRRWdCMEVEZG5RaUJTQUdjVVVFUUVHSUh5QUZJQVp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCaUFBSUFFMkFnZ2dCaUFCTmdJTUlBRWdBRFlDRENBQklBWTJBZ2dMUVp3ZklBUTJBZ0JCa0I4Z0F6WUNBQXNnQWtFSWFpRUFDeUFLUVJCcUpBQWdBQXZTQ3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQm1COG9BZ0JKRFFFZ0FDQUJhaUVBQWtBQ1FFR2NIeWdDQUNBQ1J3UkFJQUZCL3dGTkJFQWdBVUVEZGlFRUlBSW9BZ3dpQVNBQ0tBSUlJZ05HQkVCQmlCOUJpQjhvQWdCQmZpQUVkM0UyQWdBTUJRc2dBeUFCTmdJTUlBRWdBellDQ0F3RUN5QUNLQUlZSVFZZ0FpQUNLQUlNSWdGSEJFQWdBaWdDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFKQkZHb2lCQ2dDQUNJRFJRUkFJQUlvQWhBaUEwVU5BaUFDUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRktBSUVJZ0ZCQTNGQkEwY05Ba0dRSHlBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQlNBQU5nSUFEd3RCQUNFQkN5QUdSUTBBQWtBZ0FpZ0NIQ0lEUVFKMFFiZ2hhaUlFS0FJQUlBSkdCRUFnQkNBQk5nSUFJQUVOQVVHTUgwR01IeWdDQUVGK0lBTjNjVFlDQUF3Q0N5QUdRUkJCRkNBR0tBSVFJQUpHRzJvZ0FUWUNBQ0FCUlEwQkN5QUJJQVkyQWhnZ0FpZ0NFQ0lEQkVBZ0FTQUROZ0lRSUFNZ0FUWUNHQXNnQWlnQ0ZDSURSUTBBSUFFZ0F6WUNGQ0FESUFFMkFoZ0xJQUlnQlU4TkFDQUZLQUlFSWdGQkFYRkZEUUFDUUFKQUFrQUNRQ0FCUVFKeFJRUkFRYUFmS0FJQUlBVkdCRUJCb0I4Z0FqWUNBRUdVSDBHVUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FDUVp3ZktBSUFSdzBHUVpBZlFRQTJBZ0JCbkI5QkFEWUNBQThMUVp3ZktBSUFJQVZHQkVCQm5COGdBallDQUVHUUgwR1FIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQUlBSnFJQUEyQWdBUEN5QUJRWGh4SUFCcUlRQWdBVUgvQVUwRVFDQUJRUU4ySVFRZ0JTZ0NEQ0lCSUFVb0FnZ2lBMFlFUUVHSUgwR0lIeWdDQUVGK0lBUjNjVFlDQUF3RkN5QURJQUUyQWd3Z0FTQUROZ0lJREFRTElBVW9BaGdoQmlBRklBVW9BZ3dpQVVjRVFFR1lIeWdDQUJvZ0JTZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQVZCRkdvaUJDZ0NBQ0lEUlFSQUlBVW9BaEFpQTBVTkFpQUZRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGSUFGQmZuRTJBZ1FnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUF3REMwRUFJUUVMSUFaRkRRQUNRQ0FGS0FJY0lnTkJBblJCdUNGcUlnUW9BZ0FnQlVZRVFDQUVJQUUyQWdBZ0FRMEJRWXdmUVl3ZktBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0JVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FGS0FJUUlnTUVRQ0FCSUFNMkFoQWdBeUFCTmdJWUN5QUZLQUlVSWdORkRRQWdBU0FETmdJVUlBTWdBVFlDR0FzZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FDQUNRWndmS0FJQVJ3MEFRWkFmSUFBMkFnQVBDeUFBUWY4QlRRUkFJQUJCZUhGQnNCOXFJUUVDZjBHSUh5Z0NBQ0lEUVFFZ0FFRURkblFpQUhGRkJFQkJpQjhnQUNBRGNqWUNBQ0FCREFFTElBRW9BZ2dMSVFBZ0FTQUNOZ0lJSUFBZ0FqWUNEQ0FDSUFFMkFnd2dBaUFBTmdJSUR3dEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBSWdBellDSENBQ1FnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQUNRRUdNSHlnQ0FDSUVRUUVnQTNRaUIzRkZCRUJCakI4Z0JDQUhjallDQUNBQklBSTJBZ0FnQWlBQk5nSVlEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQVFOQUlBRWlCQ2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBU0FEUVFGMElRTWdCQ0FCUVFSeGFpSUhRUkJxS0FJQUlnRU5BQXNnQnlBQ05nSVFJQUlnQkRZQ0dBc2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUVLQUlJSWdBZ0FqWUNEQ0FFSUFJMkFnZ2dBa0VBTmdJWUlBSWdCRFlDRENBQ0lBQTJBZ2dMUWFnZlFhZ2ZLQUlBUVFGcklnQkJmeUFBR3pZQ0FBc0xCQUFqQUFzR0FDQUFKQUFMRUFBakFDQUFhMEZ3Y1NJQUpBQWdBQXRLQVFGL0lBQWdBVWtFUUNBQUlBRWdBaEFDRHdzZ0FnUkFJQUFnQW1vaEF5QUJJQUpxSVFFRFFDQURRUUZySWdNZ0FVRUJheUlCTFFBQU9nQUFJQUpCQVdzaUFnMEFDd3NnQUF2OURnSVJmd0YrSXdCQk1Hc2lCeVFBUWJoL0lRZ0NRQ0FGUlEwQUlBUXNBQUFpQ1VIL0FYRWhDd0pBSUFsQkFFZ0VRQ0FMUWY0QWEwRUJkaUlHSUFWUERRSkJiQ0VJSUF0Qi93QnJJZ3RCL3dGTERRSWdCRUVCYWlFSVFRQWhCUU5BSUFVZ0MwOEVRQ0FMSVFnZ0JpRUxEQU1GSUFBZ0JXb2dDQ0FGUVFGMmFpSUVMUUFBUVFSMk9nQUFJQUFnQlVFQmNtb2dCQzBBQUVFUGNUb0FBQ0FGUVFKcUlRVU1BUXNBQ3dBTElBVWdDMDBOQVNBSFFmOEJOZ0lFSUFZZ0IwRUVhaUFIUVFocUlBUkJBV29pRGlBTEVBd2lCRUdJZjBzRVFDQUVJUWdNQWd0QlZDRUlJQWNvQWdnaUVFRUdTdzBCSUFjb0FnUWlFVUVCZENJSlFRSnFyVUlCSUJDdGhpSVlRUUVnRUhRaURVRUJhaUlGclVJQ2hueDhRZ3Q4UXZ6Ly8vLy8vLy8vL3dDRFF1UUNWZzBCUVZJaENDQVJRZjhCU3cwQklBMUJmM05CQW5SQjVBSnFyU0FSUVFGcUloVkJBWFN0SUJoOFFnaDhWQTBCSUFzZ0JHc2hGaUFFSUE1cUlSY2dCa0dBQkdvaUVpQUZRUUowYWlJUklBbHFRUUpxSVE0Z0JrR0VCR29oRTBHQWdBSWdFSFJCRUhZaENVRUFJUVZCQVNFUElBMUJBV3NpRkNFS0EwQWdCU0FWUmtVRVFBSkFJQVlnQlVFQmRDSUlhaThCQUNJRVFmLy9BMFlFUUNBVElBcEJBblJxSUFVNkFBSWdDa0VCYXlFS1FRRWhCQXdCQ3lBUFFRQWdDU0FFd1VvYklROExJQWdnRVdvZ0JEc0JBQ0FGUVFGcUlRVU1BUXNMSUFZZ0R6c0JnZ1FnQmlBUU93R0FCQUpBSUFvZ0ZFWUVRQ0FOUVFOMklRaENBQ0VZUVFBaER3TkFJQXdnRlVZRVFDQUlJQTFCQVhacVFRTnFJZ2xCQVhRaENFRUFJUVJCQUNFS0EwQkJBQ0VGSUFvZ0RVOE5CQU5BSUFWQkFrWkZCRUFnRXlBRklBbHNJQVJxSUJSeFFRSjBhaUFPSUFVZ0NtcHFMUUFBT2dBQ0lBVkJBV29oQlF3QkN3c2dDa0VDYWlFS0lBUWdDR29nRkhFaEJBd0FDd0FGSUFZZ0RFRUJkR291QVFBaENTQU9JQTlxSWdRZ0dEY0FBRUVJSVFVRFFDQUZJQWxPUlFSQUlBUWdCV29nR0RjQUFDQUZRUWhxSVFVTUFRc0xJQmhDZ1lLRWlKQ2d3SUFCZkNFWUlBeEJBV29oRENBSklBOXFJUThNQVFzQUN3QUxJQTFCQTNZZ0RVRUJkbXBCQTJvaENFRUFJUVVEUUNBTUlCVkdSUVJBUVFBaENTQUdJQXhCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQUpSa1VFUUNBVElBVkJBblJxSUF3NkFBSURRQ0FGSUFocUlCUnhJZ1VnQ2tzTkFBc2dDVUVCYWlFSkRBRUxDeUFNUVFGcUlRd01BUXNMUVg4aENDQUZEUUlMSUJCQkFXb2hDRUVBSVFVRFFDQUZJQTFHUlFSQUlCRWdFeUFGUVFKMGFpSU9MUUFDUVFGMGFpSUVJQVF2QVFBaUNVRUJhanNCQUNBT0lBZ2dDV2RCWUhOcUlnUTZBQU1nRGlBSklBUjBJQTFyT3dFQUlBVkJBV29oQlF3QkN3c0NRQUpBSUFZdkFZSUVCRUFnQjBFY2FpSUVJQmNnRmhBTklnaEJpSDlMRFFJZ0IwRVVhaUFFSUJJUURpQUhRUXhxSUFRZ0VoQU9RUUFoQlFOQUlBZEJIR29pQkJBUElBVkIrd0ZMY2cwQ0lBQWdCV29pQmlBSFFSUnFJQVFRRURvQUFDQUdJQWRCREdvZ0JCQVFPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVTUF3VWdBQ0FFYWlBSFFSUnFJQWRCSEdvaUJCQVFPZ0FBSUFZZ0IwRU1haUFFRUJBNkFBTWdCVUVFYWlFRkRBRUxBQXNBQ3lBSFFSeHFJZ1FnRnlBV0VBMGlDRUdJZjBzTkFTQUhRUlJxSUFRZ0VoQU9JQWRCREdvZ0JDQVNFQTVCQUNFRkEwQWdCMEVjYWlJRUVBOGdCVUg3QVV0eVJRUkFJQUFnQldvaUJpQUhRUlJxSUFRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVUZJQUFnQkdvZ0IwRVVhaUFIUVJ4cUlnUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQURJQVZCQkdvaEJRd0NDd3NMQW44RFFFRzZmeUVJSUFWQi9RRkxEUU1nQUNBRmFpSUdJQWRCRkdvZ0IwRWNhaUlKRUJFNkFBQWdCa0VCYWlFRUlBa1FEMEVEUmdSQUlBZEJER29oQ0VFQ0RBSUxJQVZCL0FGTERRTWdCaUFIUVF4cUlBZEJIR29pQkJBUk9nQUJJQVZCQW1vaEJTQUVFQTlCQTBjTkFBc2dBQ0FGYWlFRUlBZEJGR29oQ0VFREN5QUVJQWdnQjBFY2FoQVJPZ0FBSUFacUlBQnJJUWdNQVFzQ2Z3TkFRYnAvSVFnZ0JVSDlBVXNOQWlBQUlBVnFJZ1lnQjBFVWFpQUhRUnhxSWdrUUVEb0FBQ0FHUVFGcUlRUWdDUkFQUVFOR0JFQWdCMEVNYWlFSVFRSU1BZ3NnQlVIOEFVc05BaUFHSUFkQkRHb2dCMEVjYWlJRUVCQTZBQUVnQlVFQ2FpRUZJQVFRRDBFRFJ3MEFDeUFBSUFWcUlRUWdCMEVVYWlFSVFRTUxJQVFnQ0NBSFFSeHFFQkE2QUFBZ0Jtb2dBR3NoQ0FzZ0NFR0lmMHNOQVFzZ0NDRUVRUUFoQlNBQlFRQkJOQkFESVFsQkFDRUtBMEFnQkNBRlJ3UkFJQUFnQldvaUJpMEFBQ0lCUVF0TEJFQkJiQ0VJREFNRklBa2dBVUVDZEdvaUFTQUJLQUlBUVFGcU5nSUFJQVZCQVdvaEJVRUJJQVl0QUFCMFFRRjFJQXBxSVFvTUFnc0FDd3RCYkNFSUlBcEZEUUFnQ21jaUJVRWZjeUlCUVF0TERRQWdBMEVnSUFWck5nSUFRUUZCQWlBQmRDQUtheUlEWjBFZmN5SUJkQ0FEUncwQUlBQWdCR29nQVVFQmFpSUFPZ0FBSUFrZ0FFRUNkR29pQUNBQUtBSUFRUUZxTmdJQUlBa29BZ1FpQUVFQ1NTQUFRUUZ4Y2cwQUlBSWdCRUVCYWpZQ0FDQUxRUUZxSVFnTElBZEJNR29rQUNBSUM2QUZBUXgvSXdCQkVHc2lEQ1FBQW44Z0JFRUhUUVJBSUF4Q0FEY0RDQ0FNUVFocUlnVWdBeUFFRUFJYVFXd2dBQ0FCSUFJZ0JVRUlFQXdpQUNBQUlBUkxHeUFBSUFCQmlYOUpHd3dCQ3lBQVFRQWdBU2dDQUVFQmFpSU5RUUYwRUFNaEQwRlVJQU1vQUFBaUJrRVBjU0lBUVFwTERRQWFJQUlnQUVFRmFqWUNBQ0FESUFScUlnSkJCR3NoQnlBQ1FRZHJJUXNnQUVFR2FpRU9RUVFoQWlBR1FRUjJJUVZCSUNBQWRDSUlRUUZ5SVFsQkFDRUFRUUVoQmlBRElRUURRQUpBSUFaQkFYRkZCRUFEUUNBRlFYOXpRWUNBZ0lCNGNtZ2lCa0VZU1VVRVFDQUFRU1JxSVFBZ0JDQUxUUVIvSUFSQkEyb0ZJQVFnQzJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTElBSWdCa0VlY1NJS2FrRUNhaUVDSUFaQkFYWkJBMndnQUdvZ0JTQUtka0VEY1dvaUFDQU5UdzBCQW44Z0JDQUxTeUFDUVFOMklBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFRZ0IydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTElBVWdDRUVCYTNFaUJpQUlRUUYwUVFGcklnb2dDV3NpRUVrRWZ5QU9RUUZyQlNBRklBcHhJZ1VnRUVFQUlBVWdDRTRiYXlFR0lBNExJUVVnRHlBQVFRRjBhaUFHUVFGcklnbzdBUUFnQUVFQmFpRUFJQUlnQldvaEFpQUlRUUVnQm1zZ0NpQUdRUUJLR3lBSmFpSUpTZ1JBSUFsQkFrZ05BVUVnSUFsbklnVnJJUTVCQVNBRlFSOXpkQ0VJQ3lBQUlBMVBEUUFnQ2tFQVJ5RUdBbjhnQkNBTFN5QUNRUU4xSUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQUlnQkNBSGEwRURkR3BCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTFFXd2dDVUVCUncwQUdrRlFJQUFnRFVzTkFCcEJiQ0FDUVNCS0RRQWFJQUVnQUVFQmF6WUNBQ0FFSUFKQkIycEJBM1ZxSUFOckN5QU1RUkJxSkFBTDhnRUJBWDhnQWtVRVFDQUFRZ0EzQWdBZ0FFRUFOZ0lRSUFCQ0FEY0NDRUc0Znc4TElBQWdBVFlDRENBQUlBRkJCR28yQWhBZ0FrRUVUd1JBSUFBZ0FTQUNhaUlCUVFScklnTTJBZ2dnQUNBREtBQUFOZ0lBSUFGQkFXc3RBQUFpQVFSQUlBQWdBV2RCRjJzMkFnUWdBZzhMSUFCQkFEWUNCRUYvRHdzZ0FDQUJOZ0lJSUFBZ0FTMEFBQ0lETmdJQUFrQUNRQUpBSUFKQkFtc09BZ0VBQWdzZ0FDQUJMUUFDUVJCMElBTnlJZ00yQWdBTElBQWdBUzBBQVVFSWRDQURhallDQUFzZ0FTQUNha0VCYXkwQUFDSUJSUVJBSUFCQkFEWUNCRUZzRHdzZ0FDQUJaeUFDUVFOMGEwRUphallDQkNBQ0MwUUJBbjhnQVNBQ0x3RUFJZ01nQVNnQ0JHb2lCRFlDQkNBQUlBTkJBblJCb0IxcUtBSUFJQUVvQWdCQkFDQUVhM1p4TmdJQUlBRVFEeG9nQUNBQ1FRUnFOZ0lFQzU4QkFRUi9RUU1oQVNBQUtBSUVJZ0pCSUUwRVFDQUFLQUlJSWdFZ0FDZ0NFRThFUUNBQUlBSkJCM0UyQWdRZ0FDQUJJQUpCQTNacklnSTJBZ2dnQUNBQ0tBQUFOZ0lBUVFBUEN5QUFLQUlNSWdNZ0FVWUVRRUVCUVFJZ0FrRWdTUnNQQ3lBQUlBRWdBU0FEYXlBQ1FRTjJJZ1FnQVNBRWF5QURTU0lCR3lJRGF5SUVOZ0lJSUFBZ0FpQURRUU4wYXpZQ0JDQUFJQVFvQUFBMkFnQUxJQUVMU0FFRWZ5QUFLQUlFSUFBb0FnQkJBblJxSWdJdEFBSWdBaThCQUNFRUlBRWdBU2dDQkNJRklBSXRBQU1pQW1vMkFnUWdBQ0FFSUFFb0FnQWdCWFJCQUNBQ2EzWnFOZ0lBQzFJQkJIOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJQUl2QVFBaEJDQUJJQUl0QUFNaUFpQUJLQUlFYWlJRk5nSUVJQUFnQkNBQ1FRSjBRYUFkYWlnQ0FDQUJLQUlBUVFBZ0JXdDJjV28yQWdBTENBQWdBRUdJZjBzTEdnQWdBQVJBSUFFRVFDQUNJQUFnQVJFQ0FBOExJQUFRQmdzTHBnZ0NEWDhCZmlNQVFSQnJJZ2trQUNBSlFRQTJBZ3dnQ1VFQU5nSUlBbjhDUUNBRFFlZ0phaUFESUFsQkNHb2dDVUVNYWlBQklBSWdBMEdBQVdvUUN5SVBRWWgvU3cwQVFWUWdDU2dDRENJRUlBQW9BZ0FpQVVIL0FYRkJBV3BMRFFFYUlBQkJCR29oQ3lBQUlBRkIvNEdBZUhFZ0JFRVFkRUdBZ1B3SGNYSTJBZ0JCZnlBRUlBUkJBRWdiUVFGcUlRQkJBQ0VCSUFrb0FnZ2hCVUVBSVFJRFFDQUFJQUpHQkVBZ0JVRURheUVCUVFBaEFBTkFBa0JCQUNFQ0lBQWdBVTRFUUFOQUlBQWdCVTROQWlBRElBQWdBMnBCNkFscUxRQUFRUUowYWtGQWF5SUJJQUVvQWdBaUFVRUJhallDQUNBQklBTnFJQUE2QU9nSElBQkJBV29oQUF3QUN3QUZBMEFnQWtFRVJrVUVRQ0FESUFNZ0FDQUNhaUlIYWtIb0NXb3RBQUJCQW5ScVFVQnJJZ2dnQ0NnQ0FDSUlRUUZxTmdJQUlBTWdDR29nQnpvQTZBY2dBa0VCYWlFQ0RBRUxDeUFBUVFScUlRQU1BZ3NBQ3dzZ0JFRUJhaUVPSUFNb0FnQWhCMEVBSVFCQkFTRUlBMEFnQ0NBT1JnMERJQTRnQ0dzaEJDQURJQWhCQW5ScUtBSUFJUVVDUUFKQUFrQUNRQUpBQWtCQkFTQUlkRUVCZFNJTlFRRnJEZ2dBQVFRQ0JBUUVBd1FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFBSVFFRFFDQUNJQVpHRFFVZ0F5QUNJQWRxYWkwQTZBY2hDaUFMSUFGQkFYUnFJZ3dnQkRvQUFTQU1JQW82QUFBZ0FrRUJhaUVDSUFGQkFXb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQ2lBQUlRRURRQ0FDSUFwR0RRUWdDeUFCUVFGMGFpSUdJQU1nQWlBSGFtb3RBT2dISWd3NkFBSWdCaUFFT2dBQklBWWdERG9BQUNBR0lBUTZBQU1nQWtFQmFpRUNJQUZCQW1vaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFFUVFoMFFZRCtBM0VoQkNBQUlRRURRQ0FDSUFaR0RRTWdDeUFCUVFGMGFpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK053QUFJQUpCQVdvaEFpQUJRUVJxSVFFTUFBc0FDMEVBSVFJZ0JVRUFJQVZCQUVvYklRWWdCRUVJZEVHQS9nTnhJUVFnQUNFQkEwQWdBaUFHUmcwQ0lBc2dBVUVCZEdvaUNpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0loRTNBQWdnQ2lBUk53QUFJQUpCQVdvaEFpQUJRUWhxSVFFTUFBc0FDMEVBSVFFZ0JVRUFJQVZCQUVvYklRb2dCRUVJZEVHQS9nTnhJUXdnQUNFRUEwQWdBU0FLUmcwQklBc2dCRUVCZEdvaEVDQU1JQU1nQVNBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0lSRkJBQ0VDQTBBZ0FpQU5Ua1VFUUNBUUlBSkJBWFJxSWdZZ0VUY0FHQ0FHSUJFM0FCQWdCaUFSTndBSUlBWWdFVGNBQUNBQ1FSQnFJUUlNQVFzTElBRkJBV29oQVNBRUlBMXFJUVFNQUFzQUN5QUlRUUZxSVFnZ0JTQUhhaUVISUFVZ0RXd2dBR29oQUF3QUN3QUZJQU1nQWtFQ2RHb2lCMEZBYXlBQk5nSUFJQUpCQVdvaEFpQUhLQUlBSUFGcUlRRU1BUXNBQ3dBTElBOExJQWxCRUdva0FBdnlBZ0VHZnlNQVFTQnJJZ1VrQUNBRUtBSUFJUVlnQlVFTWFpQUNJQU1RRFNJRFFZaC9UUVJBSUFSQkJHb2hBaUFBSUFGcUlnbEJBMnNoQkVFQUlBWkJFSFpyUVI5eElRTURRQ0FGUVF4cUVBOGdBQ0FFVDNKRkJFQWdBaUFGS0FJTUlnWWdCU2dDRUNJSGRDQURka0VCZEdvaUNDMEFBU0VLSUFBZ0NDMEFBRG9BQUNBQ0lBWWdCeUFLYWlJR2RDQURka0VCZEdvaUJ5MEFBQ0VJSUFVZ0JpQUhMUUFCYWpZQ0VDQUFJQWc2QUFFZ0FFRUNhaUVBREFFTEN3TkFJQVZCREdvUUR5RUhJQVVvQWd3aEJpQUZLQUlRSVFRZ0FDQUpUeUFIY2tVRVFDQUNJQVlnQkhRZ0EzWkJBWFJxSWdZdEFBQWhCeUFGSUFRZ0JpMEFBV28yQWhBZ0FDQUhPZ0FBSUFCQkFXb2hBQXdCQ3dzRFFDQUFJQWxQUlFSQUlBSWdCaUFFZENBRGRrRUJkR29pQnkwQUFTRUlJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdCQ0FJYWlFRURBRUxDMEZzUVd3Z0FTQUZLQUlVSUFVb0FoaEhHeUFFUVNCSEd5RURDeUFGUVNCcUpBQWdBd3ZQRkFFamZ5TUFRZEFBYXlJRkpBQkJiQ0VKQWtBZ0EwRUtTUTBBQWtBZ0F5QUNMd0FFSWdjZ0FpOEFBQ0lJSUFJdkFBSWlEV3BxUVFacUlneEpEUUFnQkM4QkFpRUdJQVZCUEdvZ0FrRUdhaUlDSUFnUURTSUpRWWgvU3cwQklBVkJLR29nQWlBSWFpSUNJQTBRRFNJSlFZaC9TdzBCSUFWQkZHb2dBaUFOYWlJQ0lBY1FEU0lKUVloL1N3MEJJQVVnQWlBSGFpQURJQXhyRUEwaUNVR0lmMHNOQVNBRVFRUnFJUW9nQUNBQmFpSWZRUU5ySVNCQkFDQUdhMEVmY1NFTElBVW9BZ2doRVNBRktBSWNJUklnQlNnQ01DRVRJQVVvQWtRaEZDQUZLQUlFSVFrZ0JTZ0NHQ0VOSUFVb0Fpd2hEQ0FGS0FKQUlRWWdCU2dDRUNFaElBVW9BaVFoSWlBRktBSTRJU01nQlNnQ1RDRWtJQVVvQWdBaEZTQUZLQUlVSVJZZ0JTZ0NLQ0VYSUFVb0Fqd2hHRUVCSVE4Z0FDQUJRUU5xUVFKMklnUnFJZ01nQkdvaUFpQUVhaUlaSVFRZ0FpRUlJQU1oQndOQUlBOUJBWEZGSUFRZ0lFOXlSUVJBSUFBZ0NpQVlJQVowSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEdpQU9MUUFESVJBZ0J5QUtJQmNnREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnRGkwQUFpRWJJQTR0QUFNaER5QUlJQW9nRmlBTmRDQUxka0VDZEdvaURpOEJBRHNBQUNBT0xRQUNJUndnRGkwQUF5RWRJQVFnQ2lBVklBbDBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloSGlBT0xRQURJUTRnQUNBUWFpSWxJQW9nR0NBR0lCcHFJZ1owSUF0MlFRSjBhaUlRTHdFQU93QUFJQkF0QUFJZ0VDMEFBeUVtSUFjZ0Qyb2lKeUFLSUJjZ0RDQWJhaUlhZENBTGRrRUNkR29pQnk4QkFEc0FBQ0FITFFBQ0lRd2dCeTBBQXlFUUlBZ2dIV29pR3lBS0lCWWdEU0FjYWlJUGRDQUxka0VDZEdvaUNDOEJBRHNBQUNBSUxRQUNJUTBnQ0MwQUF5RWNJQVFnRG1vaUhTQUtJQlVnQ1NBZWFpSU9kQ0FMZGtFQ2RHb2lDUzhCQURzQUFDQUdhaUVBUVFNaEJ3Si9JQlFnSkVrRVFDQUFJUVpCQXd3QkN5QUFRUWR4SVFZZ0ZDQUFRUU4yYXlJVUtBQUFJUmhCQUFzZ0NTMEFBeUVlSUFrdEFBSWhDQ0FNSUJwcUlRQWdFeUFqU1FSL0lBQUZJQk1nQUVFRGRtc2lFeWdBQUNFWFFRQWhCeUFBUVFkeEN5RU1JQTBnRDJvaEFDQUhjaUVKUVFNaER3Si9JQklnSWtrRVFDQUFJUTFCQXd3QkN5QUFRUWR4SVEwZ0VpQUFRUU4yYXlJU0tBQUFJUlpCQUFzZ0NDQU9haUVBSUFseUlCRWdJVWtFZnlBQUJTQVJJQUJCQTNackloRW9BQUFoRlVFQUlROGdBRUVIY1FzaENTQWxJQ1pxSVFBZ0VDQW5haUVISUJzZ0hHb2hDQ0FkSUI1cUlRUWdEM0pGSVE4TUFRc0xJQVVnRERZQ0xDQUZJQVkyQWtBZ0JTQU5OZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFJZ0Iwa2dBQ0FEUzNJTkFFRnNJUWtnQ0NBWlN3MEJJQU5CQTJzaENRTkFJQVZCUEdvUUQwVWdBQ0FKU1hFRVFDQUFJQW9nQlNnQ1BDSU5JQVVvQWtBaURIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0FDQU9MUUFEYWlJR0lBb2dEU0FNSUE0dEFBSnFJZ0IwSUF0MlFRSjBhaUlNTHdFQU93QUFJQVVnQUNBTUxRQUNhallDUUNBR0lBd3RBQU5xSVFBTUFRVWdBMEVDYXlFTUEwQWdCVUU4YWhBUElRWWdCU2dDUENFTklBVW9Ba0FoQ1NBQUlBeExJQVp5UlFSQUlBQWdDaUFOSUFsMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0NTQUdMUUFDYWpZQ1FDQUFJQVl0QUFOcUlRQU1BUXNMQTBBZ0FDQU1TMFVFUUNBQUlBb2dEU0FKZENBTGRrRUNkR29pQmk4QkFEc0FBQ0FBSUFZdEFBTnFJUUFnQ1NBR0xRQUNhaUVKREFFTEN3SkFJQUFnQTA4TkFDQUFJQW9nRFNBSmRDQUxkaUlBUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUpJQU10QUFKcUlRa01BUXNnQ1VFZlN3MEFRU0FnQ1NBS0lBQkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRa0xJQUpCQTJzaERBTkFJQVZCS0dvUUQwVWdCeUFNU1hFRVFDQUhJQW9nQlNnQ0tDSUdJQVVvQWl3aUFIUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0J5QU5MUUFEYWlJRElBb2dCaUFBSUEwdEFBSnFJZ0IwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQUNBR0xRQUNhallDTENBRElBWXRBQU5xSVFjTUFRVWdBa0VDYXlFR0EwQWdCVUVvYWhBUElRTWdCU2dDS0NFTUlBVW9BaXdoQUNBR0lBZEpJQU55UlFSQUlBY2dDaUFNSUFCMElBdDJRUUowYWlJREx3RUFPd0FBSUFVZ0FDQURMUUFDYWpZQ0xDQUhJQU10QUFOcUlRY01BUXNMQTBBZ0JpQUhTVVVFUUNBSElBb2dEQ0FBZENBTGRrRUNkR29pQXk4QkFEc0FBQ0FISUFNdEFBTnFJUWNnQUNBRExRQUNhaUVBREFFTEN3SkFJQUlnQjAwTkFDQUhJQW9nRENBQWRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUFJQU10QUFKcUlRQU1BUXNnQUVFZlN3MEFRU0FnQUNBS0lBSkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRQUxJQmxCQTJzaERBTkFJQVZCRkdvUUQwVWdDQ0FNU1hFRVFDQUlJQW9nQlNnQ0ZDSUdJQVVvQWhnaUFuUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0NDQU5MUUFEYWlJRElBb2dCaUFDSUEwdEFBSnFJZ0owSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQWlBR0xRQUNhallDR0NBRElBWXRBQU5xSVFnTUFRVWdHVUVDYXlFREEwQWdCVUVVYWhBUElRSWdCU2dDRkNFR0lBVW9BaGdoQnlBRElBaEpJQUp5UlFSQUlBZ2dDaUFHSUFkMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFVZ0J5QUNMUUFDYWpZQ0dDQUlJQUl0QUFOcUlRZ01BUXNMQTBBZ0F5QUlTVVVFUUNBSUlBb2dCaUFIZENBTGRrRUNkR29pQWk4QkFEc0FBQ0FJSUFJdEFBTnFJUWdnQnlBQ0xRQUNhaUVIREFFTEN3SkFJQWdnR1U4TkFDQUlJQW9nQmlBSGRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUhJQU10QUFKcUlRY01BUXNnQjBFZlN3MEFRU0FnQnlBS0lBSkJBblJxTFFBQ2FpSUNJQUpCSUU4YklRY0xBMEFnQlJBUFJTQUVJQ0JKY1FSQUlBUWdDaUFGS0FJQUlnWWdCU2dDQkNJQ2RDQUxka0VDZEdvaURDOEJBRHNBQUNBRUlBd3RBQU5xSWdNZ0NpQUdJQUlnREMwQUFtb2lBblFnQzNaQkFuUnFJZ1F2QVFBN0FBQWdCU0FDSUFRdEFBSnFOZ0lFSUFNZ0JDMEFBMm9oQkF3QkJTQWZRUUpySVFNRFFDQUZFQThoQWlBRktBSUFJUVlnQlNnQ0JDRUlJQU1nQkVrZ0FuSkZCRUFnQkNBS0lBWWdDSFFnQzNaQkFuUnFJZ0l2QVFBN0FBQWdCU0FJSUFJdEFBSnFOZ0lFSUFRZ0FpMEFBMm9oQkF3QkN3c0RRQ0FESUFSSlJRUkFJQVFnQ2lBR0lBaDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBUWdBaTBBQTJvaEJDQUlJQUl0QUFKcUlRZ01BUXNMQWtBZ0JDQWZUdzBBSUFRZ0NpQUdJQWgwSUF0MklnSkJBblJxSWdNdEFBQTZBQUFnQXkwQUEwRUJSZ1JBSUFnZ0F5MEFBbW9oQ0F3QkN5QUlRUjlMRFFCQklDQUlJQW9nQWtFQ2RHb3RBQUpxSWdJZ0FrRWdUeHNoQ0F0QmJFRnNRV3hCYkVGc1FXeEJiRUZzSUFFZ0NFRWdSeHNnQlNnQ0NDQUZLQUlNUnhzZ0IwRWdSeHNnQlNnQ0hDQUZLQUlnUnhzZ0FFRWdSeHNnQlNnQ01DQUZLQUkwUnhzZ0NVRWdSeHNnQlNnQ1JDQUZLQUpJUnhzaENRd0pDd0FMQUFzQUN3QUxBQXNBQ3dBTEFBdEJiQ0VKQ3lBRlFkQUFhaVFBSUFrTDdCQUJIbjhqQUVIUUFHc2lCU1FBUVd3aENRSkFJQU5CQ2trTkFBSkFJQU1nQWk4QUJDSUdJQUl2QUFBaUJ5QUNMd0FDSWdocWFrRUdhaUlPU1EwQUlBUXZBUUloRHlBRlFUeHFJQUpCQm1vaUFpQUhFQTBpQ1VHSWYwc05BU0FGUVNocUlBSWdCMm9pQWlBSUVBMGlDVUdJZjBzTkFTQUZRUlJxSUFJZ0NHb2lBaUFHRUEwaUNVR0lmMHNOQVNBRklBSWdCbW9nQXlBT2F4QU5JZ2xCaUg5TERRRWdCRUVFYWlFS0lBQWdBV29pSEVFRGF5RWRRUUFnRDJ0QkgzRWhDeUFGS0FJSUlSRWdCU2dDSENFU0lBVW9BakFoRXlBRktBSkVJUlFnQlNnQ0JDRUpJQVVvQWhnaEJpQUZLQUlzSVFjZ0JTZ0NRQ0VJSUFVb0FoQWhIaUFGS0FJa0lSOGdCU2dDT0NFZ0lBVW9Ba3doSVNBRktBSUFJUlVnQlNnQ0ZDRVdJQVVvQWlnaEZ5QUZLQUk4SVJoQkFTRU5JQUFnQVVFRGFrRUNkaUlDYWlJT0lBSnFJZzhnQW1vaUdTRUVJQThoQWlBT0lRTURRQ0FOUlNBRUlCMVBja1VFUUNBS0lCZ2dDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBQWdDaUFYSUFkMElBdDJRUUYwYWlJTUxRQUJJUkFnQXlBTUxRQUFPZ0FBSUFvZ0ZpQUdkQ0FMZGtFQmRHb2lEQzBBQVNFYUlBSWdEQzBBQURvQUFDQUtJQlVnQ1hRZ0MzWkJBWFJxSWd3dEFBRWhHeUFFSUF3dEFBQTZBQUFnQ2lBWUlBZ2dEV29pQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUVnQ2lBWElBY2dFR29pQjNRZ0MzWkJBWFJxSWd3dEFBRWhFQ0FESUF3dEFBQTZBQUVnQ2lBV0lBWWdHbW9pREhRZ0MzWkJBWFJxSWdZdEFBRWhHaUFDSUFZdEFBQTZBQUVnQ2lBVklBa2dHMm9pRzNRZ0MzWkJBWFJxSWdrdEFBRWhJaUFFSUFrdEFBQTZBQUVnQ0NBTmFpRUdRUU1oQ1FKL0lCUWdJVWtFUUVFRElRMGdCZ3dCQ3lBVUlBWkJBM1pySWhRb0FBQWhHRUVBSVEwZ0JrRUhjUXNoQ0NBSElCQnFJUVlnRXlBZ1NRUi9JQVlGSUJNZ0JrRURkbXNpRXlnQUFDRVhRUUFoQ1NBR1FRZHhDeUVISUF3Z0dtb2hEQ0FKSUExeUlSQkJBeUVOQW44Z0VpQWZTUVJBSUF3aEJrRUREQUVMSUF4QkIzRWhCaUFTSUF4QkEzWnJJaElvQUFBaEZrRUFDeUFiSUNKcUlRd2dFSEloRUNBUklCNUpCSDhnREFVZ0VTQU1RUU4yYXlJUktBQUFJUlZCQUNFTklBeEJCM0VMSVFrZ0JFRUNhaUVFSUFKQkFtb2hBaUFEUVFKcUlRTWdBRUVDYWlFQUlBMGdFSEpGSVEwTUFRc0xJQVVnQnpZQ0xDQUZJQWcyQWtBZ0JTQUdOZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFBZ0Rrc2dBeUFQUzNJTkFFRnNJUWtnQWlBWlN3MEJJQTVCQTJzaENRTkFJQVZCUEdvUUR5QUFJQWxQY2tVRVFDQUtJQVVvQWp3aUJpQUZLQUpBSWdkMElBdDJRUUYwYWlJSUxRQUJJUXdnQUNBSUxRQUFPZ0FBSUFvZ0JpQUhJQXhxSWdaMElBdDJRUUYwYWlJSExRQUFJUWdnQlNBR0lBY3RBQUZxTmdKQUlBQWdDRG9BQVNBQVFRSnFJUUFNQVFzTEEwQWdCVUU4YWhBUElRY2dCU2dDUENFR0lBVW9Ba0FoQ1NBQUlBNVBJQWR5UlFSQUlBb2dCaUFKZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQ1NBR0xRQUJhallDUUNBQUlBYzZBQUFnQUVFQmFpRUFEQUVMQ3dOQUlBQWdEazlGQkVBZ0NpQUdJQWwwSUF0MlFRRjBhaUlITFFBQklBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0NXb2hDUXdCQ3dzZ0QwRURheUVBQTBBZ0JVRW9haEFQSUFBZ0EwMXlSUVJBSUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQURJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaXdnQXlBSU9nQUJJQU5CQW1vaEF3d0JDd3NEUUNBRlFTaHFFQThoQnlBRktBSW9JUVlnQlNnQ0xDRUFJQU1nRDA4Z0IzSkZCRUFnQ2lBR0lBQjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQUFJQVl0QUFGcU5nSXNJQU1nQnpvQUFDQURRUUZxSVFNTUFRc0xBMEFnQXlBUFQwVUVRQ0FLSUFZZ0FIUWdDM1pCQVhScUlnY3RBQUVoQ0NBRElBY3RBQUE2QUFBZ0EwRUJhaUVESUFBZ0NHb2hBQXdCQ3dzZ0dVRURheUVEQTBBZ0JVRVVhaEFQSUFJZ0EwOXlSUVJBSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQUNJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaGdnQWlBSU9nQUJJQUpCQW1vaEFnd0JDd3NEUUNBRlFSUnFFQThoQnlBRktBSVVJUVlnQlNnQ0dDRURJQUlnR1U4Z0IzSkZCRUFnQ2lBR0lBTjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQURJQVl0QUFGcU5nSVlJQUlnQnpvQUFDQUNRUUZxSVFJTUFRc0xBMEFnQWlBWlQwVUVRQ0FLSUFZZ0EzUWdDM1pCQVhScUlnY3RBQUVoQ0NBQ0lBY3RBQUE2QUFBZ0FrRUJhaUVDSUFNZ0NHb2hBd3dCQ3dzRFFDQUZFQThnQkNBZFQzSkZCRUFnQ2lBRktBSUFJZ0lnQlNnQ0JDSUdkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUtJQUlnQmlBSWFpSUNkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdBaUFHTFFBQmFqWUNCQ0FFSUFjNkFBRWdCRUVDYWlFRURBRUxDd05BSUFVUUR5RUhJQVVvQWdBaEJpQUZLQUlFSVFJZ0JDQWNUeUFIY2tVRVFDQUtJQVlnQW5RZ0MzWkJBWFJxSWdZdEFBQWhCeUFGSUFJZ0JpMEFBV28yQWdRZ0JDQUhPZ0FBSUFSQkFXb2hCQXdCQ3dzRFFDQUVJQnhQUlFSQUlBb2dCaUFDZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FFUVFGcUlRUWdBaUFJYWlFQ0RBRUxDMEZzUVd4QmJFRnNRV3hCYkVGc1FXd2dBU0FDUVNCSEd5QUZLQUlJSUFVb0FneEhHeUFEUVNCSEd5QUZLQUljSUFVb0FpQkhHeUFBUVNCSEd5QUZLQUl3SUFVb0FqUkhHeUFKUVNCSEd5QUZLQUpFSUFVb0FraEhHeUVKREFFTFFXd2hDUXNnQlVIUUFHb2tBQ0FKQzFnQkEzOENRQ0FBS0FLUTZ3RWlBVVVOQUNBQktBSUFJQUZCdE5VQmFpZ0NBQ0lDSUFGQnVOVUJhaWdDQUNJREVCTWdBZ1JBSUFNZ0FTQUNFUUlBREFFTElBRVFCZ3NnQUVFQU5nS2c2d0VnQUVJQU53T1E2d0VMNlFNQ0JIOENmaUFBUVFCQktCQURJUVFnQWtFQlFRVWdBeHNpQUVrRVFDQUFEd3NnQVVVRVFFRi9Ed3RCQVNFR0FrQUNRQ0FEUVFGR0RRQWdBeUVHSUFFb0FBQWlCVUdvNnI1cFJnMEFRWFloQXlBRlFYQnhRZERVdE1JQlJ3MEJRUWdoQXlBQ1FRaEpEUUVnQVRVQUJDRUlJQVJCQVRZQ0ZDQUVJQWczQXdCQkFBOExJQUVnQWlBR0VCb2lBeUFDU3cwQUlBUWdBellDR0VGeUlRTWdBQ0FCYWlJRlFRRnJMUUFBSWdKQkNIRU5BQ0FDUVNCeElnWkZCRUJCY0NFRElBVXRBQUFpQlVHbkFVc05BU0FGUVFkeHJVSUJJQVZCQTNaQkNtcXRoaUlJUWdPSWZpQUlmQ0VKSUFCQkFXb2hBQXNnQWtFR2RpRUZJQUpCQW5aQkFDRURBa0FDUUFKQUFrQWdBa0VEY1VFQmF3NERBQUVDQXdzZ0FDQUJhaTBBQUNFRElBQkJBV29oQUF3Q0N5QUFJQUZxTHdBQUlRTWdBRUVDYWlFQURBRUxJQUFnQVdvb0FBQWhBeUFBUVFScUlRQUxRUUZ4SVFJQ2ZnSkFBa0FDUUFKQUlBVkJBV3NPQXdFQ0F3QUxRbjhnQmtVTkF4b2dBQ0FCYWpFQUFBd0RDeUFBSUFGcU13QUFRb0FDZkF3Q0N5QUFJQUZxTlFBQURBRUxJQUFnQVdvcEFBQUxJUWdnQkNBQ05nSWdJQVFnQXpZQ0hDQUVJQWczQXdCQkFDRURJQVJCQURZQ0ZDQUVJQWdnQ1NBR0d5SUlOd01JSUFSQ2dJQUlJQWdnQ0VLQWdBaGFHejRDRUFzZ0F3dGZBUUYvUWJoL0lRTWdBVUVCUVFVZ0Foc2lBazhFZnlBQUlBSnFRUUZyTFFBQUlnQkJBM0ZCQW5SQm9CNXFLQUlBSUFKcUlBQkJCSFpCREhGQnNCNXFLQUlBYWlBQVFTQnhJZ0ZGYWlBQlFRVjJJQUJCd0FCSmNXb0ZRYmgvQ3dzTUFDQUFJQUVnQWtFQUVCa0xsd01DQlg4Q2ZpTUFRVUJxSWdRa0FBSkFBMEFnQVVFRlR3UkFBa0FnQUNnQUFFRndjVUhRMUxUQ0FVWUVRRUorSVFjZ0FVRUlTUTBFSUFBb0FBUWlBa0YzU3cwRUlBSkJDR29pQXlBQlN3MEVJQUpCZ1g5SkRRRU1CQXNnQkVFWWFpQUFJQUVRR3lFQ1FuNGdCQ2tER0VJQUlBUW9BaXhCQVVjYklBSWJJZ2RDZlZZTkF5QUhJQWg4SWdnZ0IxUkNmaUVIRFFNQ1FBSkFJQUZCQ0VrTkFDQUFLQUFBUVhCeFFkRFV0TUlCUncwQUlBQW9BQVFpQWtGM1N3MEZRYmgvSUFKQkNHb2lBaUFCSUFKSkd5RUREQUVMSUFSQkdHb2dBQ0FCRUJzaUFrR0lmMHNFUUNBQ0lRTU1BUXRCdUg4aEF5QUNEUUFnQVNBRUtBSXdJZ0pySVFVZ0FDQUNhaUVHQTBBZ0JpQUZJQVJCREdvUUhTSURRWWgvU3cwQklBTkJBMm9pQWlBRlN3UkFRYmgvSVFNTUFnc2dCU0FDYXlFRklBSWdCbW9oQmlBRUtBSVFSUTBBQ3lBRUtBSTRCSDlCdUg4aEF5QUZRUVJKRFFFZ0JrRUVhZ1VnQmdzZ0FHc2hBd3NnQTBHSWYwc05Bd3NnQVNBRGF5RUJJQUFnQTJvaEFBd0JDd3RDZmlBSUlBRWJJUWNMSUFSQlFHc2tBQ0FIQzJRQkFYOUJ1SDhoQXdKQUlBRkJBMGtOQUNBQUxRQUNJUUVnQWlBQUx3QUFJZ0JCQVhFMkFnUWdBaUFBUVFGMlFRTnhJZ00yQWdBZ0FpQUFJQUZCRUhSeVFRTjJJZ0EyQWdnQ1FBSkFJQU5CQVdzT0F3SUJBQUVMUVd3UEN5QUFJUU1MSUFNTFJBRUNmeUFCSUFJb0FnUWlBeUFCS0FJRWFpSUVOZ0lFSUFBZ0EwRUNkRUdnSFdvb0FnQWdBU2dDQUVFQUlBUnJkbkUyQWdBZ0FSQVBHaUFBSUFKQkNHbzJBZ1FMemdFQkJuOUJ1bjhoQ2dKQUlBSW9BZ1FpQ0NBQ0tBSUFJZ2xxSWcwZ0FTQUFhMHNOQUVGc0lRb2dDU0FFSUFNb0FnQWlDMnRMRFFBZ0FDQUphaUlFSUFJb0FnZ2lER3NoQWlBQUlBRkJJR3NpQUNBTElBbEJBQkFnSUFNZ0NTQUxhallDQUFKQUFrQWdCQ0FGYXlBTVR3UkFJQUloQlF3QkN5QU1JQVFnQm10TERRSWdCeUFISUFJZ0JXc2lBbW9pQVNBSWFrOEVRQ0FFSUFFZ0NCQUtHZ3dDQ3lBQ0lBaHFJUWdnQkNBQlFRQWdBbXNRQ2lBQ2F5RUVDeUFFSUFBZ0JTQUlRUUVRSUFzZ0RTRUtDeUFLQzhjRUFRSi9JQUFnQTJvaEJnSkFJQU5CQjB3RVFBTkFJQUFnQms4TkFpQUFJQUl0QUFBNkFBQWdBRUVCYWlFQUlBSkJBV29oQWd3QUN3QUxJQVJCQVVZRVFBSkFJQUFnQW1zaUJVRUhUUVJBSUFBZ0FpMEFBRG9BQUNBQUlBSXRBQUU2QUFFZ0FDQUNMUUFDT2dBQ0lBQWdBaTBBQXpvQUF5QUFJQUlnQlVFQ2RDSUZRY0FlYWlnQ0FHb2lBaWdBQURZQUJDQUNJQVZCNEI1cUtBSUFheUVDREFFTElBQWdBaWtBQURjQUFBc2dBa0VJYWlFQ0lBQkJDR29oQUFzZ0FTQUdUd1JBSUFBZ0Eyb2hBU0FFUVFGSElBQWdBbXRCRDBweVJRUkFBMEFnQUNBQ0tRQUFOd0FBSUFKQkNHb2hBaUFBUVFocUlnQWdBVWtOQUF3REN3QUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQTBFUlNRMEJJQUJCRUdvaEFBTkFJQUFnQWlrQUVEY0FBQ0FBSUFJcEFCZzNBQWdnQUNBQ0tRQWdOd0FRSUFBZ0Fpa0FLRGNBR0NBQ1FTQnFJUUlnQUVFZ2FpSUFJQUZKRFFBTERBRUxBa0FnQUNBQlN3UkFJQUFoQVF3QkN5QUJJQUJySVFVQ1FDQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUlBSWhBd05BSUFBZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQUVFSWFpSUFJQUZKRFFBTERBRUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQlVFUlNBMEFJQUJCRUdvaEFDQUNJUU1EUUNBQUlBTXBBQkEzQUFBZ0FDQURLUUFZTndBSUlBQWdBeWtBSURjQUVDQUFJQU1wQUNnM0FCZ2dBMEVnYWlFRElBQkJJR29pQUNBQlNRMEFDd3NnQWlBRmFpRUNDd05BSUFFZ0JrOE5BU0FCSUFJdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaEFnd0FDd0FMQzY0SEFnVi9BWDRqQUVHQUFXc2lFU1FBSUJFZ0F6WUNmRUYvSVE4Q1FBSkFBa0FDUUFKQUlBSU9CQUVBQXdJRUN5QUdSUVJBUWJoL0lROE1CQXRCYkNFUElBVXRBQUFpQWlBRFN3MERJQWdnQWtFQ2RDSUNhaWdDQUNFRElBSWdCMm9vQWdBaEFpQUFRUUE2QUFzZ0FFSUFOd0lBSUFBZ0FqWUNEQ0FBSUFNNkFBb2dBRUVBT3dFSUlBRWdBRFlDQUVFQklROE1Bd3NnQVNBSk5nSUFRUUFoRHd3Q0N5QUtSUVJBUVd3aER3d0NDMEVBSVE4Z0MwVWdERUVaU0hJTkFVRUlJQVIwUVFocUlRQkJBQ0VEQTBBZ0FDQURUUTBDSUFOQlFHc2hBd3dBQ3dBTFFXd2hEeUFSSUJGQi9BQnFJQkZCK0FCcUlBVWdCaEFNSWdOQmlIOUxEUUFnRVNnQ2VDSUNJQVJMRFFBZ0VTZ0NmRUVCYWlFSklBQkJDR29oQzBHQWdBSWdBblJCRUhVaEJVRUJJUkJCQVNBQ2RDSVBRUUZySWdvaEVnTkFJQWtnRGtjRVFBSkFJQkVnRGtFQmRDSUVhaThCQUNJTVFmLy9BMFlFUUNBTElCSkJBM1JxSUE0MkFnUWdFa0VCYXlFU1FRRWhEQXdCQ3lBUVFRQWdCU0FNd1VvYklSQUxJQVFnRFdvZ0REc0JBQ0FPUVFGcUlRNE1BUXNMSUFBZ0FqWUNCQ0FBSUJBMkFnQUNRQ0FLSUJKR0JFQWdEVUhxQUdvaEJrRUFJUkJCQUNFTUEwQWdDU0FRUmdSQUlBOUJBM1lnRDBFQmRtcEJBMm9pQlVFQmRDRUVRUUFoREVFQUlSSURRRUVBSVE0Z0R5QVNUUTBFQTBBZ0RrRUNSd1JBSUFzZ0JTQU9iQ0FNYWlBS2NVRURkR29nQmlBT0lCSnFhaTBBQURZQ0JDQU9RUUZxSVE0TUFRc0xJQkpCQW1vaEVpQUVJQXhxSUFweElRd01BQXNBQlNBUklCQkJBWFJxTGdFQUlRVWdCaUFNYWlJRUlCTTNBQUJCQ0NFT0EwQWdCU0FPU2dSQUlBUWdEbW9nRXpjQUFDQU9RUWhxSVE0TUFRc0xJQk5DZ1lLRWlKQ2d3SUFCZkNFVElCQkJBV29oRUNBRklBeHFJUXdNQVFzQUN3QUxJQTlCQTNZZ0QwRUJkbXBCQTJvaEJVRUFJUkJCQUNFT0EwQWdDU0FRUmcwQlFRQWhEQ0FSSUJCQkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FNUndSQUlBc2dEa0VEZEdvZ0VEWUNCQU5BSUFVZ0Rtb2dDbkVpRGlBU1N3MEFDeUFNUVFGcUlRd01BUXNMSUJCQkFXb2hFQXdBQ3dBTElBSkJBV29oQlVFQUlRd0RRQ0FNSUE5SEJFQWdEU0FMSUF4QkEzUnFJZ2tvQWdRaUJFRUJkR29pQWlBQ0x3RUFJZ1pCQVdvN0FRQWdDU0FGSUFablFXQnphaUlDT2dBRElBa2dCaUFDZENBUGF6c0JBQ0FKSUFnZ0JFRUNkQ0lDYWlnQ0FEb0FBaUFKSUFJZ0Iyb29BZ0EyQWdRZ0RFRUJhaUVNREFFTEN5QUJJQUEyQWdBZ0F5RVBDeUFSUVlBQmFpUUFJQThMN1ZvQ08zOEdmaU1BUWVBQmF5SUVKQUFDUUVHdzdBa1FCU0lGUlFSQVFVQWhCd3dCQ3lBRlFnQTNBdlRxQVNBRlFRQTJBc1RyQVNBRlFRQTJBclRyQVNBRlFnQTNBcHpyQVNBRlFRQTJBcmpwQVNBRlFRQTJBcXpzQ1NBRlFnQTNBdFRyQVNBRlFnQTNBcXpyQVNBRlFnQTNBNGpyQVNBRlFnQTNBdVRxQVNBRlFnQTNBdVRyQVNBRlFZR0FnTUFBTmdLODZ3RWdCVUlBTndLazZ3RWdCVUg4NmdGcVFRQTJBZ0FnQlVHUTZ3RnFRZ0EzQXdBZ0JSQVlJQVZCck5VQmFpRVVJQVZCK09zQmFpRWNJQVZCc09vQmFpRWlJQVZCb0RCcUlTb2dCVUdZSUdvaEt5QUZRYWpRQUdvaEhpQUZRUkJxSVN3Z0JVRUlhaUVvSUFWQkJHb2hMU0FGUWNEcEFXb2hLU0FGUVlqckFXb2dCRUdVQVdvaEx5QUVRWXdCYWlFd0lBUkJoQUZxSVRFZ0JFSGNBR29oTWlBRVFkUUFhaUV6SUFSQnpBQnFJVFFnQUNFZEFrQUNRQUpBQWtBQ1FBTkFRUUZCQlNBRktBTGs2Z0ViSVFZQ1FBTkFJQU1nQmtrTkFTQUNLQUFBUVhCeFFkRFV0TUlCUmdSQVFiaC9JUWNnQTBFSVNRMElJQUlvQUFRaURrRjNTd1JBUVhJaEJ3d0pDeUFESUE1QkNHb2lDVWtOQ0NBT1FZQi9Td1JBSUFraEJ3d0pDeUFESUFscklRTWdBaUFKYWlFQ0RBRUxDeUFGUWdBM0FxenBBU0FGUWdBM0EranBBU0FGUVFBMkFwanJBU0FGUWdBM0E0RHFBU0FGUWdNM0EvanBBU0FGUWJUcEFXcENBRGNDQUNBRlFmRHBBV3BDQURjREFDQUZRYWpRQUdvaUNVR01nSURnQURZQ0FDQUZRYXpRQVdwQjRCSXBBZ0EzQWdBZ0JVRzAwQUZxUWVnU0tBSUFOZ0lBSUFVZ0JVRVFhallDQUNBRklBVkJvREJxTmdJRUlBVWdCVUdZSUdvMkFnZ2dCU0FKTmdJTUlBVkJBVUVGSUFVb0F1VHFBUnMyQXJ6cEFRSkFJQUZGRFFBZ0JTZ0NyT2tCSWdrZ0hVWU5BQ0FGSUFrMkFyanBBU0FGSUIwMkFxenBBU0FGS0FLdzZRRWhEaUFGSUIwMkFyRHBBU0FGSUIwZ0RpQUphMm8yQXJUcEFRdEJ1SDhoQ1NBRFFRVkJDU0FGS0FMazZnRWlCaHRKRFFVZ0FrRUJRUVVnQmhzZ0JoQWFJZzVCaUg5TEJFQWdEaUVKREFVTElBTWdEa0VEYWtrTkJTQXBJQUlnRGlBR0VCa2lCa0dJZjBzRVFDQUdJUWtNQlFzZ0JnMEZBa0FDUUNBRktBS282d0ZCQVVjTkFDQUZLQUtrNndFaUNVVU5BQ0FGS0FLVTZ3RkZEUUFnQ1NnQ0JFRUJheUlISUFVb0F0enBBU0lLclVLSGxhK3ZtTGJlbTU1L2ZrTEp6OW15OGVXNjZpZUZRaGVKUXMvVzA3N1N4NnZaUW41QytmUGQ4Wm4ybWFzV2ZDSS9RaUdJSUQrRlFzL1cwNzdTeDZ2WlFuNGlQMElkaUNBL2hVTDU4OTN4bWZhWnF4WitJajlDSUlnZ1A0V25jU0VHSUFrb0FnQWhGUU5BUVFBaENBSkFJQlVnQmtFQ2RHb29BZ0FpQ1VVTkFDQUpLQUlJUVFoSkRRQWdDU2dDQkNJU0tBQUFRYmZJd3VGK1J3MEFJQklvQUFRaENBc2dDQ0FLUndSQUlBWWdCM0ZCQVdvaEJpQUlEUUVMQ3lBSlJRMEFJQVVRR0NBRlFYODJBcURyQVNBRklBazJBcFRyQVNBRklBVW9BdHpwQVNJSU5nS1k2d0VNQVFzZ0JTZ0MzT2tCSVFnTEFrQWdDRVVOQUNBRktBS1k2d0VnQ0VZTkFFRmdJUWtNQmdzQ1FDQUZLQUxnNlFFRVFDQUZJQVVvQXVqcUFTSUpSVFlDN09vQklBa05BU0FGUXZucTBORG55YUhrNFFBM0E2anFBU0FGUWdBM0E2RHFBU0FGUXMvVzA3N1N4NnZaUWpjRG1Pb0JJQVZDMXV1Qzd1cjlpZlhnQURjRGtPb0JJQVZDQURjRGlPb0JJQ0pCQUVFb0VBTWFEQUVMSUFWQkFEWUM3T29CQ3lBQklCMXFJU1VnQlNBRktRUG82UUVnRHExOE53UG82UUVnQXlBT2F5RURJQUlnRG1vaEFpQWRJUTREUUNBQ0lBTWdCRUVzYWhBZEloVkJpSDlMQkVBZ0ZTRUpEQVlMSUFOQkEyc2lOU0FWU1EwRUlBSkJBMm9oRzBGc0lRa0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRUtBSXNEZ01DQVFBVkN5QVZRZi8vQjBzTkV5QVZRUU5KRFJJZ0JTa0R5T2tCSVQ4Q1FBSkFJQnN0QUFBaUNVRURjU0lhUVFGckRnTUdBUUFIQ3lBRktBS0E2Z0VOQUVGaUlRa01GUXNnRlVFRlNRMFNJQnNvQUFBaEF3Si9Ba0FDUUFKQUlBbEJBblpCQTNFaUNVRUNhdzRDQVFJQUN5QUpRUUJISVFjZ0EwRUVka0gvQjNFaEMwRURJUVlnQTBFT2RrSC9CM0VNQWd0QkJDRUdJQU5CQkhaQi8vOEFjU0VMUVFFaEJ5QURRUkoyREFFTElBTkJCSFpCLy84UGNTSUxRWUNBQ0VzTkUwRUJJUWRCQlNFR0lBSXRBQWRCQ25RZ0EwRVdkbklMSWdnZ0Jtb2lDU0FWU3cwU0FrQWdDMEdCQmtrTkFDQUZLQUtjNndGRkRRQkJBQ0VEQTBBZ0EwR0RnQUZMRFFFZ0EwRkFheUVEREFBTEFBc2dCaUFiYWlFUElCcEJBMGNOQmlBRktBSU1JZ0l0QUFGQkNIUWhBeUFIRFFjZ0EwVU5DQ0FFUWZBQWFpQVBJQWdRRFNJRFFZaC9TdzBKSUFKQkJHb2hCaUFMSUJ4cUloSkJBMnNoQ2tFQUlBSXZBUUpyUVI5eElRY2dIQ0VEQTBBZ0JFSHdBR29RRDBVZ0F5QUtTWEVFUUNBRElBWWdCQ2dDY0NJSUlBUW9BblFpRDNRZ0IzWkJBblJxSWdJdkFRQTdBQUFnQXlBQ0xRQURhaUlESUFZZ0NDQVBJQUl0QUFKcUlnaDBJQWQyUVFKMGFpSUNMd0VBT3dBQUlBUWdDQ0FDTFFBQ2FqWUNkQ0FESUFJdEFBTnFJUU1NQVFVZ0VrRUNheUVJQTBBZ0JFSHdBR29RRHlFUElBUW9BbkFoQ2lBRUtBSjBJUUlnQXlBSVN5QVBja1VFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pQ2k4QkFEc0FBQ0FFSUFJZ0NpMEFBbW8yQW5RZ0F5QUtMUUFEYWlFRERBRUxDd05BSUFNZ0NFMEVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lEeThCQURzQUFDQURJQTh0QUFOcUlRTWdBaUFQTFFBQ2FpRUNEQUVMQ3dKQUlBTWdFazhOQUNBRElBWWdDaUFDZENBSGRrRUNkR29pQXkwQUFEb0FBQ0FETFFBRFFRRkdCRUFnQWlBRExRQUNhaUVDREFFTElBSkJIMHNOQUVFZ0lBSWdBeTBBQW1vaUFpQUNRU0JQR3lFQ0MwRnNRV3dnQ3lBRUtBSjRJQVFvQW54SEd5QUNRU0JIR3lFRERBc0xBQXNBQ3lBRUtBSTBJZ0lnSlNBT2Ewc05DaUFPUlFSQVFRQWhDU0FDRFFJTURnc2dEaUFiTFFBQUlBSVFBeG9nQWlFSkRBd0xJQlVnSlNBT2Ewc05DU0FPRFFGQkFDRUpJQlZGRFF3TFFiWi9JUWtNRVFzZ0RpQWJJQlVRQWhvZ0ZTRUpEQW9MSUJ3Z0d3Si9Ba0FDUUFKQUlBbEJBblpCQTNGQkFXc09Bd0VBQWdBTElBbEJBM1loQTBFQkRBSUxJQnN2QUFCQkJIWWhBMEVDREFFTElCVkJCRWtORGlBQ0x3QURJQUl0QUFWQkVIUnlJZ0pCajRDQUFVc05EaUFDUVFSMklRTkJBd3NpQW1vdEFBQWdBMEVnYWhBRElRa2dCU0FETmdLQTZ3RWdCU0FKTmdMdzZnRWdBa0VCYWlFSkRBVUxJQlVDZndKQUFrQUNRQ0FKUVFKMlFRTnhRUUZyRGdNQkFBSUFDeUFKUVFOMklRTkJBUXdDQ3lBYkx3QUFRUVIySVFOQkFnd0JDeUFDTHdBRElBSXRBQVZCRUhSeVFRUjJJUU5CQXdzaUFpQURhaUlKUVNCcVNRUkFJQWtnRlVzTkRTQWNJQUlnRzJvZ0F4QUNJUUlnQlNBRE5nS0E2d0VnQlNBQ05nTHc2Z0VnQWlBRGFpSUNRZ0EzQUJnZ0FrSUFOd0FRSUFKQ0FEY0FDQ0FDUWdBM0FBQU1CUXNnQlNBRE5nS0E2d0VnQlNBQ0lCdHFOZ0x3NmdFTUJBc2dCMFVFUUNBZUlBOGdDQ0FVRUJRaUFrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGU0VEREFNTElBdEZJQWhGY2cwTElBdEJDSFlpQXlBSUlBdEpCSDhnQ0VFRWRDQUxiZ1ZCRHd0QkdHd2lBa0dNQ0dvb0FnQnNJQUpCaUFocUtBSUFhaUlHUVFOMklBWnFJQUpCZ0FocUtBSUFJQUpCaEFocUtBSUFJQU5zYWtrRVFDTUFRUkJySWhBa0FDQWVLQUlBSVFNZ0ZFSHdCR3BCQUVIc0FCQURJUVpCVkNFQ0FrQWdBMEgvQVhFaURFRU1TdzBBQWtBZ0ZFSGNDV29nQmlBUVFRaHFJQkJCREdvZ0R5QUlJQlJCM0F0cUloY1FDeUlTUVloL1N3MEFJQkFvQWd3aUJpQU1TdzBCSUJSQnFBVnFJUTBnRkVHa0JXb2hOaUFlUVFScUlSRWdBMEdBZ0lCNGNTRTNJQVpCQVdvaUV5RUNJQVloQXdOQUlBSWlCMEVCYXlFQ0lBTWlDa0VCYXlFRElCUWdDa0VDZEdvb0F2QUVSUTBBQzBFQklBY2dCMEVCVFJzaEZrRUFJUWRCQVNFQ0EwQWdBaUFXUndSQUlCUWdBa0VDZENJRGFpZ0M4QVFoR0NBRElBMXFJQWMyQWdBZ0FrRUJhaUVDSUFjZ0dHb2hCd3dCQ3dzZ0RTQUhOZ0lBUVFBaEFpQVFLQUlJSVFNRFFDQUNJQU5IQkVBZ0RTQUNJQlJxUWR3SmFpMEFBQ0lZUVFKMGFpSVpJQmtvQWdBaUdVRUJhallDQUNBVUlCbEJBWFJxSWhrZ0dEb0EzUVVnR1NBQ09nRGNCU0FDUVFGcUlRSU1BUXNMUVFBaEF5QU5RUUEyQWdBZ0RDQUdRWDl6YWlFR1FRRWhBZ05BSUFJZ0ZrY0VRQ0FVSUFKQkFuUnFJZzBnQXpZQ0FDQU5LQUx3QkNBQ0lBWnFkQ0FEYWlFRElBSkJBV29oQWd3QkN3c2dEQ0FUSUFwcklnWnJRUUZxSVFvZ0JpRURBMEFnQXlBS1NRUkFJQlFnQTBFMGJHb2hEVUVCSVFJRFFDQUNJQlpIQkVBZ0RTQUNRUUowSWhocUlCUWdHR29vQWdBZ0EzWTJBZ0FnQWtFQmFpRUNEQUVMQ3lBRFFRRnFJUU1NQVFzTElCY2dGRUUwRUFJaE9DQVVRWkFNYWlFNUlCTWdER3NoT2lBVVFkd0ZhaUVYUVFBaENnTkFBa0FDUUNBSElBcEhCRUJCQVNBTUlCTWdGeUFLUVFGMGFpSUNMUUFCSWcxcklnTnJJaGgwSVJrZ0FpMEFBQ0VXSURnZ0RVRUNkR29pSHlnQ0FDRUNJQVlnR0UwRVFDQTJRUUVnQXlBNmFpSU5JQTFCQVV3YklpQkJBblFpSkdvb0FnQWhEU0E1SUJRZ0EwRTBiR3BCTkJBQ0lTRWdEVUVCZENFbUlCRWdBa0VDZEdvaEl5QWdRUUZORFFJZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRWdJQ0VnSkdvb0FnQWhKRUVBSVFJRFFDQUNJQ1JHRFFNZ0l5QUNRUUowYWlBZ05nRUFJQUpCQVdvaEFnd0FDd0FMSUFJZ0FpQVphaUlOSUFJZ0RVc2JJUTBnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFREEwQWdBaUFOUmcwRElCRWdBa0VDZEdvZ0F6WUJBQ0FDUVFGcUlRSU1BQXNBQ3lBZUlBeEJFSFFnTjNJZ0RISkJnQUp5TmdJQURBTUxJQWNnRFdzaEpDQVhJQ1pxSVNaQkFDRU5BMEFnRFNBa1JnMEJRUUVnR0NBVElDWWdEVUVCZEdvaUp5MEFBU0lDYXlJN2EzUWlQQ0FoSUFKQkFuUnFJaUFvQWdBaUFtb2hQU0FESUR0cVFSQjBRWUNBL0FkeElDY3RBQUJCQ0hSeUlCWnlRWUNBZ0JCeUlTY0RRQ0FqSUFKQkFuUnFJQ2MyQVFBZ0FrRUJhaUlDSUQxSkRRQUxJQ0FnSUNnQ0FDQThhallDQUNBTlFRRnFJUTBNQUFzQUN5QWZJQjhvQWdBZ0dXbzJBZ0FnQ2tFQmFpRUtEQUFMQUFzZ0VpRUNDeUFRUVJCcUpBQWdBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRmlFRERBTUxJQjRnRHlBSUlCUVFGQ0lDUVloL1N5QUNJQWhQY2cwTElCd2dDeUFDSUE5cUlBZ2dBbXNnSGhBWElRTU1BZ3NnQXdSQUlCd2dDeUFQSUFnZ0FoQVdJUU1NQWdzZ0hDQUxJQThnQ0NBQ0VCY2hBd3dCQ3lBY0lBc2dEeUFJSUFJUUZTRURDeUFEUVloL1N3MElJQVVnQ3pZQ2dPc0JJQVVnSERZQzhPb0JJQVZCQVRZQ2dPb0JJQnBCQWtZRVFDQUZJQjQyQWd3TElBc2dIR29pQWtJQU53QUFJQUpDQURjQUdDQUNRZ0EzQUJBZ0FrSUFOd0FJSUFsQmlIOUxEUW9MSUFrZ0ZVWU5DQ0FWSUFscklRWWdCU2dDbk9zQklRb0NRQ0FKSUJ0cUlnTXRBQUFpRDBVRVFFRUJJUUpCQUNFUFFiaC9JUWtnQmtFQlJnMEJEQXNMQW44Z0EwRUJhaUFQd0NJQ1FRQk9EUUFhSUFKQmYwWUVRQ0FHUVFOSURRc2dBeThBQVVHQS9nRnFJUThnQTBFRGFnd0JDeUFHUVFKSURRb2dBeTBBQVNBUFFRaDBja0dBZ0FKcklROGdBMEVDYWdzaEVrRzRmeUVKSUJKQkFXb2lBaUFWSUJ0cUlnZExEUW9nTENBRklCSXRBQUFpRWtFR2RrRWpRUWtnQWlBSElBSnJRY0FRUWRBUlFmQVNJQVVvQW9UcUFTQUtJQThnRkJBaElnbEJpSDlMRFFnZ0t5QW9JQkpCQkhaQkEzRkJIMEVJSUFJZ0NXb2lBaUFISUFKclFZQUxRWUFNUVlBWElBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlDRUdJZjBzTkNFRnNJUWtnS2lBdElCSkJBblpCQTNGQk5FRUpJQUlnQ0dvaUFpQUhJQUpyUVlBTlFlQU9RWkFaSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUIwR0lmMHNOQ2lBQ0lBZHFJQU5ySWdJaENTQUNRWWgvU3cwS0N5QU9JQTlCQUV4eURRRUxRYnAvSVFrTUNBc2dKU0FPYXlFSklBWWdBbXNoQmlBQ0lBTnFJUWNDUUFKQUFrQWdDa1VFUUNBUFFRbElJQVVwQThqcEFVS0JnSUFJVkhJTkFpQW9LQUlBSWdKQkNHb2hFaUFDS0FJRUlRcEJBQ0VEUVFBaEFnTkFJQU1nQ25aRkJFQWdBaUFTSUFOQkEzUnFMUUFDUVJaTGFpRUNJQU5CQVdvaEF3d0JDd3NnQlVFQU5nS2M2d0VnQWtFSUlBcHJkRUVVVHcwQkRBTUxJQVZCQURZQ25Pc0JDeUFFSUFVb0F2RHFBU0lETmdMY0FTQUpJQTVxSVJZZ0F5QUZLQUtBNndGcUlSY0NRQ0FQUlFSQUlBNGhCd3dCQ3lBRktBSzQ2UUVoR2lBRktBSzA2UUVoR0NBRktBS3c2UUVoRWlBRlFRRTJBb1RxQVVFQUlRTURRQ0FEUVFOSEJFQWdCQ0FEUVFKMElnSnFJQUlnQldwQnJOQUJhaWdDQURZQ1pDQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFUaHFJZ0lnQnlBR0VBMUJpSDlMRFFOQkNDQVBJQTlCQ0U0YklSOGdOQ0FDSUFVb0FnQVFIaUF6SUFJZ0JTZ0NDQkFlSURJZ0FpQUZLQUlFRUI0Z0RpQVNheUVaUVFBaENBTkFJQVJCT0dvUUQwRURSaUFJSUI5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdkQkVIWWlFVUgvQVhFaEN5QUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZ3hCRUhZaUlVSC9BWEVoRUNBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUVlnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNrSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lLYXlJTklBSWdBaUFOU3hzaUV5QUthallDUENBR0lBUW9BamdnQ25SQkFDQVRhM1lnQWlBVGF5SVRkR29oQ2lBRVFUaHFFQThhSUFJZ0RVME5BU0FFSUFRb0Fqd2lBaUFUYWpZQ1BDQUVLQUk0SUFKMFFRQWdFMnQySUFwcUlRb01BUXNnQkNBQ0lBUW9BandpRFdvMkFqd2dCQ2dDT0NBTmRFRUFJQXByZGlBR2FpRUtJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQW8yQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBREJFQWdCQ2dDWkNFS0RBTUxJQVFvQW1naENnd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQVlnQTBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdaRklBWnFJUW9nQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlBbzJBbVFMcHlFQ0lFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQkJxTmdJOElBUW9BamdnQm5SQkFDQWhhM1lnQW1vaEFnc2dDeUFRYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUF0cU5nSThJQVFvQWpnZ0JuUkJBQ0FSYTNZZ0Eyb2hBd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lCa0VBSUFkQkdIWWlDeUFFS0FJOGFpSVFhM1lnQzBFQ2RFR2dIV29vQWdCeElBZEIvLzhEY1dvMkFrd2dCQ0FRSUF4QkdIWWlCMm9pQ3pZQ1BDQUVJQWRCQW5SQm9CMXFLQUlBSUFaQkFDQUxhM1p4SUF4Qi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ1pCR0hZaUJ5QUVLQUk4YWlJTE5nSThJQVFnQjBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUF0cmRuRWdCa0gvL3dOeGFqWUNWQ0FFUWZBQWFpQUlRUXhzYWlJR0lBbzJBZ2dnQmlBQ05nSUVJQVlnQXpZQ0FDQUlRUUZxSVFnZ0F5QVphaUFDYWlFWkRBRUxDeUFJSUI5SURRTWdGa0VnYXlFaElBNGhCd05BSUFSQk9Hb1FEMEVEUmlBSUlBOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnWkJFSFlpSTBIL0FYRWhDaUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWcxQkVIWWlJRUgvQVhFaEV5QUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFNZ1FVSWdpQ0JBUWlDSXB5RUxBa0FnUWtJUWlLY2lERUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJTWF5SVJJQUlnQWlBUlN4c2lFQ0FNYWpZQ1BDQURJQVFvQWpnZ0RIUkJBQ0FRYTNZZ0FpQVFheUlNZEdvaEVDQUVRVGhxRUE4YUlBSWdFVTBOQVNBRUlBUW9BandpQWlBTWFqWUNQQ0FFS0FJNElBSjBRUUFnREd0MklCQnFJUkFNQVFzZ0JDQUNJQVFvQWp3aUVHbzJBandnQkNnQ09DQVFkRUVBSUF4cmRpQURhaUVRSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUJBMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQUxCRUFnQkNnQ1pDRVFEQU1MSUFRb0FtZ2hFQXdCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFNZ0MwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnTkZJQU5xSVJBZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQkEyQW1RTHB5RU1JRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUJOcU5nSThJQVFvQWpnZ0FuUkJBQ0FnYTNZZ0RHb2hEQXNnQ2lBVGFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lBcHFOZ0k4SUFRb0FqZ2dBblJCQUNBamEzWWdDMm9oQ3dzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQWtFQUlBWkJHSFlpQXlBRUtBSThhaUlLYTNZZ0EwRUNkRUdnSFdvb0FnQnhJQVpCLy84RGNXbzJBa3dnQkNBS0lBMUJHSFlpQTJvaUJqWUNQQ0FFSUFOQkFuUkJvQjFxS0FJQUlBSkJBQ0FHYTNaeElBMUIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdKQkdIWWlBeUFFS0FJOGFpSUdOZ0k4SUFRZ0EwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBWnJkbkVnQWtILy93TnhhallDVkFKQUFrQUNRQ0FFS0FMY0FTSURJQVJCOEFCcUlBaEJCM0ZCREd4cUloTW9BZ0FpRVdvaUl5QVhTdzBBSUFjZ0V5Z0NCQ0lOSUJGcUlncHFJQ0ZMRFFBZ0NrRWdhaUFXSUFkclRRMEJDeUFFSUJNb0FnZzJBaGdnQkNBVEtRSUFOd01RSUFjZ0ZpQUVRUkJxSUFSQjNBRnFJQmNnRWlBWUlCb1FIeUVLREFFTElBY2dFV29oQWlBVEtBSUlJUVlnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0FKQUlCRkJFVWtOQUNBSElBTXBBQkEzQUJBZ0J5QURLUUFZTndBWUlCRkJFR3RCRVVnTkFDQURRUkJxSVFNZ0IwRWdhaUVSQTBBZ0VTQURLUUFRTndBQUlCRWdBeWtBR0RjQUNDQVJJQU1wQUNBM0FCQWdFU0FES1FBb053QVlJQU5CSUdvaEF5QVJRU0JxSWhFZ0Fra05BQXNMSUFJZ0Jtc2hBeUFFSUNNMkF0d0JJQUlnRW1zZ0Jra0VRQ0FHSUFJZ0dHdExEUWNnR2lBYUlBTWdFbXNpQTJvaUVTQU5hazhFUUNBQ0lCRWdEUkFLR2d3Q0N5QURJQTFxSVEwZ0FpQVJRUUFnQTJzUUNpQURheUVDSUJJaEF3c2dCa0VRVHdSQUlBSWdBeWtBQURjQUFDQUNJQU1wQUFnM0FBZ2dEVUVSU0EwQklBSWdEV29oQmlBQ1FSQnFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBR1NRMEFDd3dCQ3dKQUlBWkJCMDBFUUNBQ0lBTXRBQUE2QUFBZ0FpQURMUUFCT2dBQklBSWdBeTBBQWpvQUFpQUNJQU10QUFNNkFBTWdBaUFESUFaQkFuUWlCa0hBSG1vb0FnQnFJZ01vQUFBMkFBUWdBeUFHUWVBZWFpZ0NBR3NoQXd3QkN5QUNJQU1wQUFBM0FBQUxJQTFCQ1VrTkFDQUNJQTFxSVJFZ0FrRUlhaUlHSUFOQkNHb2lBMnRCRDB3RVFBTkFJQVlnQXlrQUFEY0FBQ0FEUVFocUlRTWdCa0VJYWlJR0lCRkpEUUFNQWdzQUN5QUdJQU1wQUFBM0FBQWdCaUFES1FBSU53QUlJQTFCR1VnTkFDQUNRUmhxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQVJTUTBBQ3dzZ0NrR0lmMHNFUUNBS0lRa01CZ1VnRXlBUU5nSUlJQk1nRERZQ0JDQVRJQXMyQWdBZ0NFRUJhaUVJSUFjZ0Ntb2hCeUFMSUJscUlBeHFJUmtNQWdzQUN3c2dDQ0FQU0EwRElBZ2dIMnNoQmdOQUFrQWdCaUFQVGdSQVFRQWhBd05BSUFOQkEwWU5BaUFGSUFOQkFuUWlBbXBCck5BQmFpQUNJQVJxS0FKa05nSUFJQU5CQVdvaEF3d0FDd0FMQWtBQ1FBSkFJQVFvQXR3QklnTWdCRUh3QUdvZ0JrRUhjVUVNYkdvaUNDZ0NBQ0lNYWlJUUlCZExEUUFnQnlBSUtBSUVJZ3NnREdvaUNtb2dJVXNOQUNBS1FTQnFJQllnQjJ0TkRRRUxJQVFnQ0NnQ0NEWUNLQ0FFSUFncEFnQTNBeUFnQnlBV0lBUkJJR29nQkVIY0FXb2dGeUFTSUJnZ0doQWZJUW9NQVFzZ0J5QU1haUVDSUFnb0FnZ2hDQ0FISUFNcEFBQTNBQUFnQnlBREtRQUlOd0FJQWtBZ0RFRVJTUTBBSUFjZ0F5a0FFRGNBRUNBSElBTXBBQmczQUJnZ0RFRVFhMEVSU0EwQUlBTkJFR29oQXlBSFFTQnFJUXdEUUNBTUlBTXBBQkEzQUFBZ0RDQURLUUFZTndBSUlBd2dBeWtBSURjQUVDQU1JQU1wQUNnM0FCZ2dBMEVnYWlFRElBeEJJR29pRENBQ1NRMEFDd3NnQWlBSWF5RURJQVFnRURZQzNBRWdBaUFTYXlBSVNRUkFJQWdnQWlBWWEwc05CeUFhSUJvZ0F5QVNheUlEYWlJTUlBdHFUd1JBSUFJZ0RDQUxFQW9hREFJTElBTWdDMm9oQ3lBQ0lBeEJBQ0FEYXhBS0lBTnJJUUlnRWlFREN5QUlRUkJQQkVBZ0FpQURLUUFBTndBQUlBSWdBeWtBQ0RjQUNDQUxRUkZJRFFFZ0FpQUxhaUVJSUFKQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFJZ0F5MEFBRG9BQUNBQ0lBTXRBQUU2QUFFZ0FpQURMUUFDT2dBQ0lBSWdBeTBBQXpvQUF5QUNJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBSWdBeWtBQURjQUFBc2dDMEVKU1EwQUlBSWdDMm9oRENBQ1FRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0RFa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dDMEVaU0EwQUlBSkJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBeEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0dCU0FHUVFGcUlRWWdCeUFLYWlFSERBSUxBQXNMSUFRb0F0d0JJUU1MUWJwL0lRa2dGeUFEYXlJQ0lCWWdCMnRMRFFJZ0J3Ui9JQWNnQXlBQ0VBSWdBbW9GUVFBTElBNXJJUWtNQWdzZ0JVRUFOZ0tjNndFTElBUWdCU2dDOE9vQklnTTJBdHdCSUFrZ0Rtb2hEQ0FESUFVb0FvRHJBV29oRUFKQUlBOUZCRUFnRGlFR0RBRUxJQVVvQXJqcEFTRU5JQVVvQXJUcEFTRVRJQVVvQXJEcEFTRVNJQVZCQVRZQ2hPb0JRUUFoQXdOQUlBTkJBMGNFUUNBRUlBTkJBblFpQW1vZ0FpQUZha0dzMEFGcUtBSUFOZ0tjQVNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUWZBQWFpSUNJQWNnQmhBTlFZaC9TdzBCSURFZ0FpQUZLQUlBRUI0Z01DQUNJQVVvQWdnUUhpQXZJQUlnQlNnQ0JCQWVJQXhCSUdzaEdDQU9JUVlEUUNBRUtBS0lBU0FFS0FLRUFVRURkR29wQWdBaVFLY2lDa0VRZGlJWlFmOEJjU0VMSUFRb0FwZ0JJQVFvQXBRQlFRTjBhaWtDQUNKQnB5SVdRUkIySWg5Qi93RnhJUm9nQkNnQ2tBRWdCQ2dDakFGQkEzUnFLUUlBSWtKQ0lJaW5JUWNnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NkQ0lJYXlJUklBSWdBaUFSU3hzaUZ5QUlhallDZENBSElBUW9BbkFnQ0hSQkFDQVhhM1lnQWlBWGF5SVhkR29oQ0NBRVFmQUFhaEFQR2lBQ0lCRk5EUUVnQkNBRUtBSjBJZ0lnRjJvMkFuUWdCQ2dDY0NBQ2RFRUFJQmRyZGlBSWFpRUlEQUVMSUFRZ0FpQUVLQUowSWhGcU5nSjBJQVFvQW5BZ0VYUkJBQ0FJYTNZZ0Iyb2hDQ0FFUWZBQWFoQVBHZ3NnQkNrQ25BRWhSQ0FFSUFnMkFwd0JJQVFnUkRjQ29BRU1BUXNDUUNBQ1JRUkFJQU1FUUNBRUtBS2NBU0VJREFNTElBUW9BcUFCSVFnTUFRc2dCQ0FFS0FKMElnSkJBV28yQW5RQ2Z5QUhJQU5GYWlBRUtBSndJQUowUVI5MmFpSUNRUU5HQkVBZ0JDZ0NuQUZCQVdzTUFRc2dBa0VDZENBRWFpZ0NuQUVMSWdkRklBZHFJUWdnQWtFQlJ3UkFJQVFnQkNnQ29BRTJBcVFCQ3dzZ0JDQUVLQUtjQVRZQ29BRWdCQ0FJTmdLY0FRdW5JUUlnUVVLQWdQd0hnMUJGQkVBZ0JDQUVLQUowSWdjZ0dtbzJBblFnQkNnQ2NDQUhkRUVBSUI5cmRpQUNhaUVDQ3lBTElCcHFRUlJQQkVBZ0JFSHdBR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ2RDSUhJQXRxTmdKMElBUW9BbkFnQjNSQkFDQVphM1lnQTJvaEF3c2dCRUh3QUdvUUR4b2dCQ0FFS0FKd0lnZEJBQ0FLUVJoMklnc2dCQ2dDZEdvaUdtdDJJQXRCQW5SQm9CMXFLQUlBY1NBS1FmLy9BM0ZxTmdLRUFTQUVJQm9nRmtFWWRpSUthaUlMTmdKMElBUWdDa0VDZEVHZ0hXb29BZ0FnQjBFQUlBdHJkbkVnRmtILy93TnhhallDbEFFZ0JFSHdBR29RRHhvZ0JDQkNweUlIUVJoMklnb2dCQ2dDZEdvaUN6WUNkQ0FFSUFwQkFuUkJvQjFxS0FJQUlBUW9BbkJCQUNBTGEzWnhJQWRCLy84RGNXbzJBb3dCSUFRZ0F6WUNPQ0FFSUFJMkFqd2dCQ0FJTmdKQUFrQUNRQUpBSUFRb0F0d0JJZ3NnQTJvaUZpQVFTdzBBSUFZZ0FpQURhaUlLYWlBWVN3MEFJQXBCSUdvZ0RDQUdhMDBOQVFzZ0JDQUVRVUJyS0FJQU5nSUlJQVFnQkNrRE9EY0RBQ0FHSUF3Z0JDQUVRZHdCYWlBUUlCSWdFeUFORUI4aENnd0JDeUFESUFacUlRY2dCaUFMS1FBQU53QUFJQVlnQ3lrQUNEY0FDQUpBSUFOQkVVa05BQ0FHSUFzcEFCQTNBQkFnQmlBTEtRQVlOd0FZSUFOQkVHdEJFVWdOQUNBTFFSQnFJUU1nQmtFZ2FpRUxBMEFnQ3lBREtRQVFOd0FBSUFzZ0F5a0FHRGNBQ0NBTElBTXBBQ0EzQUJBZ0N5QURLUUFvTndBWUlBTkJJR29oQXlBTFFTQnFJZ3NnQjBrTkFBc0xJQWNnQ0dzaEF5QUVJQlkyQXR3QklBY2dFbXNnQ0VrRVFDQUlJQWNnRTJ0TERRUWdEU0FOSUFNZ0Vtc2lBMm9pQ3lBQ2FrOEVRQ0FISUFzZ0FoQUtHZ3dDQ3lBSElBdEJBQ0FEYXhBS0lBUWdBaUFEYWlJQ05nSThJQU5ySVFjZ0VpRURDeUFJUVJCUEJFQWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQ0FDUVJGSURRRWdBaUFIYWlFSUlBZEJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBY2dBeTBBQURvQUFDQUhJQU10QUFFNkFBRWdCeUFETFFBQ09nQUNJQWNnQXkwQUF6b0FBeUFISUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQWNnQXlrQUFEY0FBQXNnQWtFSlNRMEFJQUlnQjJvaEN5QUhRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dDMGtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQWtFWlNBMEFJQWRCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXRKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdEQ3lBR0lBcHFJUVlnQkVId0FHb1FEeUVESUE5QkFXc2lEdzBBQzBFQUlRSWdBMEVDU1EwQkEwQWdBa0VEUndSQUlBVWdBa0VDZENJRGFrR3MwQUZxSUFNZ0JHb29BcHdCTmdJQUlBSkJBV29oQWd3QkN3c2dCQ2dDM0FFaEF3dEJ1bjhoQ1NBUUlBTnJJZ0lnRENBR2Ewc05BQ0FHQkg4Z0JpQURJQUlRQWlBQ2FnVkJBQXNnRG1zaENRc2dDVUdJZjBzTkJnc0NRQ0FGS0FMczZnRkZEUUFnQlNBRktRT0k2Z0VnQ2ExOE53T0k2Z0VDUUNBRktBTFE2Z0VpQWlBSmFpSUlRUjlOQkVBZ0RrVU5BU0FDSUNKcUlBNGdDUkFDR2lBRktBTFE2Z0VnQ1dvaENBd0JDeUFPSVFNZ0FnUkFJQUlnSW1vZ0EwRWdJQUpyRUFJYUlBVW9BdERxQVNFQ0lBVkJBRFlDME9vQklBVWdCU2tEa09vQklBVXBBTERxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRGtPb0JJQVVnQlNrRG1Pb0JJQVVwQUxqcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RtT29CSUFVZ0JTa0RvT29CSUFVcEFNRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEb09vQklBVWdCU2tEcU9vQklBVXBBTWpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRHFPb0JJQU1nQW10QklHb2hBd3NnQ1NBT2FpSUNJQU5CSUdwUEJFQWdBa0VnYXlFR0lBVXBBNmpxQVNFL0lBVXBBNkRxQVNGQUlBVXBBNWpxQVNGQklBVXBBNURxQVNGQ0EwQWdBeWtBR0VMUDF0Tyswc2VyMlVKK0lEOThRaCtKUW9lVnI2K1l0dDZibm45K0lUOGdBeWtBRUVMUDF0Tyswc2VyMlVKK0lFQjhRaCtKUW9lVnI2K1l0dDZibm45K0lVQWdBeWtBQ0VMUDF0Tyswc2VyMlVKK0lFRjhRaCtKUW9lVnI2K1l0dDZibm45K0lVRWdBeWtBQUVMUDF0Tyswc2VyMlVKK0lFSjhRaCtKUW9lVnI2K1l0dDZibm45K0lVSWdBMEVnYWlJRElBWk5EUUFMSUFVZ1B6Y0RxT29CSUFVZ1FEY0RvT29CSUFVZ1FUY0RtT29CSUFVZ1FqY0RrT29CQ3lBQ0lBTk5EUUVnSWlBRElBSWdBMnNpQ0JBQ0dnc2dCU0FJTmdMUTZnRUxJRFVnRldzaEF5QVZJQnRxSVFJZ0NTQU9haUVPSUFRb0FqQkZEUUFMSUNrcEF3QWlQMEovVVNBL0lBNGdIV3VzVVhKRkJFQkJiQ0VKREFZTElBVW9BdURwQVFSQVFXb2hDU0FEUVFSSkRRWWdCU2dDNk9vQlJRUkFJQ0lnQlNnQzBPb0JhaUVLQW40Z0JTa0RpT29CSWo5Q0lGb0VRQ0FGS1FPWTZnRWlRRUlIaVNBRktRT1E2Z0VpUVVJQmlYd2dCU2tEb09vQklrSkNESWw4SUFVcEE2anFBU0pEUWhLSmZDQkJRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOUlFQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZvVkNoNVd2cjVpMjNwdWVmMzVDbmFPMTZvT3hqWXI2QUgwZ1FrTFAxdE8rMHNlcjJVSitRaCtKUW9lVnI2K1l0dDZibm45K2hVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNCRFFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5REFFTElBVXBBNkRxQVVMRno5bXk4ZVc2NmlkOEN5QS9mQ0UvSUNJaEJnTkFJQW9nQmtFSWFpSUhUd1JBSUFZcEFBQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUliaVVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0UvSUFjaEJnd0JDd3NDUUNBS0lBWkJCR29pQ0VrRVFDQUdJUWdNQVFzZ0JqVUFBRUtIbGErdm1MYmVtNTUvZmlBL2hVSVhpVUxQMXRPKzBzZXIyVUorUXZuejNmR1o5cG1yRm53aFB3c0RRQ0FJSUFwSkJFQWdDREVBQUVMRno5bXk4ZVc2NmlkK0lEK0ZRZ3VKUW9lVnI2K1l0dDZibm45K0lUOGdDRUVCYWlFSURBRUxDeUFDS0FBQUlEOUNJWWdnUDRWQ3o5YlR2dExIcTlsQ2ZpSS9RaDJJSUQrRlF2bnozZkdaOXBtckZuNGlQMElnaUNBL2hhZEhEUWNMSUFOQkJHc2hBeUFDUVFScUlRSUxJQTRnSFdzaUNVR0pmMDhOQkNBQklBbHJJUUVnQ1NBZGFpRWRRUUVoUGd3QkN3dEJ1SDhoQnlBRERRUWdIU0FBYXlFSERBUUxRV3doQ1F3QkMwRzRmeUVKQzBHNGZ5RUhJQWxCZGtZZ1BuRU5BUXNnQ1NFSEN5Z0NBQTBBSUFWQi9Pb0JhaWdDQUNFQklBVkIrT29CYWlnQ0FDRUFJQVVRR0NBRktBS3c2d0VnQUNBQkVCTWdCVUVBTmdLdzZ3RWdCU2dDcE9zQklnSUVRQUpBQWtBQ1FBSkFJQUlvQWdBaUF3UkFJQUJGRFFJZ0FTQURJQUFSQWdBTUFRc2dBRVVOQWdzZ0FTQUNJQUFSQWdBTUFnc2dBeEFHQ3lBQ0VBWUxJQVZCQURZQ3BPc0JDeUFBQkVBZ0FTQUZJQUFSQWdBTUFRc2dCUkFHQ3lBRVFlQUJhaVFBSUFjTEM2Z1ZDUUJCaUFnTERRRUFBQUFCQUFBQUFnQUFBQUlBUWFBSUM3TUdBUUFBQUFFQUFBQUNBQUFBQWdBQUFDWUFBQUNDQUFBQUlRVUFBRW9BQUFCbkNBQUFKZ0FBQU1BQkFBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUtRQUFBQ3dDQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBTHdBQUFNb0NBQUNBQUFBQWlnVUFBRW9BQUFDRUNRQUFOUUFBQUhNREFBQ0FBQUFBblFVQUFFb0FBQUNnQ1FBQVBRQUFBSUVEQUFDQUFBQUE2d1VBQUVzQUFBQStDZ0FBUkFBQUFKNERBQUNBQUFBQVRRWUFBRXNBQUFDcUNnQUFTd0FBQUxNREFBQ0FBQUFBd1FZQUFFMEFBQUFmRFFBQVRRQUFBRk1FQUFDQUFBQUFJd2dBQUZFQUFBQ21Ed0FBVkFBQUFKa0VBQUNBQUFBQVN3a0FBRmNBQUFDeEVnQUFXQUFBQU5vRUFBQ0FBQUFBYndrQUFGMEFBQUFqRkFBQVZBQUFBRVVGQUFDQUFBQUFWQW9BQUdvQUFBQ01GQUFBYWdBQUFLOEZBQUNBQUFBQWRna0FBSHdBQUFCT0VBQUFmQUFBQU5JQ0FBQ0FBQUFBWXdjQUFKRUFBQUNRQndBQWtnQUFBQUFBQUFBQkFBQUFBUUFBQUFVQUFBQU5BQUFBSFFBQUFEMEFBQUI5QUFBQS9RQUFBUDBCQUFEOUF3QUEvUWNBQVAwUEFBRDlId0FBL1Q4QUFQMS9BQUQ5L3dBQS9mOEJBUDMvQXdEOS93Y0EvZjhQQVAzL0h3RDkvejhBL2Y5L0FQMy8vd0Q5Ly84Qi9mLy9BLzMvL3dmOS8vOFAvZi8vSC8zLy96LzkvLzkvQUFBQUFBRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVJBQUFBRWdBQUFCTUFBQUFVQUFBQUZRQUFBQllBQUFBWEFBQUFHQUFBQUJrQUFBQWFBQUFBR3dBQUFCd0FBQUFkQUFBQUhnQUFBQjhBQUFBREFBQUFCQUFBQUFVQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFCRUFBQUFTQUFBQUV3QUFBQlFBQUFBVkFBQUFGZ0FBQUJjQUFBQVlBQUFBR1FBQUFCb0FBQUFiQUFBQUhBQUFBQjBBQUFBZUFBQUFId0FBQUNBQUFBQWhBQUFBSWdBQUFDTUFBQUFsQUFBQUp3QUFBQ2tBQUFBckFBQUFMd0FBQURNQUFBQTdBQUFBUXdBQUFGTUFBQUJqQUFBQWd3QUFBQU1CQUFBREFnQUFBd1FBQUFNSUFBQURFQUFBQXlBQUFBTkFBQUFEZ0FBQUF3QUJBRUhnRHd0UkFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVVBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBQUFBUUFFSEVFQXVMQVFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBU0FBQUFGQUFBQUJZQUFBQVlBQUFBSEFBQUFDQUFBQUFvQUFBQU1BQUFBRUFBQUFDQUFBQUFBQUVBQUFBQ0FBQUFCQUFBQUFnQUFBQVFBQUFBSUFBQUFFQUFBQUNBQUFBQUFBRUFRWkFTQytZRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBQkFBQUFCQUFBQUFnQUFBQUFBQUFBQVFBQkFRWUFBQUFBQUFBRUFBQUFBQkFBQUFRQUFBQUFJQUFBQlFFQUFBQUFBQUFGQXdBQUFBQUFBQVVFQUFBQUFBQUFCUVlBQUFBQUFBQUZCd0FBQUFBQUFBVUpBQUFBQUFBQUJRb0FBQUFBQUFBRkRBQUFBQUFBQUFZT0FBQUFBQUFCQlJBQUFBQUFBQUVGRkFBQUFBQUFBUVVXQUFBQUFBQUNCUndBQUFBQUFBTUZJQUFBQUFBQUJBVXdBQUFBSUFBR0JVQUFBQUFBQUFjRmdBQUFBQUFBQ0FZQUFRQUFBQUFLQmdBRUFBQUFBQXdHQUJBQUFDQUFBQVFBQUFBQUFBQUFCQUVBQUFBQUFBQUZBZ0FBQUNBQUFBVUVBQUFBQUFBQUJRVUFBQUFnQUFBRkJ3QUFBQUFBQUFVSUFBQUFJQUFBQlFvQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUlBQUJCUkFBQUFBQUFBRUZFZ0FBQUNBQUFRVVdBQUFBQUFBQ0JSZ0FBQUFnQUFNRklBQUFBQUFBQXdVb0FBQUFBQUFHQkVBQUFBQVFBQVlFUUFBQUFDQUFCd1dBQUFBQUFBQUpCZ0FDQUFBQUFBc0dBQWdBQURBQUFBUUFBQUFBRUFBQUJBRUFBQUFnQUFBRkFnQUFBQ0FBQUFVREFBQUFJQUFBQlFVQUFBQWdBQUFGQmdBQUFDQUFBQVVJQUFBQUlBQUFCUWtBQUFBZ0FBQUZDd0FBQUNBQUFBVU1BQUFBQUFBQUJnOEFBQUFnQUFFRkVnQUFBQ0FBQVFVVUFBQUFJQUFDQlJnQUFBQWdBQUlGSEFBQUFDQUFBd1VvQUFBQUlBQUVCVEFBQUFBQUFCQUdBQUFCQUFBQUR3WUFnQUFBQUFBT0JnQkFBQUFBQUEwR0FDQUFRWUFYQzRjQ0FRQUJBUVVBQUFBQUFBQUZBQUFBQUFBQUJnUTlBQUFBQUFBSkJmMEJBQUFBQUE4Ri9YOEFBQUFBRlFYOS94OEFBQUFEQlFVQUFBQUFBQWNFZlFBQUFBQUFEQVg5RHdBQUFBQVNCZjMvQXdBQUFCY0YvZjkvQUFBQUJRVWRBQUFBQUFBSUJQMEFBQUFBQUE0Ri9UOEFBQUFBRkFYOS93OEFBQUFDQlFFQUFBQVFBQWNFZlFBQUFBQUFDd1g5QndBQUFBQVJCZjMvQVFBQUFCWUYvZjgvQUFBQUJBVU5BQUFBRUFBSUJQMEFBQUFBQUEwRi9SOEFBQUFBRXdYOS93Y0FBQUFCQlFFQUFBQVFBQVlFUFFBQUFBQUFDZ1g5QXdBQUFBQVFCZjMvQUFBQUFCd0YvZi8vRHdBQUd3WDkvLzhIQUFBYUJmMy8vd01BQUJrRi9mLy9BUUFBR0FYOS8vOEFRWkFaQzRZRUFRQUJBUVlBQUFBQUFBQUdBd0FBQUFBQUFBUUVBQUFBSUFBQUJRVUFBQUFBQUFBRkJnQUFBQUFBQUFVSUFBQUFBQUFBQlFrQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUFBQUFCaEFBQUFBQUFBQUdFd0FBQUFBQUFBWVdBQUFBQUFBQUJoa0FBQUFBQUFBR0hBQUFBQUFBQUFZZkFBQUFBQUFBQmlJQUFBQUFBQUVHSlFBQUFBQUFBUVlwQUFBQUFBQUNCaThBQUFBQUFBTUdPd0FBQUFBQUJBWlRBQUFBQUFBSEJvTUFBQUFBQUFrR0F3SUFBQkFBQUFRRUFBQUFBQUFBQkFVQUFBQWdBQUFGQmdBQUFBQUFBQVVIQUFBQUlBQUFCUWtBQUFBQUFBQUZDZ0FBQUFBQUFBWU1BQUFBQUFBQUJnOEFBQUFBQUFBR0VnQUFBQUFBQUFZVkFBQUFBQUFBQmhnQUFBQUFBQUFHR3dBQUFBQUFBQVllQUFBQUFBQUFCaUVBQUFBQUFBRUdJd0FBQUFBQUFRWW5BQUFBQUFBQ0Jpc0FBQUFBQUFNR013QUFBQUFBQkFaREFBQUFBQUFGQm1NQUFBQUFBQWdHQXdFQUFDQUFBQVFFQUFBQU1BQUFCQVFBQUFBUUFBQUVCUUFBQUNBQUFBVUhBQUFBSUFBQUJRZ0FBQUFnQUFBRkNnQUFBQ0FBQUFVTEFBQUFBQUFBQmc0QUFBQUFBQUFHRVFBQUFBQUFBQVlVQUFBQUFBQUFCaGNBQUFBQUFBQUdHZ0FBQUFBQUFBWWRBQUFBQUFBQUJpQUFBQUFBQUJBR0F3QUJBQUFBRHdZRGdBQUFBQUFPQmdOQUFBQUFBQTBHQXlBQUFBQUFEQVlERUFBQUFBQUxCZ01JQUFBQUFBb0dBd1FBUWFRZEM5a0JBUUFBQUFNQUFBQUhBQUFBRHdBQUFCOEFBQUEvQUFBQWZ3QUFBUDhBQUFEL0FRQUEvd01BQVA4SEFBRC9Ed0FBL3g4QUFQOC9BQUQvZndBQS8vOEFBUC8vQVFELy93TUEvLzhIQVAvL0R3RC8veDhBLy84L0FQLy9md0QvLy84QS8vLy9BZi8vL3dQLy8vOEgvLy8vRC8vLy94Ly8vLzgvLy8vL2Z3QUFBQUFCQUFBQUFnQUFBQVFBQUFBQUFBQUFBZ0FBQUFRQUFBQUlBQUFBQUFBQUFBRUFBQUFDQUFBQUFRQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBZ0FBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0JCZ0I4TEE0QVJBUT09Ijt2YXIgeXQ9bmV3IEtBLG10PSExO2FzeW5jIGZ1bmN0aW9uIHlyKEEsZSx0KXtsZXQgST0idW5rbm93biI7dHlwZW9mIEEhPSJzdHJpbmciP0k9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP0k9QTpJPXR5cGVvZiBlPCJ1Ij9gJHtlfS8ke0F9YDpBLEkuZW5kc1dpdGgoIi5qcyIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTMpKSxJLmVuZHNXaXRoKCIud2FzbSIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTUpKSxJLmVuZHNXaXRoKCIud2FzbS56c3QiKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC05KSk7bGV0IHI9YCR7SX0ud2FzbWAsaT1hd2FpdCB0QS5nZXQoYCR7cn0uenN0YCx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KTttdHx8KGF3YWl0IHl0LmluaXQoKSxtdD0hMCk7bGV0IHM9eXQuZGVjb2RlKG5ldyBVaW50OEFycmF5KGkuZGF0YSkpLmJ1ZmZlcjtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke0l9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6c30pfXZhciB3dD15cjt2YXIgU3Q9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIFV0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLEZ0PW5ldyBUZXh0RW5jb2RlcixSdD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gbXIoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxJPUEuZnNfb3BlbihlLHQuZmxhZ3MpLGk9QS5mc19zdGF0KGUpLnNpemUsZz1udWxsO1V0P2c9bmV3IFNoYXJlZEFycmF5QnVmZmVyKGkpOmc9bmV3IEFycmF5QnVmZmVyKGkpO2xldCBzPW5ldyBVaW50OEFycmF5KGcpO3JldHVybiBBLmZzX3JlYWQoSSxzLDAsaSwwKSxBLmZzX2Nsb3NlKEkpLHN9ZnVuY3Rpb24ga3QoQSxlLHQpe2xldCBJPW51bGw7VXQ/ST1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6ST1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoSSksaT1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gci5zZXQoaSkscn1mdW5jdGlvbiB3KEEsZSx0LEkpe2xldCByPTA7cmV0dXJuIGUhPT1udWxsJiYocj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LEksZS5idWZmZXIuYnl0ZUxlbmd0aF0pLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheShlLmJ1ZmZlcikscikpLHJ9ZnVuY3Rpb24gUChBLGUsdCl7bGV0IEk9SlNPTi5zdHJpbmdpZnkoZSkscj1BLmxlbmd0aEJ5dGVzVVRGOChJKSsxLGk9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LHJdKTtBLnN0cmluZ1RvVVRGOChJLGkscil9ZnVuY3Rpb24gRihBLGUsdCxJKXtsZXQgcj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxpPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLGc9a3QoQSxyLGkpO3JldHVybiBKKEksZy5idWZmZXIpfWZ1bmN0aW9uIHBBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSksST1BLlVURjhUb1N0cmluZyh0KTtyZXR1cm4gSlNPTi5wYXJzZShJKX1mdW5jdGlvbiB3cihBLGUsdCxJKXtJIT1udWxsJiZJLmxlbmd0aD4wJiZJLmZvckVhY2goZnVuY3Rpb24oQyxvKXtzd2l0Y2goQy50eXBlKXtjYXNlIHUuVGV4dFN0cmVhbTp7bGV0IGE9RnQuZW5jb2RlKEMuZGF0YS5kYXRhKSxjPXcoQSxhLG8sMCksQj17c2l6ZTphLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWB9O1AoQSxCLG8pO2JyZWFrfWNhc2UgdS5Kc29uQ29tcGF0aWJsZTp7bGV0IGE9RnQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEMuZGF0YSkpLGM9dyhBLGEsbywwKSxCPXtzaXplOmEuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YH07UChBLEIsbyk7YnJlYWt9Y2FzZSB1LkJpbmFyeVN0cmVhbTp7bGV0IGE9Qy5kYXRhLmRhdGEsYz13KEEsYSxvLDApLEI9e3NpemU6YS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gfTtQKEEsQixvKTticmVha31jYXNlIHUuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEMuZGF0YS5wYXRoLEMuZGF0YS5kYXRhKTticmVha31jYXNlIHUuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQy5kYXRhLnBhdGgsQy5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgdS5JbWFnZTp7bGV0IGE9Qy5kYXRhLGM9dyhBLGEuZGF0YSxvLDApLEI9dyhBLGEuZGlyZWN0aW9uLG8sMSksRT10eXBlb2YgYS5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShhLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sZj17aW1hZ2VUeXBlOmEuaW1hZ2VUeXBlLG5hbWU6YS5uYW1lLG9yaWdpbjphLm9yaWdpbixzcGFjaW5nOmEuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWAsc2l6ZTphLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCxtZXRhZGF0YTpFfTtQKEEsZixvKTticmVha31jYXNlIHUuTWVzaDp7bGV0IGE9Qy5kYXRhLGM9dyhBLGEucG9pbnRzLG8sMCksQj13KEEsYS5jZWxscyxvLDEpLEU9dyhBLGEucG9pbnREYXRhLG8sMiksZj13KEEsYS5jZWxsRGF0YSxvLDMpLFE9e21lc2hUeXBlOmEubWVzaFR5cGUsbmFtZTphLm5hbWUsbnVtYmVyT2ZQb2ludHM6YS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZDZWxsczphLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWAsY2VsbEJ1ZmZlclNpemU6YS5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtFfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmEubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtQKEEsUSxvKTticmVha31jYXNlIHUuUG9pbnRTZXQ6e2xldCBhPUMuZGF0YSxjPXcoQSxhLnBvaW50cyxvLDApLEI9dyhBLGEucG9pbnREYXRhLG8sMSksRT17cG9pbnRTZXRUeXBlOmEucG9pbnRTZXRUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLG51bWJlck9mUG9pbnRQaXhlbHM6YS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YH07UChBLEUsbyk7YnJlYWt9Y2FzZSB1LlRyYW5zZm9ybUxpc3Q6e2xldCBhPUMuZGF0YSxjPVtdLEI9MDthLmZvckVhY2goRT0+e2xldCBmPSIiLFE9IiI7RS50cmFuc2Zvcm1UeXBlLnRyYW5zZm9ybVBhcmFtZXRlcml6YXRpb24hPT0iQ29tcG9zaXRlIiYmKGY9YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt3KEEsRS5maXhlZFBhcmFtZXRlcnMsbyxCKX1gLEIrPTEsUT1gZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3coQSxFLnBhcmFtZXRlcnMsbyxCKX1gLEIrPTEpO2xldCBkPXt0cmFuc2Zvcm1UeXBlOkUudHJhbnNmb3JtVHlwZSxudW1iZXJPZkZpeGVkUGFyYW1ldGVyczpFLm51bWJlck9mRml4ZWRQYXJhbWV0ZXJzLG51bWJlck9mUGFyYW1ldGVyczpFLm51bWJlck9mUGFyYW1ldGVycyxuYW1lOkUubmFtZSxpbnB1dFNwYWNlTmFtZTpFLmlucHV0U3BhY2VOYW1lLG91dHB1dFNwYWNlTmFtZTpFLm91dHB1dFNwYWNlTmFtZSxwYXJhbWV0ZXJzOlEsZml4ZWRQYXJhbWV0ZXJzOmZ9O2MucHVzaChkKX0pLFAoQSxjLG8pO2JyZWFrfWNhc2UgdS5Qb2x5RGF0YTp7bGV0IGE9Qy5kYXRhLGM9dyhBLGEucG9pbnRzLG8sMCksQj13KEEsYS52ZXJ0aWNlcyxvLDEpLEU9dyhBLGEubGluZXMsbywyKSxmPXcoQSxhLnBvbHlnb25zLG8sMyksUT13KEEsYS50cmlhbmdsZVN0cmlwcyxvLDQpLGQ9dyhBLGEucG9pbnREYXRhLG8sNSksaD13KEEsYS5wb2ludERhdGEsbyw2KSx5PXtwb2x5RGF0YVR5cGU6YS5wb2x5RGF0YVR5cGUsbmFtZTphLm5hbWUsbnVtYmVyT2ZQb2ludHM6YS5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsdmVydGljZXNCdWZmZXJTaXplOmEudmVydGljZXNCdWZmZXJTaXplLHZlcnRpY2VzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gLGxpbmVzQnVmZmVyU2l6ZTphLmxpbmVzQnVmZmVyU2l6ZSxsaW5lczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCxwb2x5Z29uc0J1ZmZlclNpemU6YS5wb2x5Z29uc0J1ZmZlclNpemUscG9seWdvbnM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsdHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplOmEudHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplLHRyaWFuZ2xlU3RyaXBzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gLG51bWJlck9mUG9pbnRQaXhlbHM6YS5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2R9YCxudW1iZXJPZkNlbGxQaXhlbHM6YS5udW1iZXJPZkNlbGxQaXhlbHMsY2VsbERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtofWB9O1AoQSx5LG8pO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGlucHV0IEludGVyZmFjZVR5cGUiKX19KSxBLnJlc2V0TW9kdWxlU3Rkb3V0KCksQS5yZXNldE1vZHVsZVN0ZGVycigpO2xldCByPUEuc3RhY2tTYXZlKCksaT0wO3RyeXtpPUEuY2FsbE1haW4oZS5zbGljZSgpKX1jYXRjaChDKXt0aHJvdyB0eXBlb2YgQz09Im51bWJlciImJihjb25zb2xlLmxvZygiRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgcGlwZWxpbmU6IiksY29uc29sZS5sb2coInN0ZG91dDoiLEEuZ2V0TW9kdWxlU3Rkb3V0KCkpLGNvbnNvbGUuZXJyb3IoInN0ZGVycjoiLEEuZ2V0TW9kdWxlU3RkZXJyKCkpLHR5cGVvZiBBLmdldEV4Y2VwdGlvbk1lc3NhZ2U8InUiP2NvbnNvbGUuZXJyb3IoImV4Y2VwdGlvbjoiLEEuZ2V0RXhjZXB0aW9uTWVzc2FnZShDKSk6Y29uc29sZS5lcnJvcigiQnVpbGQgbW9kdWxlIGluIERlYnVnIG1vZGUgZm9yIGV4Y2VwdGlvbiBtZXNzYWdlIGluZm9ybWF0aW9uLiIpKSxDfWZpbmFsbHl7QS5zdGFja1Jlc3RvcmUocil9bGV0IGc9QS5nZXRNb2R1bGVTdGRvdXQoKSxzPUEuZ2V0TW9kdWxlU3RkZXJyKCksbD1bXTtyZXR1cm4gdCE9bnVsbCYmdC5sZW5ndGg+MCYmaT09PTAmJnQuZm9yRWFjaChmdW5jdGlvbihDLG8pe2xldCBhPW51bGw7c3dpdGNoKEMudHlwZSl7Y2FzZSB1LlRleHRTdHJlYW06e2xldCBCPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG8sMF0pLEU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbywwXSksZj1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQixFKTthPXtkYXRhOlJ0LmRlY29kZShmKX07YnJlYWt9Y2FzZSB1Lkpzb25Db21wYXRpYmxlOntsZXQgQj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxvLDBdKSxFPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLG8sMF0pLGY9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLEIsRSk7YT1KU09OLnBhcnNlKFJ0LmRlY29kZShmKSk7YnJlYWt9Y2FzZSB1LkJpbmFyeVN0cmVhbTp7bGV0IEI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsbywwXSksRT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxvLDBdKTthPXtkYXRhOmt0KEEsQixFKX07YnJlYWt9Y2FzZSB1LlRleHRGaWxlOnthPXtwYXRoOkMuZGF0YS5wYXRoLGRhdGE6QS5mc19yZWFkRmlsZShDLmRhdGEucGF0aCx7ZW5jb2Rpbmc6InV0ZjgifSl9O2JyZWFrfWNhc2UgdS5CaW5hcnlGaWxlOnthPXtwYXRoOkMuZGF0YS5wYXRoLGRhdGE6bXIoQSxDLmRhdGEucGF0aCl9O2JyZWFrfWNhc2UgdS5JbWFnZTp7bGV0IEI9cEEoQSxvKTtCLmRhdGE9RihBLG8sMCxCLmltYWdlVHlwZS5jb21wb25lbnRUeXBlKSxCLmRpcmVjdGlvbj1GKEEsbywxLGouRmxvYXQ2NCksQi5tZXRhZGF0YT1uZXcgTWFwKEIubWV0YWRhdGEpLGE9QjticmVha31jYXNlIHUuTWVzaDp7bGV0IEI9cEEoQSxvKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9RihBLG8sMCxCLm1lc2hUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qi5wb2ludHM9SihCLm1lc2hUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZDZWxscz4wP0IuY2VsbHM9RihBLG8sMSxCLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlKTpCLmNlbGxzPUooQi5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPUYoQSxvLDIsQi5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5wb2ludERhdGE9SihCLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZkNlbGxQaXhlbHM+MD9CLmNlbGxEYXRhPUYoQSxvLDMsQi5tZXNoVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpCLmNlbGxEYXRhPUooQi5tZXNoVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksYT1CO2JyZWFrfWNhc2UgdS5Qb2ludFNldDp7bGV0IEI9cEEoQSxvKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9RihBLG8sMCxCLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUpOkIucG9pbnRzPUooQi5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qi5wb2ludERhdGE9RihBLG8sMSxCLnBvaW50U2V0VHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5wb2ludERhdGE9SihCLnBvaW50U2V0VHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGE9QjticmVha31jYXNlIHUuVHJhbnNmb3JtTGlzdDp7bGV0IEI9cEEoQSxvKSxFPTA7Qi5mb3JFYWNoKChmLFEpPT57Zi50cmFuc2Zvcm1UeXBlLnRyYW5zZm9ybVBhcmFtZXRlcml6YXRpb24hPT0iQ29tcG9zaXRlIiYmKGYubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM+MCYmKEJbUV0uZml4ZWRQYXJhbWV0ZXJzPUYoQSxvLEUsai5GbG9hdDY0KSksRSs9MSxmLm51bWJlck9mUGFyYW1ldGVycz4wJiYoQltRXS5wYXJhbWV0ZXJzPUYoQSxvLEUsZi50cmFuc2Zvcm1UeXBlLnBhcmFtZXRlcnNWYWx1ZVR5cGUpKSxFKz0xKX0pLGE9QjticmVha31jYXNlIHUuUG9seURhdGE6e2xldCBCPXBBKEEsbyk7Qi5udW1iZXJPZlBvaW50cz4wP0IucG9pbnRzPUYoQSxvLDAsai5GbG9hdDMyKTpCLnBvaW50cz1uZXcgRmxvYXQzMkFycmF5LEIudmVydGljZXNCdWZmZXJTaXplPjA/Qi52ZXJ0aWNlcz1GKEEsbywxLFUuVUludDMyKTpCLnZlcnRpY2VzPW5ldyBVaW50MzJBcnJheSxCLmxpbmVzQnVmZmVyU2l6ZT4wP0IubGluZXM9RihBLG8sMixVLlVJbnQzMik6Qi5saW5lcz1uZXcgVWludDMyQXJyYXksQi5wb2x5Z29uc0J1ZmZlclNpemU+MD9CLnBvbHlnb25zPUYoQSxvLDMsVS5VSW50MzIpOkIucG9seWdvbnM9bmV3IFVpbnQzMkFycmF5LEIudHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplPjA/Qi50cmlhbmdsZVN0cmlwcz1GKEEsbyw0LFUuVUludDMyKTpCLnRyaWFuZ2xlU3RyaXBzPW5ldyBVaW50MzJBcnJheSxCLm51bWJlck9mUG9pbnRQaXhlbHM+MD9CLnBvaW50RGF0YT1GKEEsbyw1LEIucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpCLnBvaW50RGF0YT1KKEIucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZkNlbGxQaXhlbHM+MD9CLmNlbGxEYXRhPUYoQSxvLDYsQi5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5jZWxsRGF0YT1KKEIucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhPUI7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgb3V0cHV0IEludGVyZmFjZVR5cGUiKX1sZXQgYz17dHlwZTpDLnR5cGUsZGF0YTphfTtsLnB1c2goYyl9KSx7cmV0dXJuVmFsdWU6aSxzdGRvdXQ6ZyxzdGRlcnI6cyxvdXRwdXRzOmx9fXZhciBOdD13cjt2YXIgU3I9dHlwZW9mIGdsb2JhbFRoaXMuU2hhcmVkQXJyYXlCdWZmZXI8InUiO2Z1bmN0aW9uIEZyKEEsZSl7aWYoQT09bnVsbClyZXR1cm5bXTtsZXQgdD1bXTtmb3IobGV0IEk9MDtJPEEubGVuZ3RoO0krKyl7bGV0IHI9UnIoQVtJXSxlKTtyIT09bnVsbCYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIFJyKEEsZSl7aWYoQT09bnVsbClyZXR1cm4gbnVsbDtsZXQgdD1udWxsO3JldHVybiBBLmJ1ZmZlciE9PXZvaWQgMD90PUEuYnVmZmVyOkEuYnl0ZUxlbmd0aCE9PXZvaWQgMCYmKHQ9QSksU3ImJnQgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcj9udWxsOmU/dDp0LnNsaWNlKDApfXZhciBHdD1GcjtmdW5jdGlvbiBVcihBKXtyZXR1cm5bQS5kYXRhLEEuZGlyZWN0aW9uXX12YXIgYnQ9VXI7ZnVuY3Rpb24ga3IoQSl7cmV0dXJuW0EucG9pbnRzLEEucG9pbnREYXRhLEEuY2VsbHMsQS5jZWxsRGF0YV19dmFyIEx0PWtyO2Z1bmN0aW9uIE5yKEEpe3JldHVybltBLnBvaW50cyxBLnZlcnRpY2VzLEEubGluZXMsQS5wb2x5Z29ucyxBLnRyaWFuZ2xlU3RyaXBzLEEucG9pbnREYXRhLEEuY2VsbERhdGFdfXZhciBKdD1Ocjt2YXIgR3I7ZnVuY3Rpb24geEEoKXtyZXR1cm4gR3J9dmFyIGJyO2Z1bmN0aW9uIE10KCl7cmV0dXJuIGJyfXZhciBMcjtmdW5jdGlvbiBQQSgpe3JldHVybiBMcn12YXIgeWU9bmV3IE1hcDtmdW5jdGlvbiBKcigpe2xldCBBPVBBKCk7cmV0dXJuIHR5cGVvZiBBPiJ1IiYmKEE9bnVsbCksQX1mdW5jdGlvbiBZdCgpe2xldCBBPXhBKCk7cmV0dXJuIHR5cGVvZiBBPiJ1IiYmKEE9bmV3IFVSTCgiL3BpcGVsaW5lcyIsZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKS5ocmVmKSxBfWZ1bmN0aW9uIFdBKCl7bGV0IEE9TXQoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT17fSksQX1hc3luYyBmdW5jdGlvbiBNcihBLGUsdCl7bGV0IEk9QSxyPUE7aWYodHlwZW9mIEEhPSJzdHJpbmciJiYoST1uZXcgVVJMKEEuaHJlZikscj1JLmhyZWYpLHllLmhhcyhyKSlyZXR1cm4geWUuZ2V0KHIpO3tsZXQgaT1hd2FpdCB3dChBLGU/LnRvU3RyaW5nKCk/P1l0KCksdD8/V0EoKSk7cmV0dXJuIHllLnNldChyLGkpLGl9fWFzeW5jIGZ1bmN0aW9uIFlyKEEsZSx0LEkscil7aWYoIWF3YWl0IFN0KCkpe2xldCBRPSJXZWJBc3NlbWJseSBTSU1EIHN1cHBvcnQgaXMgcmVxdWlyZWQgLS0gcGxlYXNlIHVwZGF0ZSB5b3VyIGJyb3dzZXIuIjt0aHJvdyBhbGVydChRKSxuZXcgRXJyb3IoUSl9bGV0IGk9cj8ud2ViV29ya2VyPz9udWxsO2lmKGk9PT0hMSl7bGV0IFE9YXdhaXQgTXIoQS50b1N0cmluZygpLHI/LnBpcGVsaW5lQmFzZVVybCxyPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9XQSgpKTtyZXR1cm4gTnQoUSxlLHQsSSl9bGV0IGc9aSxzPXI/LnBpcGVsaW5lV29ya2VyVXJsPz9KcigpLGw9dHlwZW9mIHMhPSJzdHJpbmciJiZ0eXBlb2Ygcz8uaHJlZjwidSI/cy5ocmVmOnMse3dvcmtlclByb3h5OkMsd29ya2VyOm99PWF3YWl0IGh0KGcsbCxyPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9XQSgpKTtnPW87bGV0IGE9W107SSE9bnVsbCYmSS5sZW5ndGg+MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKFEpe2lmKFEudHlwZT09PXUuQmluYXJ5U3RyZWFtKXtsZXQgZD1RLmRhdGEuZGF0YTthLnB1c2goZCl9ZWxzZSBpZihRLnR5cGU9PT11LkJpbmFyeUZpbGUpe2xldCBkPVEuZGF0YS5kYXRhO2EucHVzaChkKX1lbHNlIGlmKFEudHlwZT09PXUuSW1hZ2Upe2xldCBkPVEuZGF0YTtkLmRhdGEhPT1udWxsJiZhLnB1c2goLi4uYnQoZCkpfWVsc2UgaWYoUS50eXBlPT09dS5NZXNoKXtsZXQgZD1RLmRhdGE7YS5wdXNoKC4uLkx0KGQpKX1lbHNlIGlmKFEudHlwZT09PXUuUG9seURhdGEpe2xldCBkPVEuZGF0YTthLnB1c2goLi4uSnQoZCkpfX0pO2xldCBjPXI/LnBpcGVsaW5lQmFzZVVybD8/WXQoKSxCPXR5cGVvZiBjIT0ic3RyaW5nIiYmdHlwZW9mIGM/LmhyZWY8InUiP2MuaHJlZjpjLEU9SSE9bnVsbD9YQShJLEd0KGEscj8ubm9Db3B5KSk6bnVsbCxmPWF3YWl0IEMucnVuUGlwZWxpbmUoQS50b1N0cmluZygpLEIsZSx0LEUscj8ucGlwZWxpbmVRdWVyeVBhcmFtcz8/V0EoKSk7cmV0dXJue3JldHVyblZhbHVlOmYucmV0dXJuVmFsdWUsc3Rkb3V0OmYuc3Rkb3V0LHN0ZGVycjpmLnN0ZGVycixvdXRwdXRzOmYub3V0cHV0cyx3ZWJXb3JrZXI6Z319dmFyIEw9WXI7dmFyIEhyPW51bGw7ZnVuY3Rpb24gSHQoKXtyZXR1cm4gSHJ9dmFyIHF0PXtuYW1lOiJAaXRrLXdhc20vZWxhc3RpeCIsdmVyc2lvbjoiMS4wLjIiLGRlc2NyaXB0aW9uOiJBIHRvb2xib3ggZm9yIHJpZ2lkIGFuZCBub25yaWdpZCByZWdpc3RyYXRpb24gb2YgaW1hZ2VzLiIsdHlwZToibW9kdWxlIixtb2R1bGU6Ii4vZGlzdC9pbmRleC5qcyIsdHlwZXM6Ii4vZGlzdC9pbmRleC1hbGwuZC50cyIsZXhwb3J0czp7Ii4iOnt0eXBlczoiLi9kaXN0L2luZGV4LWFsbC5kLnRzIixicm93c2VyOiIuL2Rpc3QvaW5kZXguanMiLG5vZGU6Ii4vZGlzdC9pbmRleC1ub2RlLmpzIixkZWZhdWx0OiIuL2Rpc3QvaW5kZXgtYWxsLmpzIn19LHNjcmlwdHM6e3N0YXJ0OiJwbnBtIGNvcHlEZW1vQXBwQXNzZXRzICYmIHZpdGUiLHRlc3Q6InBucG0gcnVuIHRlc3Q6bm9kZSAmJiBwbnBtIHJ1biB0ZXN0OmJyb3dzZXIiLCJ0ZXN0Om5vZGUiOiJhdmEgLS10aW1lb3V0IDEwbSB0ZXN0L25vZGUvKi5qcyIsInRlc3Q6YnJvd3NlciI6InBucG0gZXhlYyBwbGF5d3JpZ2h0IHRlc3QiLGNvcHlEZW1vQXBwQXNzZXRzOiJzaHggbWtkaXIgLXAgdGVzdC9icm93c2VyL2RlbW8tYXBwL3B1YmxpYy9zaG9lbGFjZSAmJiBzaHggY3AgLXIgbm9kZV9tb2R1bGVzL0BpdGstd2FzbS9kZW1vLWFwcC9kaXN0L2Fzc2V0cyB0ZXN0L2Jyb3dzZXIvZGVtby1hcHAvcHVibGljLyIsYnVpbGQ6InBucG0gYnVpbGQ6dHNjICYmIHBucG0gYnVpbGQ6YnJvd3Nlcjp3b3JrZXJFbWJlZGRlZCAmJiBwbnBtIGJ1aWxkOmJyb3dzZXI6d29ya2VyRW1iZWRkZWRNaW4gJiYgcG5wbSBidWlsZDpkZW1vIiwiYnVpbGQ6YnJvd3Nlcjp3b3JrZXJFbWJlZGRlZCI6ImVzYnVpbGQgLS1sb2FkZXI6Lndvcmtlci5qcz1kYXRhdXJsIC0tYnVuZGxlIC0tZm9ybWF0PWVzbSAtLW91dGZpbGU9Li9kaXN0L2J1bmRsZS9pbmRleC13b3JrZXItZW1iZWRkZWQuanMgLi9zcmMvaW5kZXgtd29ya2VyLWVtYmVkZGVkLnRzIiwiYnVpbGQ6YnJvd3Nlcjp3b3JrZXJFbWJlZGRlZE1pbiI6ImVzYnVpbGQgLS1taW5pZnkgLS1sb2FkZXI6Lndvcmtlci5qcz1kYXRhdXJsIC0tYnVuZGxlIC0tZm9ybWF0PWVzbSAtLW91dGZpbGU9Li9kaXN0L2J1bmRsZS9pbmRleC13b3JrZXItZW1iZWRkZWQubWluLmpzIC4vc3JjL2luZGV4LXdvcmtlci1lbWJlZGRlZC5taW4udHMiLCJidWlsZDp0c2MiOiJ0c2MgLS1wcmV0dHkiLCJidWlsZDpkZW1vIjoicG5wbSBjb3B5RGVtb0FwcEFzc2V0cyAmJiB2aXRlIGJ1aWxkIn0sa2V5d29yZHM6WyJpdGsiLCJ3YXNtIiwid2ViYXNzZW1ibHkiLCJ3YXNpIl0sYXV0aG9yOiIiLGxpY2Vuc2U6IkFwYWNoZS0yLjAiLGRlcGVuZGVuY2llczp7Iml0ay13YXNtIjoiXjEuMC4wLWIuMTk2In0sZGV2RGVwZW5kZW5jaWVzOnsiQGl0ay13YXNtL2RlbW8tYXBwIjoiXjAuMi4wIiwiQGl0ay13YXNtL2ltYWdlLWlvIjoiXjEuMy4wIiwiQHBsYXl3cmlnaHQvdGVzdCI6Il4xLjUzLjEiLCJAdHlwZXMvbm9kZSI6Il4yMC4yLjUiLGF2YToiXjUuMy4xIixkZWJ1ZzoiXjQuMy40Iixlc2J1aWxkOiJeMC4yNS4wIixzaHg6Il4wLjMuNCIsdHlwZXNjcmlwdDoiXjUuNS40Iix2aXRlOiJeNC41LjEzIiwidml0ZS1wbHVnaW4tc3RhdGljLWNvcHkiOiJeMC4xNy4wIn0scmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6Imh0dHBzOi8vZ2l0aHViLmNvbS9JbnNpZ2h0U29mdHdhcmVDb25zb3J0aXVtL0lUS0VsYXN0aXgifX07dmFyIG1lLE9yPWBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0BpdGstd2FzbS9lbGFzdGl4QCR7cXQudmVyc2lvbn0vZGlzdC9waXBlbGluZXNgO2Z1bmN0aW9uIERhKEEpe21lPUF9ZnVuY3Rpb24gSCgpe2lmKHR5cGVvZiBtZTwidSIpcmV0dXJuIG1lO2xldCBBPXhBKCk7cmV0dXJuIHR5cGVvZiBBPCJ1Ij9BOk9yfXZhciB3ZSxUcj1udWxsO2Z1bmN0aW9uIE90KEEpe3dlPUF9ZnVuY3Rpb24gTigpe2lmKHR5cGVvZiB3ZTwidSIpcmV0dXJuIHdlO2xldCBBPVBBKCk7cmV0dXJuIHR5cGVvZiBBPCJ1Ij9BOlRyfXZhciBJQT1udWxsO2FzeW5jIGZ1bmN0aW9uIFR0KCl7bGV0IEE9TigpLGU9dHlwZW9mIEEhPSJzdHJpbmciJiZ0eXBlb2YgQT8uaHJlZjwidSI/QS5ocmVmOkE7SUE9YXdhaXQgZkEoZSl9ZnVuY3Rpb24gVWEoQSl7SUE9QX1hc3luYyBmdW5jdGlvbiBxKCl7aWYoSUEhPT1udWxsKXJldHVybiBJQS50ZXJtaW5hdGVkJiZhd2FpdCBUdCgpLElBO2xldCBBPUh0KCk7cmV0dXJuIEEhPT1udWxsP0E6KGF3YWl0IFR0KCksSUEpfWFzeW5jIGZ1bmN0aW9uIEtyKEEsZT17fSl7bGV0IHQ9W3t0eXBlOnUuSnNvbkNvbXBhdGlibGV9XSxJPVtdLHI9W107ci5wdXNoKEEudG9TdHJpbmcoKSksci5wdXNoKCIwIiksci5wdXNoKCItLW1lbW9yeS1pbyIpLGUubnVtYmVyT2ZSZXNvbHV0aW9ucyYmci5wdXNoKCItLW51bWJlci1vZi1yZXNvbHV0aW9ucyIsZS5udW1iZXJPZlJlc29sdXRpb25zLnRvU3RyaW5nKCkpLGUuZmluYWxHcmlkU3BhY2luZyYmci5wdXNoKCItLWZpbmFsLWdyaWQtc3BhY2luZyIsZS5maW5hbEdyaWRTcGFjaW5nLnRvU3RyaW5nKCkpO2xldCBnPSJkZWZhdWx0LXBhcmFtZXRlci1tYXAiLHM9ZT8ud2ViV29ya2VyO3M9PT12b2lkIDAmJihzPWF3YWl0IHEoKSk7bGV0e3dlYldvcmtlcjpsLHJldHVyblZhbHVlOkMsc3RkZXJyOm8sb3V0cHV0czphfT1hd2FpdCBMKGcscix0LEkse3BpcGVsaW5lQmFzZVVybDpIKCkscGlwZWxpbmVXb3JrZXJVcmw6TigpLHdlYldvcmtlcjpzLG5vQ29weTplPy5ub0NvcHl9KTtpZihDIT09MCYmbyE9PSIiKXRocm93IG5ldyBFcnJvcihvKTtyZXR1cm57d2ViV29ya2VyOmwscGFyYW1ldGVyTWFwOmFbMF0/LmRhdGF9fXZhciB4cj1Lcjthc3luYyBmdW5jdGlvbiBQcihBLGU9e30pe2xldCB0PVt7dHlwZTp1LkltYWdlfSx7dHlwZTp1LlRyYW5zZm9ybUxpc3R9LHt0eXBlOnUuSnNvbkNvbXBhdGlibGV9XSxJPVt7dHlwZTp1Lkpzb25Db21wYXRpYmxlLGRhdGE6QX1dLHI9W107aWYoci5wdXNoKCIwIiksci5wdXNoKCIwIiksci5wdXNoKCIxIiksci5wdXNoKCIyIiksci5wdXNoKCItLW1lbW9yeS1pbyIpLGUuZml4ZWQpe2xldCBRPUkubGVuZ3RoLnRvU3RyaW5nKCk7SS5wdXNoKHt0eXBlOnUuSW1hZ2UsZGF0YTplLmZpeGVkfSksci5wdXNoKCItLWZpeGVkIixRKX1pZihlLm1vdmluZyl7bGV0IFE9SS5sZW5ndGgudG9TdHJpbmcoKTtJLnB1c2goe3R5cGU6dS5JbWFnZSxkYXRhOmUubW92aW5nfSksci5wdXNoKCItLW1vdmluZyIsUSl9aWYoZS5pbml0aWFsVHJhbnNmb3JtKXtsZXQgUT1JLmxlbmd0aC50b1N0cmluZygpO0kucHVzaCh7dHlwZTp1LlRyYW5zZm9ybUxpc3QsZGF0YTplLmluaXRpYWxUcmFuc2Zvcm19KSxyLnB1c2goIi0taW5pdGlhbC10cmFuc2Zvcm0iLFEpfWlmKGUuaW5pdGlhbFRyYW5zZm9ybVBhcmFtZXRlck9iamVjdCl7bGV0IFE9SS5sZW5ndGgudG9TdHJpbmcoKTtJLnB1c2goe3R5cGU6dS5Kc29uQ29tcGF0aWJsZSxkYXRhOmUuaW5pdGlhbFRyYW5zZm9ybVBhcmFtZXRlck9iamVjdH0pLHIucHVzaCgiLS1pbml0aWFsLXRyYW5zZm9ybS1wYXJhbWV0ZXItb2JqZWN0IixRKX1sZXQgQz0iZWxhc3RpeCIsbz1lPy53ZWJXb3JrZXI7bz09PXZvaWQgMCYmKG89YXdhaXQgcSgpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6QixvdXRwdXRzOkV9PWF3YWl0IEwoQyxyLHQsSSx7cGlwZWxpbmVCYXNlVXJsOkgoKSxwaXBlbGluZVdvcmtlclVybDpOKCksd2ViV29ya2VyOm8sbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGMhPT0wJiZCIT09IiIpdGhyb3cgbmV3IEVycm9yKEIpO3JldHVybnt3ZWJXb3JrZXI6YSxyZXN1bHQ6RVswXT8uZGF0YSx0cmFuc2Zvcm06RVsxXT8uZGF0YSx0cmFuc2Zvcm1QYXJhbWV0ZXJPYmplY3Q6RVsyXT8uZGF0YX19dmFyIFdyPVByO2FzeW5jIGZ1bmN0aW9uIGpyKEE9e3BhcmFtZXRlckZpbGVzOltdfSl7bGV0IGU9W3t0eXBlOnUuSnNvbkNvbXBhdGlibGV9XSx0PVtdLEk9W107aWYoSS5wdXNoKCIwIiksSS5wdXNoKCItLW1lbW9yeS1pbyIpLEEucGFyYW1ldGVyRmlsZXMpe2lmKEEucGFyYW1ldGVyRmlsZXMubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcicGFyYW1ldGVyLWZpbGVzIiBvcHRpb24gbXVzdCBoYXZlIGEgbGVuZ3RoID4gMScpO0kucHVzaCgiLS1wYXJhbWV0ZXItZmlsZXMiKSxhd2FpdCBQcm9taXNlLmFsbChBLnBhcmFtZXRlckZpbGVzLm1hcChhc3luYyBjPT57bGV0IEI9YztpZihjIGluc3RhbmNlb2YgRmlsZSl7bGV0IGY9YXdhaXQgYy5hcnJheUJ1ZmZlcigpO0I9e3BhdGg6Yy5uYW1lLGRhdGE6bmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGYpfX10LnB1c2goe3R5cGU6dS5UZXh0RmlsZSxkYXRhOkJ9KTtsZXQgRT1jIGluc3RhbmNlb2YgRmlsZT9jLm5hbWU6Qi5wYXRoO0kucHVzaChFKX0pKX1sZXQgaT0icmVhZC1wYXJhbWV0ZXItZmlsZXMiLGc9QT8ud2ViV29ya2VyO2c9PT12b2lkIDAmJihnPWF3YWl0IHEoKSk7bGV0e3dlYldvcmtlcjpzLHJldHVyblZhbHVlOmwsc3RkZXJyOkMsb3V0cHV0czpvfT1hd2FpdCBMKGksSSxlLHQse3BpcGVsaW5lQmFzZVVybDpIKCkscGlwZWxpbmVXb3JrZXJVcmw6TigpLHdlYldvcmtlcjpnLG5vQ29weTpBPy5ub0NvcHl9KTtpZihsIT09MCYmQyE9PSIiKXRocm93IG5ldyBFcnJvcihDKTtyZXR1cm57d2ViV29ya2VyOnMscGFyYW1ldGVyT2JqZWN0Om9bMF0/LmRhdGF9fXZhciB2cj1qcjthc3luYyBmdW5jdGlvbiBacihBLGUsdD17fSl7bGV0IEk9W3t0eXBlOnUuSW1hZ2V9XSxyPVt7dHlwZTp1LkltYWdlLGRhdGE6QX0se3R5cGU6dS5Kc29uQ29tcGF0aWJsZSxkYXRhOmV9XSxpPVtdO2lmKGkucHVzaCgiMCIpLGkucHVzaCgiMSIpLGkucHVzaCgiMCIpLGkucHVzaCgiLS1tZW1vcnktaW8iKSx0Lm91dHB1dE9yaWdpbil7aWYodC5vdXRwdXRPcmlnaW4ubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcib3V0cHV0LW9yaWdpbiIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDEnKTtpLnB1c2goIi0tb3V0cHV0LW9yaWdpbiIpLGF3YWl0IFByb21pc2UuYWxsKHQub3V0cHV0T3JpZ2luLm1hcChhc3luYyBRPT57aS5wdXNoKFEudG9TdHJpbmcoKSl9KSl9aWYodC5vdXRwdXRTcGFjaW5nKXtpZih0Lm91dHB1dFNwYWNpbmcubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcib3V0cHV0LXNwYWNpbmciIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7aS5wdXNoKCItLW91dHB1dC1zcGFjaW5nIiksYXdhaXQgUHJvbWlzZS5hbGwodC5vdXRwdXRTcGFjaW5nLm1hcChhc3luYyBRPT57aS5wdXNoKFEudG9TdHJpbmcoKSl9KSl9aWYodC5vdXRwdXRTaXplKXtpZih0Lm91dHB1dFNpemUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcib3V0cHV0LXNpemUiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7aS5wdXNoKCItLW91dHB1dC1zaXplIiksYXdhaXQgUHJvbWlzZS5hbGwodC5vdXRwdXRTaXplLm1hcChhc3luYyBRPT57aS5wdXNoKFEudG9TdHJpbmcoKSl9KSl9aWYodC5vdXRwdXREaXJlY3Rpb24pe2lmKHQub3V0cHV0RGlyZWN0aW9uLmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcignIm91dHB1dC1kaXJlY3Rpb24iIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7aS5wdXNoKCItLW91dHB1dC1kaXJlY3Rpb24iKSxhd2FpdCBQcm9taXNlLmFsbCh0Lm91dHB1dERpcmVjdGlvbi5tYXAoYXN5bmMgUT0+e2kucHVzaChRLnRvU3RyaW5nKCkpfSkpfWxldCBDPSJ0cmFuc2Zvcm1peCIsbz10Py53ZWJXb3JrZXI7bz09PXZvaWQgMCYmKG89YXdhaXQgcSgpKTtsZXR7d2ViV29ya2VyOmEscmV0dXJuVmFsdWU6YyxzdGRlcnI6QixvdXRwdXRzOkV9PWF3YWl0IEwoQyxpLEkscix7cGlwZWxpbmVCYXNlVXJsOkgoKSxwaXBlbGluZVdvcmtlclVybDpOKCksd2ViV29ya2VyOm8sbm9Db3B5OnQ/Lm5vQ29weX0pO2lmKGMhPT0wJiZCIT09IiIpdGhyb3cgbmV3IEVycm9yKEIpO3JldHVybnt3ZWJXb3JrZXI6YSxyZXN1bHQ6RVswXT8uZGF0YX19dmFyIFZyPVpyO2FzeW5jIGZ1bmN0aW9uIFhyKEEsZSx0PXt9KXtsZXQgcj1bLi4uZS5tYXAoaD0+KHt0eXBlOnUuVGV4dEZpbGUsZGF0YTp7cGF0aDpoLGRhdGE6IiJ9fSkpXSxpPTAsZz1pO2krPWUubGVuZ3RoO2xldCBzPWksbD1be3R5cGU6dS5Kc29uQ29tcGF0aWJsZSxkYXRhOkF9XSxDPVtdO0MucHVzaCgiMCIpLGUuZm9yRWFjaChoPT5DLnB1c2goaCkpLEMucHVzaCgiLS1tZW1vcnktaW8iKTtsZXQgYT0id3JpdGUtcGFyYW1ldGVyLWZpbGVzIixjPXQ/LndlYldvcmtlcjtjPT09dm9pZCAwJiYoYz1hd2FpdCBxKCkpO2xldHt3ZWJXb3JrZXI6QixyZXR1cm5WYWx1ZTpFLHN0ZGVycjpmLG91dHB1dHM6UX09YXdhaXQgTChhLEMscixsLHtwaXBlbGluZUJhc2VVcmw6SCgpLHBpcGVsaW5lV29ya2VyVXJsOk4oKSx3ZWJXb3JrZXI6Yyxub0NvcHk6dD8ubm9Db3B5fSk7aWYoRSE9PTAmJmYhPT0iIil0aHJvdyBuZXcgRXJyb3IoZik7cmV0dXJue3dlYldvcmtlcjpCLHBhcmFtZXRlckZpbGVzOlEuc2xpY2UoZyxzKS5tYXAoaD0+aD8uZGF0YSl9fXZhciB6cj1Ycjt2YXIgS3Q9J2RhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsdmFyIERlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZGU9KEEsdCk9Pntmb3IodmFyIGUgaW4gdClEZShBLGUse2dldDp0W2VdLGVudW1lcmFibGU6ITB9KX07dmFyIEV0PVN5bWJvbCgiQ29tbGluay5wcm94eSIpLGhlPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLHllPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxZQT1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksUUE9U3ltYm9sKCJDb21saW5rLnRocm93biIpLGN0PUE9PnR5cGVvZiBBPT0ib2JqZWN0IiYmQSE9PW51bGx8fHR5cGVvZiBBPT0iZnVuY3Rpb24iLG1lPXtjYW5IYW5kbGU6QT0+Y3QoQSkmJkFbRXRdLHNlcmlhbGl6ZShBKXtsZXR7cG9ydDE6dCxwb3J0MjplfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIGxBKEEsdCksW2UsW2VdXX0sZGVzZXJpYWxpemUoQSl7cmV0dXJuIEEuc3RhcnQoKSxGZShBKX19LHdlPXtjYW5IYW5kbGU6QT0+Y3QoQSkmJlFBIGluIEEsc2VyaWFsaXplKHt2YWx1ZTpBfSl7bGV0IHQ7cmV0dXJuIEEgaW5zdGFuY2VvZiBFcnJvcj90PXtpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOkEubWVzc2FnZSxuYW1lOkEubmFtZSxzdGFjazpBLnN0YWNrfX06dD17aXNFcnJvcjohMSx2YWx1ZTpBfSxbdCxbXV19LGRlc2VyaWFsaXplKEEpe3Rocm93IEEuaXNFcnJvcj9PYmplY3QuYXNzaWduKG5ldyBFcnJvcihBLnZhbHVlLm1lc3NhZ2UpLEEudmFsdWUpOkEudmFsdWV9fSxmdD1uZXcgTWFwKFtbInByb3h5IixtZV0sWyJ0aHJvdyIsd2VdXSk7ZnVuY3Rpb24gcGUoQSx0KXtmb3IobGV0IGUgb2YgQSlpZih0PT09ZXx8ZT09PSIqInx8ZSBpbnN0YW5jZW9mIFJlZ0V4cCYmZS50ZXN0KHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGxBKEEsdD1nbG9iYWxUaGlzLGU9WyIqIl0pe3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gSShyKXtpZighcnx8IXIuZGF0YSlyZXR1cm47aWYoIXBlKGUsci5vcmlnaW4pKXtjb25zb2xlLndhcm4oYEludmFsaWQgb3JpZ2luIFwnJHtyLm9yaWdpbn1cJyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6byx0eXBlOmcscGF0aDpDfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxyLmRhdGEpLEU9KHIuZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoTyksYTt0cnl7bGV0IHM9Qy5zbGljZSgwLC0xKS5yZWR1Y2UoKGYsQik9PmZbQl0sQSksbj1DLnJlZHVjZSgoZixCKT0+ZltCXSxBKTtzd2l0Y2goZyl7Y2FzZSJHRVQiOmE9bjticmVhaztjYXNlIlNFVCI6c1tDLnNsaWNlKC0xKVswXV09TyhyLmRhdGEudmFsdWUpLGE9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6YT1uLmFwcGx5KHMsRSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgZj1uZXcgbiguLi5FKTthPUdlKGYpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6Zixwb3J0MjpCfT1uZXcgTWVzc2FnZUNoYW5uZWw7bEEoQSxCKSxhPU1BKGYsW2ZdKX1icmVhaztjYXNlIlJFTEVBU0UiOmE9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChzKXthPXt2YWx1ZTpzLFtRQV06MH19UHJvbWlzZS5yZXNvbHZlKGEpLmNhdGNoKHM9Pih7dmFsdWU6cyxbUUFdOjB9KSkudGhlbihzPT57bGV0W24sZl09ZkEocyk7dC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbikse2lkOm99KSxmKSxnPT09IlJFTEVBU0UiJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixJKSxsdCh0KSxZQSBpbiBBJiZ0eXBlb2YgQVtZQV09PSJmdW5jdGlvbiImJkFbWUFdKCkpfSkuY2F0Y2gocz0+e2xldFtuLGZdPWZBKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbUUFdOjB9KTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7aWQ6b30pLGYpfSl9KSx0LnN0YXJ0JiZ0LnN0YXJ0KCl9ZnVuY3Rpb24gU2UoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gbHQoQSl7U2UoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBGZShBLHQpe3JldHVybiBxQShBLFtdLHQpfWZ1bmN0aW9uIGFBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiB1dChBKXtyZXR1cm4gVyhBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntsdChBKX0pfXZhciBFQT1uZXcgV2Vha01hcCxjQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgdD0oRUEuZ2V0KEEpfHwwKS0xO0VBLnNldChBLHQpLHQ9PT0wJiZ1dChBKX0pO2Z1bmN0aW9uIFJlKEEsdCl7bGV0IGU9KEVBLmdldCh0KXx8MCkrMTtFQS5zZXQodCxlKSxjQSYmY0EucmVnaXN0ZXIoQSx0LEEpfWZ1bmN0aW9uIE5lKEEpe2NBJiZjQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIHFBKEEsdD1bXSxlPWZ1bmN0aW9uKCl7fSl7bGV0IEk9ITEscj1uZXcgUHJveHkoZSx7Z2V0KG8sZyl7aWYoYUEoSSksZz09PXllKXJldHVybigpPT57TmUociksdXQoQSksST0hMH07aWYoZz09PSJ0aGVuIil7aWYodC5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5yfTtsZXQgQz1XKEEse3R5cGU6IkdFVCIscGF0aDp0Lm1hcChFPT5FLnRvU3RyaW5nKCkpfSkudGhlbihPKTtyZXR1cm4gQy50aGVuLmJpbmQoQyl9cmV0dXJuIHFBKEEsWy4uLnQsZ10pfSxzZXQobyxnLEMpe2FBKEkpO2xldFtFLGFdPWZBKEMpO3JldHVybiBXKEEse3R5cGU6IlNFVCIscGF0aDpbLi4udCxnXS5tYXAocz0+cy50b1N0cmluZygpKSx2YWx1ZTpFfSxhKS50aGVuKE8pfSxhcHBseShvLGcsQyl7YUEoSSk7bGV0IEU9dFt0Lmxlbmd0aC0xXTtpZihFPT09aGUpcmV0dXJuIFcoQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihPKTtpZihFPT09ImJpbmQiKXJldHVybiBxQShBLHQuc2xpY2UoMCwtMSkpO2xldFthLHNdPVF0KEMpO3JldHVybiBXKEEse3R5cGU6IkFQUExZIixwYXRoOnQubWFwKG49Pm4udG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OmF9LHMpLnRoZW4oTyl9LGNvbnN0cnVjdChvLGcpe2FBKEkpO2xldFtDLEVdPVF0KGcpO3JldHVybiBXKEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDp0Lm1hcChhPT5hLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpDfSxFKS50aGVuKE8pfX0pO3JldHVybiBSZShyLEEpLHJ9ZnVuY3Rpb24gVWUoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gUXQoQSl7bGV0IHQ9QS5tYXAoZkEpO3JldHVyblt0Lm1hcChlPT5lWzBdKSxVZSh0Lm1hcChlPT5lWzFdKSldfXZhciBEdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBNQShBLHQpe3JldHVybiBEdC5zZXQoQSx0KSxBfWZ1bmN0aW9uIEdlKEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1tFdF06ITB9KX1mdW5jdGlvbiBmQShBKXtmb3IobGV0W3QsZV1vZiBmdClpZihlLmNhbkhhbmRsZShBKSl7bGV0W0kscl09ZS5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOnQsdmFsdWU6SX0scl19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LER0LmdldChBKXx8W11dfWZ1bmN0aW9uIE8oQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gZnQuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiBXKEEsdCxlKXtyZXR1cm4gbmV3IFByb21pc2UoST0+e2xldCByPWtlKCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvKGcpeyFnLmRhdGF8fCFnLmRhdGEuaWR8fGcuZGF0YS5pZCE9PXJ8fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLEkoZy5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpyfSx0KSxlKX0pfWZ1bmN0aW9uIGtlKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiB2KEEsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkodCxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6TGV9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOlRBfT1PYmplY3QsREE9KEE9PnQ9PntsZXQgZT1MZS5jYWxsKHQpO3JldHVybiBBW2VdfHwoQVtlXT1lLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksRz1BPT4oQT1BLnRvTG93ZXJDYXNlKCksdD0+REEodCk9PT1BKSxkQT1BPT50PT50eXBlb2YgdD09PUEse2lzQXJyYXk6an09QXJyYXksJD1kQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gYmUoQSl7cmV0dXJuIEEhPT1udWxsJiYhJChBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiEkKEEuY29uc3RydWN0b3IpJiZVKEEuY29uc3RydWN0b3IuaXNCdWZmZXIpJiZBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKEEpfXZhciB5dD1HKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIEplKEEpe2xldCB0O3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXI8InUiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/dD1BcnJheUJ1ZmZlci5pc1ZpZXcoQSk6dD1BJiZBLmJ1ZmZlciYmeXQoQS5idWZmZXIpLHR9dmFyIEhlPWRBKCJzdHJpbmciKSxVPWRBKCJmdW5jdGlvbiIpLG10PWRBKCJudW1iZXIiKSxoQT1BPT5BIT09bnVsbCYmdHlwZW9mIEE9PSJvYmplY3QiLFllPUE9PkE9PT0hMHx8QT09PSExLHVBPUE9PntpZihEQShBKSE9PSJvYmplY3QiKXJldHVybiExO2xldCB0PVRBKEEpO3JldHVybih0PT09bnVsbHx8dD09PU9iamVjdC5wcm90b3R5cGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PW51bGwpJiYhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBBKSYmIShTeW1ib2wuaXRlcmF0b3IgaW4gQSl9LHFlPUcoIkRhdGUiKSxNZT1HKCJGaWxlIiksS2U9RygiQmxvYiIpLFRlPUcoIkZpbGVMaXN0IiksT2U9QT0+aEEoQSkmJlUoQS5waXBlKSx4ZT1BPT57bGV0IHQ7cmV0dXJuIEEmJih0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiImJkEgaW5zdGFuY2VvZiBGb3JtRGF0YXx8VShBLmFwcGVuZCkmJigodD1EQShBKSk9PT0iZm9ybWRhdGEifHx0PT09Im9iamVjdCImJlUoQS50b1N0cmluZykmJkEudG9TdHJpbmcoKT09PSJbb2JqZWN0IEZvcm1EYXRhXSIpKX0sUGU9RygiVVJMU2VhcmNoUGFyYW1zIiksW1dlLGplLFplLFZlXT1bIlJlYWRhYmxlU3RyZWFtIiwiUmVxdWVzdCIsIlJlc3BvbnNlIiwiSGVhZGVycyJdLm1hcChHKSxYZT1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywiIik7ZnVuY3Rpb24gQUEoQSx0LHthbGxPd25LZXlzOmU9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgSSxyO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxqKEEpKWZvcihJPTAscj1BLmxlbmd0aDtJPHI7SSsrKXQuY2FsbChudWxsLEFbSV0sSSxBKTtlbHNle2xldCBvPWU/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksZz1vLmxlbmd0aCxDO2ZvcihJPTA7STxnO0krKylDPW9bSV0sdC5jYWxsKG51bGwsQVtDXSxDLEEpfX1mdW5jdGlvbiB3dChBLHQpe3Q9dC50b0xvd2VyQ2FzZSgpO2xldCBlPU9iamVjdC5rZXlzKEEpLEk9ZS5sZW5ndGgscjtmb3IoO0ktLSA+MDspaWYocj1lW0ldLHQ9PT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHI7cmV0dXJuIG51bGx9dmFyIHg9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxwdD1BPT4hJChBKSYmQSE9PXg7ZnVuY3Rpb24gS0EoKXtsZXR7Y2FzZWxlc3M6QX09cHQodGhpcykmJnRoaXN8fHt9LHQ9e30sZT0oSSxyKT0+e2xldCBvPUEmJnd0KHQscil8fHI7dUEodFtvXSkmJnVBKEkpP3Rbb109S0EodFtvXSxJKTp1QShJKT90W29dPUtBKHt9LEkpOmooSSk/dFtvXT1JLnNsaWNlKCk6dFtvXT1JfTtmb3IobGV0IEk9MCxyPWFyZ3VtZW50cy5sZW5ndGg7STxyO0krKylhcmd1bWVudHNbSV0mJkFBKGFyZ3VtZW50c1tJXSxlKTtyZXR1cm4gdH12YXIgX2U9KEEsdCxlLHthbGxPd25LZXlzOkl9PXt9KT0+KEFBKHQsKHIsbyk9PntlJiZVKHIpP0Fbb109dihyLGUpOkFbb109cn0se2FsbE93bktleXM6SX0pLEEpLHplPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksdmU9KEEsdCxlLEkpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSxJKSxBLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOnQucHJvdG90eXBlfSksZSYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSxlKX0sJGU9KEEsdCxlLEkpPT57bGV0IHIsbyxnLEM9e307aWYodD10fHx7fSxBPT1udWxsKXJldHVybiB0O2Rve2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLG89ci5sZW5ndGg7by0tID4wOylnPXJbb10sKCFJfHxJKGcsQSx0KSkmJiFDW2ddJiYodFtnXT1BW2ddLENbZ109ITApO0E9ZSE9PSExJiZUQShBKX13aGlsZShBJiYoIWV8fGUoQSx0KSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gdH0sQUk9KEEsdCxlKT0+e0E9U3RyaW5nKEEpLChlPT09dm9pZCAwfHxlPkEubGVuZ3RoKSYmKGU9QS5sZW5ndGgpLGUtPXQubGVuZ3RoO2xldCBJPUEuaW5kZXhPZih0LGUpO3JldHVybiBJIT09LTEmJkk9PT1lfSx0ST1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoaihBKSlyZXR1cm4gQTtsZXQgdD1BLmxlbmd0aDtpZighbXQodCkpcmV0dXJuIG51bGw7bGV0IGU9bmV3IEFycmF5KHQpO2Zvcig7dC0tID4wOyllW3RdPUFbdF07cmV0dXJuIGV9LGVJPShBPT50PT5BJiZ0IGluc3RhbmNlb2YgQSkodHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZUQShVaW50OEFycmF5KSksSUk9KEEsdCk9PntsZXQgST0oQSYmQVtTeW1ib2wuaXRlcmF0b3JdKS5jYWxsKEEpLHI7Zm9yKDsocj1JLm5leHQoKSkmJiFyLmRvbmU7KXtsZXQgbz1yLnZhbHVlO3QuY2FsbChBLG9bMF0sb1sxXSl9fSxyST0oQSx0KT0+e2xldCBlLEk9W107Zm9yKDsoZT1BLmV4ZWModCkpIT09bnVsbDspSS5wdXNoKGUpO3JldHVybiBJfSxvST1HKCJIVE1MRm9ybUVsZW1lbnQiKSxnST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxmdW5jdGlvbihlLEkscil7cmV0dXJuIEkudG9VcHBlckNhc2UoKStyfSksaHQ9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4odCxlKT0+QS5jYWxsKHQsZSkpKE9iamVjdC5wcm90b3R5cGUpLGlJPUcoIlJlZ0V4cCIpLFN0PShBLHQpPT57bGV0IGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSksST17fTtBQShlLChyLG8pPT57bGV0IGc7KGc9dChyLG8sQSkpIT09ITEmJihJW29dPWd8fHIpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxJKX0sc0k9QT0+e1N0KEEsKHQsZSk9PntpZihVKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YoZSkhPT0tMSlyZXR1cm4hMTtsZXQgST1BW2VdO2lmKFUoSSkpe2lmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdCl7dC53cml0YWJsZT0hMTtyZXR1cm59dC5zZXR8fCh0LnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcJyIrZSsiXCciKX0pfX0pfSxuST0oQSx0KT0+e2xldCBlPXt9LEk9cj0+e3IuZm9yRWFjaChvPT57ZVtvXT0hMH0pfTtyZXR1cm4gaihBKT9JKEEpOkkoU3RyaW5nKEEpLnNwbGl0KHQpKSxlfSxDST0oKT0+e30sQkk9KEEsdCk9PkEhPW51bGwmJk51bWJlci5pc0Zpbml0ZShBPStBKT9BOnQ7ZnVuY3Rpb24gYUkoQSl7cmV0dXJuISEoQSYmVShBLmFwcGVuZCkmJkFbU3ltYm9sLnRvU3RyaW5nVGFnXT09PSJGb3JtRGF0YSImJkFbU3ltYm9sLml0ZXJhdG9yXSl9dmFyIFFJPUE9PntsZXQgdD1uZXcgQXJyYXkoMTApLGU9KEkscik9PntpZihoQShJKSl7aWYodC5pbmRleE9mKEkpPj0wKXJldHVybjtpZighKCJ0b0pTT04iaW4gSSkpe3Rbcl09STtsZXQgbz1qKEkpP1tdOnt9O3JldHVybiBBQShJLChnLEMpPT57bGV0IEU9ZShnLHIrMSk7ISQoRSkmJihvW0NdPUUpfSksdFtyXT12b2lkIDAsb319cmV0dXJuIEl9O3JldHVybiBlKEEsMCl9LEVJPUcoIkFzeW5jRnVuY3Rpb24iKSxjST1BPT5BJiYoaEEoQSl8fFUoQSkpJiZVKEEudGhlbikmJlUoQS5jYXRjaCksRnQ9KChBLHQpPT5BP3NldEltbWVkaWF0ZTp0PygoZSxJKT0+KHguYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtzb3VyY2U6cixkYXRhOm99KT0+e3I9PT14JiZvPT09ZSYmSS5sZW5ndGgmJkkuc2hpZnQoKSgpfSwhMSkscj0+e0kucHVzaChyKSx4LnBvc3RNZXNzYWdlKGUsIioiKX0pKShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsW10pOmU9PnNldFRpbWVvdXQoZSkpKHR5cGVvZiBzZXRJbW1lZGlhdGU9PSJmdW5jdGlvbiIsVSh4LnBvc3RNZXNzYWdlKSksZkk9dHlwZW9mIHF1ZXVlTWljcm90YXNrPCJ1Ij9xdWV1ZU1pY3JvdGFzay5iaW5kKHgpOnR5cGVvZiBwcm9jZXNzPCJ1IiYmcHJvY2Vzcy5uZXh0VGlja3x8RnQsaT17aXNBcnJheTpqLGlzQXJyYXlCdWZmZXI6eXQsaXNCdWZmZXI6YmUsaXNGb3JtRGF0YTp4ZSxpc0FycmF5QnVmZmVyVmlldzpKZSxpc1N0cmluZzpIZSxpc051bWJlcjptdCxpc0Jvb2xlYW46WWUsaXNPYmplY3Q6aEEsaXNQbGFpbk9iamVjdDp1QSxpc1JlYWRhYmxlU3RyZWFtOldlLGlzUmVxdWVzdDpqZSxpc1Jlc3BvbnNlOlplLGlzSGVhZGVyczpWZSxpc1VuZGVmaW5lZDokLGlzRGF0ZTpxZSxpc0ZpbGU6TWUsaXNCbG9iOktlLGlzUmVnRXhwOmlJLGlzRnVuY3Rpb246VSxpc1N0cmVhbTpPZSxpc1VSTFNlYXJjaFBhcmFtczpQZSxpc1R5cGVkQXJyYXk6ZUksaXNGaWxlTGlzdDpUZSxmb3JFYWNoOkFBLG1lcmdlOktBLGV4dGVuZDpfZSx0cmltOlhlLHN0cmlwQk9NOnplLGluaGVyaXRzOnZlLHRvRmxhdE9iamVjdDokZSxraW5kT2Y6REEsa2luZE9mVGVzdDpHLGVuZHNXaXRoOkFJLHRvQXJyYXk6dEksZm9yRWFjaEVudHJ5OklJLG1hdGNoQWxsOnJJLGlzSFRNTEZvcm06b0ksaGFzT3duUHJvcGVydHk6aHQsaGFzT3duUHJvcDpodCxyZWR1Y2VEZXNjcmlwdG9yczpTdCxmcmVlemVNZXRob2RzOnNJLHRvT2JqZWN0U2V0Om5JLHRvQ2FtZWxDYXNlOmdJLG5vb3A6Q0ksdG9GaW5pdGVOdW1iZXI6QkksZmluZEtleTp3dCxnbG9iYWw6eCxpc0NvbnRleHREZWZpbmVkOnB0LGlzU3BlY0NvbXBsaWFudEZvcm06YUksdG9KU09OT2JqZWN0OlFJLGlzQXN5bmNGbjpFSSxpc1RoZW5hYmxlOmNJLHNldEltbWVkaWF0ZTpGdCxhc2FwOmZJfTtmdW5jdGlvbiBaKEEsdCxlLEkscil7RXJyb3IuY2FsbCh0aGlzKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2ssdGhpcy5tZXNzYWdlPUEsdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0JiYodGhpcy5jb2RlPXQpLGUmJih0aGlzLmNvbmZpZz1lKSxJJiYodGhpcy5yZXF1ZXN0PUkpLHImJih0aGlzLnJlc3BvbnNlPXIsdGhpcy5zdGF0dXM9ci5zdGF0dXM/ci5zdGF0dXM6bnVsbCl9aS5pbmhlcml0cyhaLEVycm9yLHt0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6aS50b0pTT05PYmplY3QodGhpcy5jb25maWcpLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnN0YXR1c319fSk7dmFyIFJ0PVoucHJvdG90eXBlLE50PXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goQT0+e050W0FdPXt2YWx1ZTpBfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFosTnQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSdCwiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KTtaLmZyb209KEEsdCxlLEkscixvKT0+e2xldCBnPU9iamVjdC5jcmVhdGUoUnQpO3JldHVybiBpLnRvRmxhdE9iamVjdChBLGcsZnVuY3Rpb24oRSl7cmV0dXJuIEUhPT1FcnJvci5wcm90b3R5cGV9LEM9PkMhPT0iaXNBeGlvc0Vycm9yIiksWi5jYWxsKGcsQS5tZXNzYWdlLHQsZSxJLHIpLGcuY2F1c2U9QSxnLm5hbWU9QS5uYW1lLG8mJk9iamVjdC5hc3NpZ24oZyxvKSxnfTt2YXIgdT1aO3ZhciB5QT1udWxsO2Z1bmN0aW9uIE9BKEEpe3JldHVybiBpLmlzUGxhaW5PYmplY3QoQSl8fGkuaXNBcnJheShBKX1mdW5jdGlvbiBHdChBKXtyZXR1cm4gaS5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBVdChBLHQsZSl7cmV0dXJuIEE/QS5jb25jYXQodCkubWFwKGZ1bmN0aW9uKHIsbyl7cmV0dXJuIHI9R3QociksIWUmJm8/IlsiK3IrIl0iOnJ9KS5qb2luKGU/Ii4iOiIiKTp0fWZ1bmN0aW9uIGxJKEEpe3JldHVybiBpLmlzQXJyYXkoQSkmJiFBLnNvbWUoT0EpfXZhciB1ST1pLnRvRmxhdE9iamVjdChpLHt9LG51bGwsZnVuY3Rpb24odCl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KHQpfSk7ZnVuY3Rpb24gREkoQSx0LGUpe2lmKCFpLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9dHx8bmV3KHlBfHxGb3JtRGF0YSksZT1pLnRvRmxhdE9iamVjdChlLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24obCxjKXtyZXR1cm4haS5pc1VuZGVmaW5lZChjW2xdKX0pO2xldCBJPWUubWV0YVRva2VucyxyPWUudmlzaXRvcnx8cyxvPWUuZG90cyxnPWUuaW5kZXhlcyxFPShlLkJsb2J8fHR5cGVvZiBCbG9iPCJ1IiYmQmxvYikmJmkuaXNTcGVjQ29tcGxpYW50Rm9ybSh0KTtpZighaS5pc0Z1bmN0aW9uKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gYShRKXtpZihRPT09bnVsbClyZXR1cm4iIjtpZihpLmlzRGF0ZShRKSlyZXR1cm4gUS50b0lTT1N0cmluZygpO2lmKCFFJiZpLmlzQmxvYihRKSl0aHJvdyBuZXcgdSgiQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4iKTtyZXR1cm4gaS5pc0FycmF5QnVmZmVyKFEpfHxpLmlzVHlwZWRBcnJheShRKT9FJiZ0eXBlb2YgQmxvYj09ImZ1bmN0aW9uIj9uZXcgQmxvYihbUV0pOkJ1ZmZlci5mcm9tKFEpOlF9ZnVuY3Rpb24gcyhRLGwsYyl7bGV0IGQ9UTtpZihRJiYhYyYmdHlwZW9mIFE9PSJvYmplY3QiKXtpZihpLmVuZHNXaXRoKGwsInt9IikpbD1JP2w6bC5zbGljZSgwLC0yKSxRPUpTT04uc3RyaW5naWZ5KFEpO2Vsc2UgaWYoaS5pc0FycmF5KFEpJiZsSShRKXx8KGkuaXNGaWxlTGlzdChRKXx8aS5lbmRzV2l0aChsLCJbXSIpKSYmKGQ9aS50b0FycmF5KFEpKSlyZXR1cm4gbD1HdChsKSxkLmZvckVhY2goZnVuY3Rpb24obSxIKXshKGkuaXNVbmRlZmluZWQobSl8fG09PT1udWxsKSYmdC5hcHBlbmQoZz09PSEwP1V0KFtsXSxILG8pOmc9PT1udWxsP2w6bCsiW10iLGEobSkpfSksITF9cmV0dXJuIE9BKFEpPyEwOih0LmFwcGVuZChVdChjLGwsbyksYShRKSksITEpfWxldCBuPVtdLGY9T2JqZWN0LmFzc2lnbih1SSx7ZGVmYXVsdFZpc2l0b3I6cyxjb252ZXJ0VmFsdWU6YSxpc1Zpc2l0YWJsZTpPQX0pO2Z1bmN0aW9uIEIoUSxsKXtpZighaS5pc1VuZGVmaW5lZChRKSl7aWYobi5pbmRleE9mKFEpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK2wuam9pbigiLiIpKTtuLnB1c2goUSksaS5mb3JFYWNoKFEsZnVuY3Rpb24oZCx5KXsoIShpLmlzVW5kZWZpbmVkKGQpfHxkPT09bnVsbCkmJnIuY2FsbCh0LGQsaS5pc1N0cmluZyh5KT95LnRyaW0oKTp5LGwsZikpPT09ITAmJkIoZCxsP2wuY29uY2F0KHkpOlt5XSl9KSxuLnBvcCgpfX1pZighaS5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIEIoQSksdH12YXIgTT1ESTtmdW5jdGlvbiBrdChBKXtsZXQgdD17IiEiOiIlMjUyMSIsIlwnIjoiJTI1MjciLCIoIjoiJTI1MjgiLCIpIjoiJTI1MjkiLCJ+IjoiJTI1N0UiLCIlMjUyMCI6IisiLCIlMjUwMCI6IlxcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvWyFcJygpfl18JTI1MjB8JTI1MDAvZyxmdW5jdGlvbihJKXtyZXR1cm4gdFtJXX0pfWZ1bmN0aW9uIEx0KEEsdCl7dGhpcy5fcGFpcnM9W10sQSYmTShBLHRoaXMsdCl9dmFyIGJ0PUx0LnByb3RvdHlwZTtidC5hcHBlbmQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9wYWlycy5wdXNoKFt0LGVdKX07YnQudG9TdHJpbmc9ZnVuY3Rpb24odCl7bGV0IGU9dD9mdW5jdGlvbihJKXtyZXR1cm4gdC5jYWxsKHRoaXMsSSxrdCl9Omt0O3JldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIGUoclswXSkrIj0iK2UoclsxXSl9LCIiKS5qb2luKCImIil9O3ZhciBtQT1MdDtmdW5jdGlvbiBkSShBKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUyNTNBL2dpLCI6IikucmVwbGFjZSgvJTI1MjQvZywiJCIpLnJlcGxhY2UoLyUyNTJDL2dpLCIsIikucmVwbGFjZSgvJTI1MjAvZywiKyIpLnJlcGxhY2UoLyUyNTVCL2dpLCJbIikucmVwbGFjZSgvJTI1NUQvZ2ksIl0iKX1mdW5jdGlvbiB0QShBLHQsZSl7aWYoIXQpcmV0dXJuIEE7bGV0IEk9ZSYmZS5lbmNvZGV8fGRJO2kuaXNGdW5jdGlvbihlKSYmKGU9e3NlcmlhbGl6ZTplfSk7bGV0IHI9ZSYmZS5zZXJpYWxpemUsbztpZihyP289cih0LGUpOm89aS5pc1VSTFNlYXJjaFBhcmFtcyh0KT90LnRvU3RyaW5nKCk6bmV3IG1BKHQsZSkudG9TdHJpbmcoSSksbyl7bGV0IGc9QS5pbmRleE9mKCIlMjMiKTtnIT09LTEmJihBPUEuc2xpY2UoMCxnKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrb31yZXR1cm4gQX12YXIgeEE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZSh0LGUsSSl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOnQscmVqZWN0ZWQ6ZSxzeW5jaHJvbm91czpJP0kuc3luY2hyb25vdXM6ITEscnVuV2hlbjpJP0kucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdCh0KXt0aGlzLmhhbmRsZXJzW3RdJiYodGhpcy5oYW5kbGVyc1t0XT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKHQpe2kuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKEkpe0khPT1udWxsJiZ0KEkpfSl9fSxQQT14QTt2YXIgd0E9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9O3ZhciBKdD10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6bUE7dmFyIEh0PXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgWXQ9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgcXQ9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6SnQsRm9ybURhdGE6SHQsQmxvYjpZdH0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciBaQT17fTtkZShaQSx7aGFzQnJvd3NlckVudjooKT0+akEsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5oSSxoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PnlJLG5hdmlnYXRvcjooKT0+V0Esb3JpZ2luOigpPT5tSX0pO3ZhciBqQT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixXQT10eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yfHx2b2lkIDAsaEk9akEmJighV0F8fFsiUmVhY3ROYXRpdmUiLCJOYXRpdmVTY3JpcHQiLCJOUyJdLmluZGV4T2YoV0EucHJvZHVjdCk8MCkseUk9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLG1JPWpBJiZ3aW5kb3cubG9jYXRpb24uaHJlZnx8Imh0dHA6Ly9sb2NhbGhvc3QiO3ZhciBoPXsuLi5aQSwuLi5xdH07ZnVuY3Rpb24gVkEoQSx0KXtyZXR1cm4gTShBLG5ldyBoLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLE9iamVjdC5hc3NpZ24oe3Zpc2l0b3I6ZnVuY3Rpb24oZSxJLHIsbyl7cmV0dXJuIGguaXNOb2RlJiZpLmlzQnVmZmVyKGUpPyh0aGlzLmFwcGVuZChJLGUudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6by5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSx0KSl9ZnVuY3Rpb24gd0koQSl7cmV0dXJuIGkubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLEEpLm1hcCh0PT50WzBdPT09IltdIj8iIjp0WzFdfHx0WzBdKX1mdW5jdGlvbiBwSShBKXtsZXQgdD17fSxlPU9iamVjdC5rZXlzKEEpLEkscj1lLmxlbmd0aCxvO2ZvcihJPTA7STxyO0krKylvPWVbSV0sdFtvXT1BW29dO3JldHVybiB0fWZ1bmN0aW9uIFNJKEEpe2Z1bmN0aW9uIHQoZSxJLHIsbyl7bGV0IGc9ZVtvKytdO2lmKGc9PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgQz1OdW1iZXIuaXNGaW5pdGUoK2cpLEU9bz49ZS5sZW5ndGg7cmV0dXJuIGc9IWcmJmkuaXNBcnJheShyKT9yLmxlbmd0aDpnLEU/KGkuaGFzT3duUHJvcChyLGcpP3JbZ109W3JbZ10sSV06cltnXT1JLCFDKTooKCFyW2ddfHwhaS5pc09iamVjdChyW2ddKSkmJihyW2ddPVtdKSx0KGUsSSxyW2ddLG8pJiZpLmlzQXJyYXkocltnXSkmJihyW2ddPXBJKHJbZ10pKSwhQyl9aWYoaS5pc0Zvcm1EYXRhKEEpJiZpLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IGU9e307cmV0dXJuIGkuZm9yRWFjaEVudHJ5KEEsKEkscik9Pnt0KHdJKEkpLHIsZSwwKX0pLGV9cmV0dXJuIG51bGx9dmFyIHBBPVNJO2Z1bmN0aW9uIEZJKEEsdCxlKXtpZihpLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoQSksaS50cmltKEEpfWNhdGNoKEkpe2lmKEkubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgSX1yZXR1cm4oZXx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBYQT17dHJhbnNpdGlvbmFsOndBLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIiwiZmV0Y2giXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbih0LGUpe2xldCBJPWUuZ2V0Q29udGVudFR5cGUoKXx8IiIscj1JLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxvPWkuaXNPYmplY3QodCk7aWYobyYmaS5pc0hUTUxGb3JtKHQpJiYodD1uZXcgRm9ybURhdGEodCkpLGkuaXNGb3JtRGF0YSh0KSlyZXR1cm4gcj9KU09OLnN0cmluZ2lmeShwQSh0KSk6dDtpZihpLmlzQXJyYXlCdWZmZXIodCl8fGkuaXNCdWZmZXIodCl8fGkuaXNTdHJlYW0odCl8fGkuaXNGaWxlKHQpfHxpLmlzQmxvYih0KXx8aS5pc1JlYWRhYmxlU3RyZWFtKHQpKXJldHVybiB0O2lmKGkuaXNBcnJheUJ1ZmZlclZpZXcodCkpcmV0dXJuIHQuYnVmZmVyO2lmKGkuaXNVUkxTZWFyY2hQYXJhbXModCkpcmV0dXJuIGUuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksdC50b1N0cmluZygpO2xldCBDO2lmKG8pe2lmKEkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIFZBKHQsdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtpZigoQz1pLmlzRmlsZUxpc3QodCkpfHxJLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IEU9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiBNKEM/eyJmaWxlc1tdIjp0fTp0LEUmJm5ldyBFLHRoaXMuZm9ybVNlcmlhbGl6ZXIpfX1yZXR1cm4gb3x8cj8oZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLEZJKHQpKTp0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe2xldCBlPXRoaXMudHJhbnNpdGlvbmFsfHxYQS50cmFuc2l0aW9uYWwsST1lJiZlLmZvcmNlZEpTT05QYXJzaW5nLHI9dGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYoaS5pc1Jlc3BvbnNlKHQpfHxpLmlzUmVhZGFibGVTdHJlYW0odCkpcmV0dXJuIHQ7aWYodCYmaS5pc1N0cmluZyh0KSYmKEkmJiF0aGlzLnJlc3BvbnNlVHlwZXx8cikpe2xldCBnPSEoZSYmZS5zaWxlbnRKU09OUGFyc2luZykmJnI7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKEMpe2lmKGcpdGhyb3cgQy5uYW1lPT09IlN5bnRheEVycm9yIj91LmZyb20oQyx1LkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRoaXMucmVzcG9uc2UpOkN9fXJldHVybiB0fV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpoLmNsYXNzZXMuRm9ybURhdGEsQmxvYjpoLmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTIwMCYmdDwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtpLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e1hBLmhlYWRlcnNbQV09e319KTt2YXIgVj1YQTt2YXIgUkk9aS50b09iamVjdFNldChbImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdKSxNdD1BPT57bGV0IHQ9e30sZSxJLHI7cmV0dXJuIEEmJkEuc3BsaXQoYCUwQWApLmZvckVhY2goZnVuY3Rpb24oZyl7cj1nLmluZGV4T2YoIjoiKSxlPWcuc3Vic3RyaW5nKDAscikudHJpbSgpLnRvTG93ZXJDYXNlKCksST1nLnN1YnN0cmluZyhyKzEpLnRyaW0oKSwhKCFlfHx0W2VdJiZSSVtlXSkmJihlPT09InNldC1jb29raWUiP3RbZV0/dFtlXS5wdXNoKEkpOnRbZV09W0ldOnRbZV09dFtlXT90W2VdKyIsICIrSTpJKX0pLHR9O3ZhciBLdD1TeW1ib2woImludGVybmFscyIpO2Z1bmN0aW9uIGVBKEEpe3JldHVybiBBJiZTdHJpbmcoQSkudHJpbSgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gU0EoQSl7cmV0dXJuIEE9PT0hMXx8QT09bnVsbD9BOmkuaXNBcnJheShBKT9BLm1hcChTQSk6U3RyaW5nKEEpfWZ1bmN0aW9uIE5JKEEpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksZT0vKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nLEk7Zm9yKDtJPWUuZXhlYyhBKTspdFtJWzFdXT1JWzJdO3JldHVybiB0fXZhciBVST1BPT4vXlstX2EtekEtWjAtOV5gfH4sISUyMyQlJlwnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBfQShBLHQsZSxJLHIpe2lmKGkuaXNGdW5jdGlvbihJKSlyZXR1cm4gSS5jYWxsKHRoaXMsdCxlKTtpZihyJiYodD1lKSwhIWkuaXNTdHJpbmcodCkpe2lmKGkuaXNTdHJpbmcoSSkpcmV0dXJuIHQuaW5kZXhPZihJKSE9PS0xO2lmKGkuaXNSZWdFeHAoSSkpcmV0dXJuIEkudGVzdCh0KX19ZnVuY3Rpb24gR0koQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCh0LGUsSSk9PmUudG9VcHBlckNhc2UoKStJKX1mdW5jdGlvbiBrSShBLHQpe2xldCBlPWkudG9DYW1lbENhc2UoIiAiK3QpO1siZ2V0Iiwic2V0IiwiaGFzIl0uZm9yRWFjaChJPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsSStlLHt2YWx1ZTpmdW5jdGlvbihyLG8sZyl7cmV0dXJuIHRoaXNbSV0uY2FsbCh0aGlzLHQscixvLGcpfSxjb25maWd1cmFibGU6ITB9KX0pfXZhciBYPWNsYXNze2NvbnN0cnVjdG9yKHQpe3QmJnRoaXMuc2V0KHQpfXNldCh0LGUsSSl7bGV0IHI9dGhpcztmdW5jdGlvbiBvKEMsRSxhKXtsZXQgcz1lQShFKTtpZighcyl0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IG49aS5maW5kS2V5KHIscyk7KCFufHxyW25dPT09dm9pZCAwfHxhPT09ITB8fGE9PT12b2lkIDAmJnJbbl0hPT0hMSkmJihyW258fEVdPVNBKEMpKX1sZXQgZz0oQyxFKT0+aS5mb3JFYWNoKEMsKGEscyk9Pm8oYSxzLEUpKTtpZihpLmlzUGxhaW5PYmplY3QodCl8fHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKWcodCxlKTtlbHNlIGlmKGkuaXNTdHJpbmcodCkmJih0PXQudHJpbSgpKSYmIVVJKHQpKWcoTXQodCksZSk7ZWxzZSBpZihpLmlzSGVhZGVycyh0KSlmb3IobGV0W0MsRV1vZiB0LmVudHJpZXMoKSlvKEUsQyxJKTtlbHNlIHQhPW51bGwmJm8oZSx0LEkpO3JldHVybiB0aGlzfWdldCh0LGUpe2lmKHQ9ZUEodCksdCl7bGV0IEk9aS5maW5kS2V5KHRoaXMsdCk7aWYoSSl7bGV0IHI9dGhpc1tJXTtpZighZSlyZXR1cm4gcjtpZihlPT09ITApcmV0dXJuIE5JKHIpO2lmKGkuaXNGdW5jdGlvbihlKSlyZXR1cm4gZS5jYWxsKHRoaXMscixJKTtpZihpLmlzUmVnRXhwKGUpKXJldHVybiBlLmV4ZWMocik7dGhyb3cgbmV3IFR5cGVFcnJvcigicGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24iKX19fWhhcyh0LGUpe2lmKHQ9ZUEodCksdCl7bGV0IEk9aS5maW5kS2V5KHRoaXMsdCk7cmV0dXJuISEoSSYmdGhpc1tJXSE9PXZvaWQgMCYmKCFlfHxfQSh0aGlzLHRoaXNbSV0sSSxlKSkpfXJldHVybiExfWRlbGV0ZSh0LGUpe2xldCBJPXRoaXMscj0hMTtmdW5jdGlvbiBvKGcpe2lmKGc9ZUEoZyksZyl7bGV0IEM9aS5maW5kS2V5KEksZyk7QyYmKCFlfHxfQShJLElbQ10sQyxlKSkmJihkZWxldGUgSVtDXSxyPSEwKX19cmV0dXJuIGkuaXNBcnJheSh0KT90LmZvckVhY2gobyk6byh0KSxyfWNsZWFyKHQpe2xldCBlPU9iamVjdC5rZXlzKHRoaXMpLEk9ZS5sZW5ndGgscj0hMTtmb3IoO0ktLTspe2xldCBvPWVbSV07KCF0fHxfQSh0aGlzLHRoaXNbb10sbyx0LCEwKSkmJihkZWxldGUgdGhpc1tvXSxyPSEwKX1yZXR1cm4gcn1ub3JtYWxpemUodCl7bGV0IGU9dGhpcyxJPXt9O3JldHVybiBpLmZvckVhY2godGhpcywocixvKT0+e2xldCBnPWkuZmluZEtleShJLG8pO2lmKGcpe2VbZ109U0EociksZGVsZXRlIGVbb107cmV0dXJufWxldCBDPXQ/R0kobyk6U3RyaW5nKG8pLnRyaW0oKTtDIT09byYmZGVsZXRlIGVbb10sZVtDXT1TQShyKSxJW0NdPSEwfSksdGhpc31jb25jYXQoLi4udCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKHQpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGkuZm9yRWFjaCh0aGlzLChJLHIpPT57SSE9bnVsbCYmSSE9PSExJiYoZVtyXT10JiZpLmlzQXJyYXkoSSk/SS5qb2luKCIsICIpOkkpfSksZX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbdCxlXSk9PnQrIjogIitlKS5qb2luKGAlMEFgKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJBeGlvc0hlYWRlcnMifXN0YXRpYyBmcm9tKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdGhpcz90Om5ldyB0aGlzKHQpfXN0YXRpYyBjb25jYXQodCwuLi5lKXtsZXQgST1uZXcgdGhpcyh0KTtyZXR1cm4gZS5mb3JFYWNoKHI9Pkkuc2V0KHIpKSxJfXN0YXRpYyBhY2Nlc3Nvcih0KXtsZXQgST0odGhpc1tLdF09dGhpc1tLdF09e2FjY2Vzc29yczp7fX0pLmFjY2Vzc29ycyxyPXRoaXMucHJvdG90eXBlO2Z1bmN0aW9uIG8oZyl7bGV0IEM9ZUEoZyk7SVtDXXx8KGtJKHIsZyksSVtDXT0hMCl9cmV0dXJuIGkuaXNBcnJheSh0KT90LmZvckVhY2gobyk6byh0KSx0aGlzfX07WC5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7aS5yZWR1Y2VEZXNjcmlwdG9ycyhYLnByb3RvdHlwZSwoe3ZhbHVlOkF9LHQpPT57bGV0IGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQoSSl7dGhpc1tlXT1JfX19KTtpLmZyZWV6ZU1ldGhvZHMoWCk7dmFyIFM9WDtmdW5jdGlvbiBJQShBLHQpe2xldCBlPXRoaXN8fFYsST10fHxlLHI9Uy5mcm9tKEkuaGVhZGVycyksbz1JLmRhdGE7cmV0dXJuIGkuZm9yRWFjaChBLGZ1bmN0aW9uKEMpe289Qy5jYWxsKGUsbyxyLm5vcm1hbGl6ZSgpLHQ/dC5zdGF0dXM6dm9pZCAwKX0pLHIubm9ybWFsaXplKCksb31mdW5jdGlvbiByQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfWZ1bmN0aW9uIFR0KEEsdCxlKXt1LmNhbGwodGhpcyxBPz8iY2FuY2VsZWQiLHUuRVJSX0NBTkNFTEVELHQsZSksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1pLmluaGVyaXRzKFR0LHUse19fQ0FOQ0VMX186ITB9KTt2YXIgTD1UdDtmdW5jdGlvbiBvQShBLHQsZSl7bGV0IEk9ZS5jb25maWcudmFsaWRhdGVTdGF0dXM7IWUuc3RhdHVzfHwhSXx8SShlLnN0YXR1cyk/QShlKTp0KG5ldyB1KCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrZS5zdGF0dXMsW3UuRVJSX0JBRF9SRVFVRVNULHUuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihlLnN0YXR1cy8xMDApLTRdLGUuY29uZmlnLGUucmVxdWVzdCxlKSl9ZnVuY3Rpb24gekEoQSl7bGV0IHQ9L14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWMoQSk7cmV0dXJuIHQmJnRbMV18fCIifWZ1bmN0aW9uIExJKEEsdCl7QT1BfHwxMDtsZXQgZT1uZXcgQXJyYXkoQSksST1uZXcgQXJyYXkoQSkscj0wLG89MCxnO3JldHVybiB0PXQhPT12b2lkIDA/dDoxZTMsZnVuY3Rpb24oRSl7bGV0IGE9RGF0ZS5ub3coKSxzPUlbb107Z3x8KGc9YSksZVtyXT1FLElbcl09YTtsZXQgbj1vLGY9MDtmb3IoO24hPT1yOylmKz1lW24rK10sbj1uJUE7aWYocj0ocisxKSVBLHI9PT1vJiYobz0obysxKSVBKSxhLWc8dClyZXR1cm47bGV0IEI9cyYmYS1zO3JldHVybiBCP01hdGgucm91bmQoZioxZTMvQik6dm9pZCAwfX12YXIgT3Q9TEk7ZnVuY3Rpb24gYkkoQSx0KXtsZXQgZT0wLEk9MWUzL3QscixvLGc9KGEscz1EYXRlLm5vdygpKT0+e2U9cyxyPW51bGwsbyYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLEEuYXBwbHkobnVsbCxhKX07cmV0dXJuWyguLi5hKT0+e2xldCBzPURhdGUubm93KCksbj1zLWU7bj49ST9nKGEscyk6KHI9YSxvfHwobz1zZXRUaW1lb3V0KCgpPT57bz1udWxsLGcocil9LEktbikpKX0sKCk9PnImJmcocildfXZhciB4dD1iSTt2YXIgXz0oQSx0LGU9Myk9PntsZXQgST0wLHI9T3QoNTAsMjUwKTtyZXR1cm4geHQobz0+e2xldCBnPW8ubG9hZGVkLEM9by5sZW5ndGhDb21wdXRhYmxlP28udG90YWw6dm9pZCAwLEU9Zy1JLGE9cihFKSxzPWc8PUM7ST1nO2xldCBuPXtsb2FkZWQ6Zyx0b3RhbDpDLHByb2dyZXNzOkM/Zy9DOnZvaWQgMCxieXRlczpFLHJhdGU6YXx8dm9pZCAwLGVzdGltYXRlZDphJiZDJiZzPyhDLWcpL2E6dm9pZCAwLGV2ZW50Om8sbGVuZ3RoQ29tcHV0YWJsZTpDIT1udWxsLFt0PyJkb3dubG9hZCI6InVwbG9hZCJdOiEwfTtBKG4pfSxlKX0sdkE9KEEsdCk9PntsZXQgZT1BIT1udWxsO3JldHVybltJPT50WzBdKHtsZW5ndGhDb21wdXRhYmxlOmUsdG90YWw6QSxsb2FkZWQ6SX0pLHRbMV1dfSwkQT1BPT4oLi4udCk9PmkuYXNhcCgoKT0+QSguLi50KSk7dmFyIFB0PWguaGFzU3RhbmRhcmRCcm93c2VyRW52PygoQSx0KT0+ZT0+KGU9bmV3IFVSTChlLGgub3JpZ2luKSxBLnByb3RvY29sPT09ZS5wcm90b2NvbCYmQS5ob3N0PT09ZS5ob3N0JiYodHx8QS5wb3J0PT09ZS5wb3J0KSkpKG5ldyBVUkwoaC5vcmlnaW4pLGgubmF2aWdhdG9yJiYvKG1zaWV8dHJpZGVudCkvaS50ZXN0KGgubmF2aWdhdG9yLnVzZXJBZ2VudCkpOigpPT4hMDt2YXIgV3Q9aC5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/e3dyaXRlKEEsdCxlLEkscixvKXtsZXQgZz1bQSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpXTtpLmlzTnVtYmVyKGUpJiZnLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShlKS50b0dNVFN0cmluZygpKSxpLmlzU3RyaW5nKEkpJiZnLnB1c2goInBhdGg9IitJKSxpLmlzU3RyaW5nKHIpJiZnLnB1c2goImRvbWFpbj0iK3IpLG89PT0hMCYmZy5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9Zy5qb2luKCI7ICIpfSxyZWFkKEEpe2xldCB0PWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxcXHMqKSgiK0ErIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlKEEpe3RoaXMud3JpdGUoQSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZSgpe30scmVhZCgpe3JldHVybiBudWxsfSxyZW1vdmUoKXt9fTtmdW5jdGlvbiBBdChBKXtyZXR1cm4vXihbYS16XVthLXpcXGQrXFwtLl0qOik/XFwvXFwvL2kudGVzdChBKX1mdW5jdGlvbiB0dChBLHQpe3JldHVybiB0P0EucmVwbGFjZSgvXFwvP1xcLyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXFwvKy8sIiIpOkF9ZnVuY3Rpb24gZ0EoQSx0LGUpe2xldCBJPSFBdCh0KTtyZXR1cm4gQSYmKEl8fGU9PSExKT90dChBLHQpOnR9dmFyIGp0PUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIGsoQSx0KXt0PXR8fHt9O2xldCBlPXt9O2Z1bmN0aW9uIEkoYSxzLG4sZil7cmV0dXJuIGkuaXNQbGFpbk9iamVjdChhKSYmaS5pc1BsYWluT2JqZWN0KHMpP2kubWVyZ2UuY2FsbCh7Y2FzZWxlc3M6Zn0sYSxzKTppLmlzUGxhaW5PYmplY3Qocyk/aS5tZXJnZSh7fSxzKTppLmlzQXJyYXkocyk/cy5zbGljZSgpOnN9ZnVuY3Rpb24gcihhLHMsbixmKXtpZihpLmlzVW5kZWZpbmVkKHMpKXtpZighaS5pc1VuZGVmaW5lZChhKSlyZXR1cm4gSSh2b2lkIDAsYSxuLGYpfWVsc2UgcmV0dXJuIEkoYSxzLG4sZil9ZnVuY3Rpb24gbyhhLHMpe2lmKCFpLmlzVW5kZWZpbmVkKHMpKXJldHVybiBJKHZvaWQgMCxzKX1mdW5jdGlvbiBnKGEscyl7aWYoaS5pc1VuZGVmaW5lZChzKSl7aWYoIWkuaXNVbmRlZmluZWQoYSkpcmV0dXJuIEkodm9pZCAwLGEpfWVsc2UgcmV0dXJuIEkodm9pZCAwLHMpfWZ1bmN0aW9uIEMoYSxzLG4pe2lmKG4gaW4gdClyZXR1cm4gSShhLHMpO2lmKG4gaW4gQSlyZXR1cm4gSSh2b2lkIDAsYSl9bGV0IEU9e3VybDpvLG1ldGhvZDpvLGRhdGE6byxiYXNlVVJMOmcsdHJhbnNmb3JtUmVxdWVzdDpnLHRyYW5zZm9ybVJlc3BvbnNlOmcscGFyYW1zU2VyaWFsaXplcjpnLHRpbWVvdXQ6Zyx0aW1lb3V0TWVzc2FnZTpnLHdpdGhDcmVkZW50aWFsczpnLHdpdGhYU1JGVG9rZW46ZyxhZGFwdGVyOmcscmVzcG9uc2VUeXBlOmcseHNyZkNvb2tpZU5hbWU6Zyx4c3JmSGVhZGVyTmFtZTpnLG9uVXBsb2FkUHJvZ3Jlc3M6ZyxvbkRvd25sb2FkUHJvZ3Jlc3M6ZyxkZWNvbXByZXNzOmcsbWF4Q29udGVudExlbmd0aDpnLG1heEJvZHlMZW5ndGg6ZyxiZWZvcmVSZWRpcmVjdDpnLHRyYW5zcG9ydDpnLGh0dHBBZ2VudDpnLGh0dHBzQWdlbnQ6ZyxjYW5jZWxUb2tlbjpnLHNvY2tldFBhdGg6ZyxyZXNwb25zZUVuY29kaW5nOmcsdmFsaWRhdGVTdGF0dXM6QyxoZWFkZXJzOihhLHMsbik9PnIoanQoYSksanQocyksbiwhMCl9O3JldHVybiBpLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxBLHQpKSxmdW5jdGlvbihzKXtsZXQgbj1FW3NdfHxyLGY9bihBW3NdLHRbc10scyk7aS5pc1VuZGVmaW5lZChmKSYmbiE9PUN8fChlW3NdPWYpfSksZX12YXIgRkE9QT0+e2xldCB0PWsoe30sQSkse2RhdGE6ZSx3aXRoWFNSRlRva2VuOkkseHNyZkhlYWRlck5hbWU6cix4c3JmQ29va2llTmFtZTpvLGhlYWRlcnM6ZyxhdXRoOkN9PXQ7dC5oZWFkZXJzPWc9Uy5mcm9tKGcpLHQudXJsPXRBKGdBKHQuYmFzZVVSTCx0LnVybCx0LmFsbG93QWJzb2x1dGVVcmxzKSxBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLEMmJmcuc2V0KCJBdXRob3JpemF0aW9uIiwiQmFzaWMgIitidG9hKChDLnVzZXJuYW1lfHwiIikrIjoiKyhDLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChDLnBhc3N3b3JkKSk6IiIpKSk7bGV0IEU7aWYoaS5pc0Zvcm1EYXRhKGUpKXtpZihoLmhhc1N0YW5kYXJkQnJvd3NlckVudnx8aC5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpZy5zZXRDb250ZW50VHlwZSh2b2lkIDApO2Vsc2UgaWYoKEU9Zy5nZXRDb250ZW50VHlwZSgpKSE9PSExKXtsZXRbYSwuLi5zXT1FP0Uuc3BsaXQoIjsiKS5tYXAobj0+bi50cmltKCkpLmZpbHRlcihCb29sZWFuKTpbXTtnLnNldENvbnRlbnRUeXBlKFthfHwibXVsdGlwYXJ0L2Zvcm0tZGF0YSIsLi4uc10uam9pbigiOyAiKSl9fWlmKGguaGFzU3RhbmRhcmRCcm93c2VyRW52JiYoSSYmaS5pc0Z1bmN0aW9uKEkpJiYoST1JKHQpKSxJfHxJIT09ITEmJlB0KHQudXJsKSkpe2xldCBhPXImJm8mJld0LnJlYWQobyk7YSYmZy5zZXQocixhKX1yZXR1cm4gdH07dmFyIEpJPXR5cGVvZiBYTUxIdHRwUmVxdWVzdDwidSIsWnQ9SkkmJmZ1bmN0aW9uKEEpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLEkpe2xldCByPUZBKEEpLG89ci5kYXRhLGc9Uy5mcm9tKHIuaGVhZGVycykubm9ybWFsaXplKCkse3Jlc3BvbnNlVHlwZTpDLG9uVXBsb2FkUHJvZ3Jlc3M6RSxvbkRvd25sb2FkUHJvZ3Jlc3M6YX09cixzLG4sZixCLFE7ZnVuY3Rpb24gbCgpe0ImJkIoKSxRJiZRKCksci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShzKSxyLnNpZ25hbCYmci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHMpfWxldCBjPW5ldyBYTUxIdHRwUmVxdWVzdDtjLm9wZW4oci5tZXRob2QudG9VcHBlckNhc2UoKSxyLnVybCwhMCksYy50aW1lb3V0PXIudGltZW91dDtmdW5jdGlvbiBkKCl7aWYoIWMpcmV0dXJuO2xldCBtPVMuZnJvbSgiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGMmJmMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLFI9e2RhdGE6IUN8fEM9PT0idGV4dCJ8fEM9PT0ianNvbiI/Yy5yZXNwb25zZVRleHQ6Yy5yZXNwb25zZSxzdGF0dXM6Yy5zdGF0dXMsc3RhdHVzVGV4dDpjLnN0YXR1c1RleHQsaGVhZGVyczptLGNvbmZpZzpBLHJlcXVlc3Q6Y307b0EoZnVuY3Rpb24oVCl7ZShUKSxsKCl9LGZ1bmN0aW9uKFQpe0koVCksbCgpfSxSKSxjPW51bGx9Im9ubG9hZGVuZCJpbiBjP2Mub25sb2FkZW5kPWQ6Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshY3x8Yy5yZWFkeVN0YXRlIT09NHx8Yy5zdGF0dXM9PT0wJiYhKGMucmVzcG9uc2VVUkwmJmMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGQpfSxjLm9uYWJvcnQ9ZnVuY3Rpb24oKXtjJiYoSShuZXcgdSgiUmVxdWVzdCBhYm9ydGVkIix1LkVDT05OQUJPUlRFRCxBLGMpKSxjPW51bGwpfSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXtJKG5ldyB1KCJOZXR3b3JrIEVycm9yIix1LkVSUl9ORVRXT1JLLEEsYykpLGM9bnVsbH0sYy5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtsZXQgSD1yLnRpbWVvdXQ/InRpbWVvdXQgb2YgIityLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsUj1yLnRyYW5zaXRpb25hbHx8d0E7ci50aW1lb3V0RXJyb3JNZXNzYWdlJiYoSD1yLnRpbWVvdXRFcnJvck1lc3NhZ2UpLEkobmV3IHUoSCxSLmNsYXJpZnlUaW1lb3V0RXJyb3I/dS5FVElNRURPVVQ6dS5FQ09OTkFCT1JURUQsQSxjKSksYz1udWxsfSxvPT09dm9pZCAwJiZnLnNldENvbnRlbnRUeXBlKG51bGwpLCJzZXRSZXF1ZXN0SGVhZGVyImluIGMmJmkuZm9yRWFjaChnLnRvSlNPTigpLGZ1bmN0aW9uKEgsUil7Yy5zZXRSZXF1ZXN0SGVhZGVyKFIsSCl9KSxpLmlzVW5kZWZpbmVkKHIud2l0aENyZWRlbnRpYWxzKXx8KGMud2l0aENyZWRlbnRpYWxzPSEhci53aXRoQ3JlZGVudGlhbHMpLEMmJkMhPT0ianNvbiImJihjLnJlc3BvbnNlVHlwZT1yLnJlc3BvbnNlVHlwZSksYSYmKFtmLFFdPV8oYSwhMCksYy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZikpLEUmJmMudXBsb2FkJiYoW24sQl09XyhFKSxjLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsbiksYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVuZCIsQikpLChyLmNhbmNlbFRva2VufHxyLnNpZ25hbCkmJihzPW09PntjJiYoSSghbXx8bS50eXBlP25ldyBMKG51bGwsQSxjKTptKSxjLmFib3J0KCksYz1udWxsKX0sci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi5zdWJzY3JpYmUocyksci5zaWduYWwmJihyLnNpZ25hbC5hYm9ydGVkP3MoKTpyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIscykpKTtsZXQgeT16QShyLnVybCk7aWYoeSYmaC5wcm90b2NvbHMuaW5kZXhPZih5KT09PS0xKXtJKG5ldyB1KCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK3krIjoiLHUuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59Yy5zZW5kKG98fG51bGwpfSl9O3ZhciBIST0oQSx0KT0+e2xldHtsZW5ndGg6ZX09QT1BP0EuZmlsdGVyKEJvb2xlYW4pOltdO2lmKHR8fGUpe2xldCBJPW5ldyBBYm9ydENvbnRyb2xsZXIscixvPWZ1bmN0aW9uKGEpe2lmKCFyKXtyPSEwLEMoKTtsZXQgcz1hIGluc3RhbmNlb2YgRXJyb3I/YTp0aGlzLnJlYXNvbjtJLmFib3J0KHMgaW5zdGFuY2VvZiB1P3M6bmV3IEwocyBpbnN0YW5jZW9mIEVycm9yP3MubWVzc2FnZTpzKSl9fSxnPXQmJnNldFRpbWVvdXQoKCk9PntnPW51bGwsbyhuZXcgdShgdGltZW91dCAke3R9IG9mIG1zIGV4Y2VlZGVkYCx1LkVUSU1FRE9VVCkpfSx0KSxDPSgpPT57QSYmKGcmJmNsZWFyVGltZW91dChnKSxnPW51bGwsQS5mb3JFYWNoKGE9PnthLnVuc3Vic2NyaWJlP2EudW5zdWJzY3JpYmUobyk6YS5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbyl9KSxBPW51bGwpfTtBLmZvckVhY2goYT0+YS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbykpO2xldHtzaWduYWw6RX09STtyZXR1cm4gRS51bnN1YnNjcmliZT0oKT0+aS5hc2FwKEMpLEV9fSxWdD1ISTt2YXIgWUk9ZnVuY3Rpb24qKEEsdCl7bGV0IGU9QS5ieXRlTGVuZ3RoO2lmKCF0fHxlPHQpe3lpZWxkIEE7cmV0dXJufWxldCBJPTAscjtmb3IoO0k8ZTspcj1JK3QseWllbGQgQS5zbGljZShJLHIpLEk9cn0scUk9YXN5bmMgZnVuY3Rpb24qKEEsdCl7Zm9yIGF3YWl0KGxldCBlIG9mIE1JKEEpKXlpZWxkKllJKGUsdCl9LE1JPWFzeW5jIGZ1bmN0aW9uKihBKXtpZihBW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSl7eWllbGQqQTtyZXR1cm59bGV0IHQ9QS5nZXRSZWFkZXIoKTt0cnl7Zm9yKDs7KXtsZXR7ZG9uZTplLHZhbHVlOkl9PWF3YWl0IHQucmVhZCgpO2lmKGUpYnJlYWs7eWllbGQgSX19ZmluYWxseXthd2FpdCB0LmNhbmNlbCgpfX0sZXQ9KEEsdCxlLEkpPT57bGV0IHI9cUkoQSx0KSxvPTAsZyxDPUU9PntnfHwoZz0hMCxJJiZJKEUpKX07cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7YXN5bmMgcHVsbChFKXt0cnl7bGV0e2RvbmU6YSx2YWx1ZTpzfT1hd2FpdCByLm5leHQoKTtpZihhKXtDKCksRS5jbG9zZSgpO3JldHVybn1sZXQgbj1zLmJ5dGVMZW5ndGg7aWYoZSl7bGV0IGY9bys9bjtlKGYpfUUuZW5xdWV1ZShuZXcgVWludDhBcnJheShzKSl9Y2F0Y2goYSl7dGhyb3cgQyhhKSxhfX0sY2FuY2VsKEUpe3JldHVybiBDKEUpLHIucmV0dXJuKCl9fSx7aGlnaFdhdGVyTWFyazoyfSl9O3ZhciBOQT10eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiImJnR5cGVvZiBSZXF1ZXN0PT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2U9PSJmdW5jdGlvbiIsX3Q9TkEmJnR5cGVvZiBSZWFkYWJsZVN0cmVhbT09ImZ1bmN0aW9uIixLST1OQSYmKHR5cGVvZiBUZXh0RW5jb2Rlcj09ImZ1bmN0aW9uIj8oQT0+dD0+QS5lbmNvZGUodCkpKG5ldyBUZXh0RW5jb2Rlcik6YXN5bmMgQT0+bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKEEpLmFycmF5QnVmZmVyKCkpKSx6dD0oQSwuLi50KT0+e3RyeXtyZXR1cm4hIUEoLi4udCl9Y2F0Y2h7cmV0dXJuITF9fSxUST1fdCYmenQoKCk9PntsZXQgQT0hMSx0PW5ldyBSZXF1ZXN0KGgub3JpZ2luLHtib2R5Om5ldyBSZWFkYWJsZVN0cmVhbSxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gQT0hMCwiaGFsZiJ9fSkuaGVhZGVycy5oYXMoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBBJiYhdH0pLFh0PTY0KjEwMjQsSXQ9X3QmJnp0KCgpPT5pLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCIiKS5ib2R5KSksUkE9e3N0cmVhbTpJdCYmKEE9PkEuYm9keSl9O05BJiYoQT0+e1sidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaCh0PT57IVJBW3RdJiYoUkFbdF09aS5pc0Z1bmN0aW9uKEFbdF0pP2U9PmVbdF0oKTooZSxJKT0+e3Rocm93IG5ldyB1KGBSZXNwb25zZSB0eXBlIFwnJHt0fVwnIGlzIG5vdCBzdXBwb3J0ZWRgLHUuRVJSX05PVF9TVVBQT1JULEkpfSl9KX0pKG5ldyBSZXNwb25zZSk7dmFyIE9JPWFzeW5jIEE9PntpZihBPT1udWxsKXJldHVybiAwO2lmKGkuaXNCbG9iKEEpKXJldHVybiBBLnNpemU7aWYoaS5pc1NwZWNDb21wbGlhbnRGb3JtKEEpKXJldHVybihhd2FpdCBuZXcgUmVxdWVzdChoLm9yaWdpbix7bWV0aG9kOiJQT1NUIixib2R5OkF9KS5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO2lmKGkuaXNBcnJheUJ1ZmZlclZpZXcoQSl8fGkuaXNBcnJheUJ1ZmZlcihBKSlyZXR1cm4gQS5ieXRlTGVuZ3RoO2lmKGkuaXNVUkxTZWFyY2hQYXJhbXMoQSkmJihBPUErIiIpLGkuaXNTdHJpbmcoQSkpcmV0dXJuKGF3YWl0IEtJKEEpKS5ieXRlTGVuZ3RofSx4ST1hc3luYyhBLHQpPT57bGV0IGU9aS50b0Zpbml0ZU51bWJlcihBLmdldENvbnRlbnRMZW5ndGgoKSk7cmV0dXJuIGU/P09JKHQpfSx2dD1OQSYmKGFzeW5jIEE9PntsZXR7dXJsOnQsbWV0aG9kOmUsZGF0YTpJLHNpZ25hbDpyLGNhbmNlbFRva2VuOm8sdGltZW91dDpnLG9uRG93bmxvYWRQcm9ncmVzczpDLG9uVXBsb2FkUHJvZ3Jlc3M6RSxyZXNwb25zZVR5cGU6YSxoZWFkZXJzOnMsd2l0aENyZWRlbnRpYWxzOm49InNhbWUtb3JpZ2luIixmZXRjaE9wdGlvbnM6Zn09RkEoQSk7YT1hPyhhKyIiKS50b0xvd2VyQ2FzZSgpOiJ0ZXh0IjtsZXQgQj1WdChbcixvJiZvLnRvQWJvcnRTaWduYWwoKV0sZyksUSxsPUImJkIudW5zdWJzY3JpYmUmJigoKT0+e0IudW5zdWJzY3JpYmUoKX0pLGM7dHJ5e2lmKEUmJlRJJiZlIT09ImdldCImJmUhPT0iaGVhZCImJihjPWF3YWl0IHhJKHMsSSkpIT09MCl7bGV0IFI9bmV3IFJlcXVlc3QodCx7bWV0aG9kOiJQT1NUIixib2R5OkksZHVwbGV4OiJoYWxmIn0pLHE7aWYoaS5pc0Zvcm1EYXRhKEkpJiYocT1SLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKSkmJnMuc2V0Q29udGVudFR5cGUocSksUi5ib2R5KXtsZXRbVCxCQV09dkEoYyxfKCRBKEUpKSk7ST1ldChSLmJvZHksWHQsVCxCQSl9fWkuaXNTdHJpbmcobil8fChuPW4/ImluY2x1ZGUiOiJvbWl0Iik7bGV0IGQ9ImNyZWRlbnRpYWxzImluIFJlcXVlc3QucHJvdG90eXBlO1E9bmV3IFJlcXVlc3QodCx7Li4uZixzaWduYWw6QixtZXRob2Q6ZS50b1VwcGVyQ2FzZSgpLGhlYWRlcnM6cy5ub3JtYWxpemUoKS50b0pTT04oKSxib2R5OkksZHVwbGV4OiJoYWxmIixjcmVkZW50aWFsczpkP246dm9pZCAwfSk7bGV0IHk9YXdhaXQgZmV0Y2goUSksbT1JdCYmKGE9PT0ic3RyZWFtInx8YT09PSJyZXNwb25zZSIpO2lmKEl0JiYoQ3x8bSYmbCkpe2xldCBSPXt9O1sic3RhdHVzIiwic3RhdHVzVGV4dCIsImhlYWRlcnMiXS5mb3JFYWNoKGF0PT57UlthdF09eVthdF19KTtsZXQgcT1pLnRvRmluaXRlTnVtYmVyKHkuaGVhZGVycy5nZXQoImNvbnRlbnQtbGVuZ3RoIikpLFtULEJBXT1DJiZ2QShxLF8oJEEoQyksITApKXx8W107eT1uZXcgUmVzcG9uc2UoZXQoeS5ib2R5LFh0LFQsKCk9PntCQSYmQkEoKSxsJiZsKCl9KSxSKX1hPWF8fCJ0ZXh0IjtsZXQgSD1hd2FpdCBSQVtpLmZpbmRLZXkoUkEsYSl8fCJ0ZXh0Il0oeSxBKTtyZXR1cm4hbSYmbCYmbCgpLGF3YWl0IG5ldyBQcm9taXNlKChSLHEpPT57b0EoUixxLHtkYXRhOkgsaGVhZGVyczpTLmZyb20oeS5oZWFkZXJzKSxzdGF0dXM6eS5zdGF0dXMsc3RhdHVzVGV4dDp5LnN0YXR1c1RleHQsY29uZmlnOkEscmVxdWVzdDpRfSl9KX1jYXRjaChkKXt0aHJvdyBsJiZsKCksZCYmZC5uYW1lPT09IlR5cGVFcnJvciImJi9mZXRjaC9pLnRlc3QoZC5tZXNzYWdlKT9PYmplY3QuYXNzaWduKG5ldyB1KCJOZXR3b3JrIEVycm9yIix1LkVSUl9ORVRXT1JLLEEsUSkse2NhdXNlOmQuY2F1c2V8fGR9KTp1LmZyb20oZCxkJiZkLmNvZGUsQSxRKX19KTt2YXIgcnQ9e2h0dHA6eUEseGhyOlp0LGZldGNoOnZ0fTtpLmZvckVhY2gocnQsKEEsdCk9PntpZihBKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsIm5hbWUiLHt2YWx1ZTp0fSl9Y2F0Y2h7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJhZGFwdGVyTmFtZSIse3ZhbHVlOnR9KX19KTt2YXIgJHQ9QT0+YC0gJHtBfWAsUEk9QT0+aS5pc0Z1bmN0aW9uKEEpfHxBPT09bnVsbHx8QT09PSExLFVBPXtnZXRBZGFwdGVyOkE9PntBPWkuaXNBcnJheShBKT9BOltBXTtsZXR7bGVuZ3RoOnR9PUEsZSxJLHI9e307Zm9yKGxldCBvPTA7bzx0O28rKyl7ZT1BW29dO2xldCBnO2lmKEk9ZSwhUEkoZSkmJihJPXJ0WyhnPVN0cmluZyhlKSkudG9Mb3dlckNhc2UoKV0sST09PXZvaWQgMCkpdGhyb3cgbmV3IHUoYFVua25vd24gYWRhcHRlciBcJyR7Z31cJ2ApO2lmKEkpYnJlYWs7cltnfHwiJTIzIitvXT1JfWlmKCFJKXtsZXQgbz1PYmplY3QuZW50cmllcyhyKS5tYXAoKFtDLEVdKT0+YGFkYXB0ZXIgJHtDfSBgKyhFPT09ITE/ImlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGVudmlyb25tZW50IjoiaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQiKSksZz10P28ubGVuZ3RoPjE/YHNpbmNlIDolMEFgK28ubWFwKCR0KS5qb2luKGAlMEFgKToiICIrJHQob1swXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgdSgiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2csIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiBJfSxhZGFwdGVyczpydH07ZnVuY3Rpb24gb3QoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IEwobnVsbCxBKX1mdW5jdGlvbiBHQShBKXtyZXR1cm4gb3QoQSksQS5oZWFkZXJzPVMuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT1JQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSksVUEuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fFYuYWRhcHRlcikoQSkudGhlbihmdW5jdGlvbihJKXtyZXR1cm4gb3QoQSksSS5kYXRhPUlBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLEkpLEkuaGVhZGVycz1TLmZyb20oSS5oZWFkZXJzKSxJfSxmdW5jdGlvbihJKXtyZXR1cm4gckEoSSl8fChvdChBKSxJJiZJLnJlc3BvbnNlJiYoSS5yZXNwb25zZS5kYXRhPUlBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLEkucmVzcG9uc2UpLEkucmVzcG9uc2UuaGVhZGVycz1TLmZyb20oSS5yZXNwb25zZS5oZWFkZXJzKSkpLFByb21pc2UucmVqZWN0KEkpfSl9dmFyIGtBPSIxLjguNCI7dmFyIExBPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoQSx0KT0+e0xBW0FdPWZ1bmN0aW9uKEkpe3JldHVybiB0eXBlb2YgST09PUF8fCJhIisodDwxPyJuICI6IiAiKStBfX0pO3ZhciBBZT17fTtMQS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24odCxlLEkpe2Z1bmN0aW9uIHIobyxnKXtyZXR1cm4iW0F4aW9zIHYiK2tBKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gXCciK28rIlwnIitnKyhJPyIuICIrSToiIil9cmV0dXJuKG8sZyxDKT0+e2lmKHQ9PT0hMSl0aHJvdyBuZXcgdShyKGcsIiBoYXMgYmVlbiByZW1vdmVkIisoZT8iIGluICIrZToiIikpLHUuRVJSX0RFUFJFQ0FURUQpO3JldHVybiBlJiYhQWVbZ10mJihBZVtnXT0hMCxjb25zb2xlLndhcm4ocihnLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2IitlKyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLHQ/dChvLGcsQyk6ITB9fTtMQS5zcGVsbGluZz1mdW5jdGlvbih0KXtyZXR1cm4oZSxJKT0+KGNvbnNvbGUud2FybihgJHtJfSBpcyBsaWtlbHkgYSBtaXNzcGVsbGluZyBvZiAke3R9YCksITApfTtmdW5jdGlvbiBXSShBLHQsZSl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyB1KCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iix1LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgST1PYmplY3Qua2V5cyhBKSxyPUkubGVuZ3RoO2Zvcig7ci0tID4wOyl7bGV0IG89SVtyXSxnPXRbb107aWYoZyl7bGV0IEM9QVtvXSxFPUM9PT12b2lkIDB8fGcoQyxvLEEpO2lmKEUhPT0hMCl0aHJvdyBuZXcgdSgib3B0aW9uICIrbysiIG11c3QgYmUgIitFLHUuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKGUhPT0hMCl0aHJvdyBuZXcgdSgiVW5rbm93biBvcHRpb24gIitvLHUuRVJSX0JBRF9PUFRJT04pfX12YXIgaUE9e2Fzc2VydE9wdGlvbnM6V0ksdmFsaWRhdG9yczpMQX07dmFyIGI9aUEudmFsaWRhdG9ycyx6PWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVmYXVsdHM9dCx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgUEEscmVzcG9uc2U6bmV3IFBBfX1hc3luYyByZXF1ZXN0KHQsZSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KHQsZSl9Y2F0Y2goSSl7aWYoSSBpbnN0YW5jZW9mIEVycm9yKXtsZXQgcj17fTtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShyKTpyPW5ldyBFcnJvcjtsZXQgbz1yLnN0YWNrP3Iuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywiIik6IiI7dHJ5e0kuc3RhY2s/byYmIVN0cmluZyhJLnN0YWNrKS5lbmRzV2l0aChvLnJlcGxhY2UoL14uK1xcbi4rXFxuLywiIikpJiYoSS5zdGFjays9YCUwQWArbyk6SS5zdGFjaz1vfWNhdGNoe319dGhyb3cgSX19X3JlcXVlc3QodCxlKXt0eXBlb2YgdD09InN0cmluZyI/KGU9ZXx8e30sZS51cmw9dCk6ZT10fHx7fSxlPWsodGhpcy5kZWZhdWx0cyxlKTtsZXR7dHJhbnNpdGlvbmFsOkkscGFyYW1zU2VyaWFsaXplcjpyLGhlYWRlcnM6b309ZTtJIT09dm9pZCAwJiZpQS5hc3NlcnRPcHRpb25zKEkse3NpbGVudEpTT05QYXJzaW5nOmIudHJhbnNpdGlvbmFsKGIuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6Yi50cmFuc2l0aW9uYWwoYi5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOmIudHJhbnNpdGlvbmFsKGIuYm9vbGVhbil9LCExKSxyIT1udWxsJiYoaS5pc0Z1bmN0aW9uKHIpP2UucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOnJ9OmlBLmFzc2VydE9wdGlvbnMocix7ZW5jb2RlOmIuZnVuY3Rpb24sc2VyaWFsaXplOmIuZnVuY3Rpb259LCEwKSksZS5hbGxvd0Fic29sdXRlVXJscyE9PXZvaWQgMHx8KHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHMhPT12b2lkIDA/ZS5hbGxvd0Fic29sdXRlVXJscz10aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzOmUuYWxsb3dBYnNvbHV0ZVVybHM9ITApLGlBLmFzc2VydE9wdGlvbnMoZSx7YmFzZVVybDpiLnNwZWxsaW5nKCJiYXNlVVJMIiksd2l0aFhzcmZUb2tlbjpiLnNwZWxsaW5nKCJ3aXRoWFNSRlRva2VuIil9LCEwKSxlLm1ldGhvZD0oZS5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgZz1vJiZpLm1lcmdlKG8uY29tbW9uLG9bZS5tZXRob2RdKTtvJiZpLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sUT0+e2RlbGV0ZSBvW1FdfSksZS5oZWFkZXJzPVMuY29uY2F0KGcsbyk7bGV0IEM9W10sRT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24obCl7dHlwZW9mIGwucnVuV2hlbj09ImZ1bmN0aW9uIiYmbC5ydW5XaGVuKGUpPT09ITF8fChFPUUmJmwuc3luY2hyb25vdXMsQy51bnNoaWZ0KGwuZnVsZmlsbGVkLGwucmVqZWN0ZWQpKX0pO2xldCBhPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24obCl7YS5wdXNoKGwuZnVsZmlsbGVkLGwucmVqZWN0ZWQpfSk7bGV0IHMsbj0wLGY7aWYoIUUpe2xldCBRPVtHQS5iaW5kKHRoaXMpLHZvaWQgMF07Zm9yKFEudW5zaGlmdC5hcHBseShRLEMpLFEucHVzaC5hcHBseShRLGEpLGY9US5sZW5ndGgscz1Qcm9taXNlLnJlc29sdmUoZSk7bjxmOylzPXMudGhlbihRW24rK10sUVtuKytdKTtyZXR1cm4gc31mPUMubGVuZ3RoO2xldCBCPWU7Zm9yKG49MDtuPGY7KXtsZXQgUT1DW24rK10sbD1DW24rK107dHJ5e0I9UShCKX1jYXRjaChjKXtsLmNhbGwodGhpcyxjKTticmVha319dHJ5e3M9R0EuY2FsbCh0aGlzLEIpfWNhdGNoKFEpe3JldHVybiBQcm9taXNlLnJlamVjdChRKX1mb3Iobj0wLGY9YS5sZW5ndGg7bjxmOylzPXMudGhlbihhW24rK10sYVtuKytdKTtyZXR1cm4gc31nZXRVcmkodCl7dD1rKHRoaXMuZGVmYXVsdHMsdCk7bGV0IGU9Z0EodC5iYXNlVVJMLHQudXJsLHQuYWxsb3dBYnNvbHV0ZVVybHMpO3JldHVybiB0QShlLHQucGFyYW1zLHQucGFyYW1zU2VyaWFsaXplcil9fTtpLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKHQpe3oucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsSSl7cmV0dXJuIHRoaXMucmVxdWVzdChrKEl8fHt9LHttZXRob2Q6dCx1cmw6ZSxkYXRhOihJfHx7fSkuZGF0YX0pKX19KTtpLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbih0KXtmdW5jdGlvbiBlKEkpe3JldHVybiBmdW5jdGlvbihvLGcsQyl7cmV0dXJuIHRoaXMucmVxdWVzdChrKEN8fHt9LHttZXRob2Q6dCxoZWFkZXJzOkk/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOm8sZGF0YTpnfSkpfX16LnByb3RvdHlwZVt0XT1lKCksei5wcm90b3R5cGVbdCsiRm9ybSJdPWUoITApfSk7dmFyIHNBPXo7dmFyIGd0PWNsYXNzIEF7Y29uc3RydWN0b3IodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihvKXtlPW99KTtsZXQgST10aGlzO3RoaXMucHJvbWlzZS50aGVuKHI9PntpZighSS5fbGlzdGVuZXJzKXJldHVybjtsZXQgbz1JLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7by0tID4wOylJLl9saXN0ZW5lcnNbb10ocik7SS5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1yPT57bGV0IG8sZz1uZXcgUHJvbWlzZShDPT57SS5zdWJzY3JpYmUoQyksbz1DfSkudGhlbihyKTtyZXR1cm4gZy5jYW5jZWw9ZnVuY3Rpb24oKXtJLnVuc3Vic2NyaWJlKG8pfSxnfSx0KGZ1bmN0aW9uKG8sZyxDKXtJLnJlYXNvbnx8KEkucmVhc29uPW5ldyBMKG8sZyxDKSxlKEkucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKHQpe2lmKHRoaXMucmVhc29uKXt0KHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKHQpOnRoaXMuX2xpc3RlbmVycz1bdF19dW5zdWJzY3JpYmUodCl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IGU9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YodCk7ZSE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGUsMSl9dG9BYm9ydFNpZ25hbCgpe2xldCB0PW5ldyBBYm9ydENvbnRyb2xsZXIsZT1JPT57dC5hYm9ydChJKX07cmV0dXJuIHRoaXMuc3Vic2NyaWJlKGUpLHQuc2lnbmFsLnVuc3Vic2NyaWJlPSgpPT50aGlzLnVuc3Vic2NyaWJlKGUpLHQuc2lnbmFsfXN0YXRpYyBzb3VyY2UoKXtsZXQgdDtyZXR1cm57dG9rZW46bmV3IEEoZnVuY3Rpb24ocil7dD1yfSksY2FuY2VsOnR9fX0sdGU9Z3Q7ZnVuY3Rpb24gaXQoQSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBBLmFwcGx5KG51bGwsZSl9fWZ1bmN0aW9uIHN0KEEpe3JldHVybiBpLmlzT2JqZWN0KEEpJiZBLmlzQXhpb3NFcnJvcj09PSEwfXZhciBudD17Q29udGludWU6MTAwLFN3aXRjaGluZ1Byb3RvY29sczoxMDEsUHJvY2Vzc2luZzoxMDIsRWFybHlIaW50czoxMDMsT2s6MjAwLENyZWF0ZWQ6MjAxLEFjY2VwdGVkOjIwMixOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246MjAzLE5vQ29udGVudDoyMDQsUmVzZXRDb250ZW50OjIwNSxQYXJ0aWFsQ29udGVudDoyMDYsTXVsdGlTdGF0dXM6MjA3LEFscmVhZHlSZXBvcnRlZDoyMDgsSW1Vc2VkOjIyNixNdWx0aXBsZUNob2ljZXM6MzAwLE1vdmVkUGVybWFuZW50bHk6MzAxLEZvdW5kOjMwMixTZWVPdGhlcjozMDMsTm90TW9kaWZpZWQ6MzA0LFVzZVByb3h5OjMwNSxVbnVzZWQ6MzA2LFRlbXBvcmFyeVJlZGlyZWN0OjMwNyxQZXJtYW5lbnRSZWRpcmVjdDozMDgsQmFkUmVxdWVzdDo0MDAsVW5hdXRob3JpemVkOjQwMSxQYXltZW50UmVxdWlyZWQ6NDAyLEZvcmJpZGRlbjo0MDMsTm90Rm91bmQ6NDA0LE1ldGhvZE5vdEFsbG93ZWQ6NDA1LE5vdEFjY2VwdGFibGU6NDA2LFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDo0MDcsUmVxdWVzdFRpbWVvdXQ6NDA4LENvbmZsaWN0OjQwOSxHb25lOjQxMCxMZW5ndGhSZXF1aXJlZDo0MTEsUHJlY29uZGl0aW9uRmFpbGVkOjQxMixQYXlsb2FkVG9vTGFyZ2U6NDEzLFVyaVRvb0xvbmc6NDE0LFVuc3VwcG9ydGVkTWVkaWFUeXBlOjQxNSxSYW5nZU5vdFNhdGlzZmlhYmxlOjQxNixFeHBlY3RhdGlvbkZhaWxlZDo0MTcsSW1BVGVhcG90OjQxOCxNaXNkaXJlY3RlZFJlcXVlc3Q6NDIxLFVucHJvY2Vzc2FibGVFbnRpdHk6NDIyLExvY2tlZDo0MjMsRmFpbGVkRGVwZW5kZW5jeTo0MjQsVG9vRWFybHk6NDI1LFVwZ3JhZGVSZXF1aXJlZDo0MjYsUHJlY29uZGl0aW9uUmVxdWlyZWQ6NDI4LFRvb01hbnlSZXF1ZXN0czo0MjksUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOjQzMSxVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczo0NTEsSW50ZXJuYWxTZXJ2ZXJFcnJvcjo1MDAsTm90SW1wbGVtZW50ZWQ6NTAxLEJhZEdhdGV3YXk6NTAyLFNlcnZpY2VVbmF2YWlsYWJsZTo1MDMsR2F0ZXdheVRpbWVvdXQ6NTA0LEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOjUwNSxWYXJpYW50QWxzb05lZ290aWF0ZXM6NTA2LEluc3VmZmljaWVudFN0b3JhZ2U6NTA3LExvb3BEZXRlY3RlZDo1MDgsTm90RXh0ZW5kZWQ6NTEwLE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOjUxMX07T2JqZWN0LmVudHJpZXMobnQpLmZvckVhY2goKFtBLHRdKT0+e250W3RdPUF9KTt2YXIgZWU9bnQ7ZnVuY3Rpb24gSWUoQSl7bGV0IHQ9bmV3IHNBKEEpLGU9dihzQS5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gaS5leHRlbmQoZSxzQS5wcm90b3R5cGUsdCx7YWxsT3duS2V5czohMH0pLGkuZXh0ZW5kKGUsdCxudWxsLHthbGxPd25LZXlzOiEwfSksZS5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIEllKGsoQSxyKSl9LGV9dmFyIHc9SWUoVik7dy5BeGlvcz1zQTt3LkNhbmNlbGVkRXJyb3I9TDt3LkNhbmNlbFRva2VuPXRlO3cuaXNDYW5jZWw9ckE7dy5WRVJTSU9OPWtBO3cudG9Gb3JtRGF0YT1NO3cuQXhpb3NFcnJvcj11O3cuQ2FuY2VsPXcuQ2FuY2VsZWRFcnJvcjt3LmFsbD1mdW5jdGlvbih0KXtyZXR1cm4gUHJvbWlzZS5hbGwodCl9O3cuc3ByZWFkPWl0O3cuaXNBeGlvc0Vycm9yPXN0O3cubWVyZ2VDb25maWc9azt3LkF4aW9zSGVhZGVycz1TO3cuZm9ybVRvSlNPTj1BPT5wQShpLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO3cuZ2V0QWRhcHRlcj1VQS5nZXRBZGFwdGVyO3cuSHR0cFN0YXR1c0NvZGU9ZWU7dy5kZWZhdWx0PXc7dmFyIGJBPXc7dmFye0F4aW9zOkJpLEF4aW9zRXJyb3I6YWksQ2FuY2VsZWRFcnJvcjpRaSxpc0NhbmNlbDpFaSxDYW5jZWxUb2tlbjpjaSxWRVJTSU9OOmZpLGFsbDpsaSxDYW5jZWw6dWksaXNBeGlvc0Vycm9yOkRpLHNwcmVhZDpkaSx0b0Zvcm1EYXRhOmhpLEF4aW9zSGVhZGVyczp5aSxIdHRwU3RhdHVzQ29kZTptaSxmb3JtVG9KU09OOndpLGdldEFkYXB0ZXI6cGksbWVyZ2VDb25maWc6U2l9PWJBO3ZhciBuQSxZLEJ0LEN0PXtlbnY6e2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6ZnVuY3Rpb24oQSl7QnQ9bmV3IFVpbnQ4QXJyYXkoWS5leHBvcnRzLm1lbW9yeS5idWZmZXIpfX19LEpBPWNsYXNze2luaXQoKXtyZXR1cm4gbkF8fCh0eXBlb2YgZmV0Y2g8InUiP25BPWZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL3dhc207YmFzZTY0LCIrcmUpLnRoZW4odD0+dC5hcnJheUJ1ZmZlcigpKS50aGVuKHQ9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHQsQ3QpKS50aGVuKHRoaXMuX2luaXQpOm5BPVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEJ1ZmZlci5mcm9tKHJlLCJiYXNlNjQiKSxDdCkudGhlbih0aGlzLl9pbml0KSxuQSl9X2luaXQodCl7WT10Lmluc3RhbmNlLEN0LmVudi5lbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoKDApfWRlY29kZSh0LGU9MCl7aWYoIVkpdGhyb3cgbmV3IEVycm9yKCJaU1RERGVjb2RlcjogQXdhaXQgLmluaXQoKSBiZWZvcmUgZGVjb2RpbmcuIik7bGV0IEk9dC5ieXRlTGVuZ3RoLHI9WS5leHBvcnRzLm1hbGxvYyhJKTtCdC5zZXQodCxyKSxlPWV8fE51bWJlcihZLmV4cG9ydHMuWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZShyLEkpKTtsZXQgbz1ZLmV4cG9ydHMubWFsbG9jKGUpLGc9WS5leHBvcnRzLlpTVERfZGVjb21wcmVzcyhvLGUscixJKSxDPUJ0LnNsaWNlKG8sbytnKTtyZXR1cm4gWS5leHBvcnRzLmZyZWUociksWS5leHBvcnRzLmZyZWUobyksQ319LHJlPSJBR0Z6YlFFQUFBQUJiZzVnQTM5L2Z3Ri9ZQUYvQVg5Z0FuOS9BR0FCZndCZ0JYOS9mMzkvQVg5Z0EzOS9md0JnQkg5L2YzOEJmMkFBQVg5Z0FuOS9BWDlnQjM5L2YzOS9mMzhCZjJBQ2YzOEJmbUFJZjM5L2YzOS9mMzhCZjJBRmYzOS9mMzhBWUE1L2YzOS9mMzkvZjM5L2YzOS9md0YvQWljQkEyVnVkaDlsYlhOamNtbHdkR1Z1WDI1dmRHbG1lVjl0WlcxdmNubGZaM0p2ZDNSb0FBTURJeUlIQUFBQkFRTUhBd0VBQ1FRQUJRRUlDQUVGQmdRRUJBTUdBQUFLQUFVTERBMEdCQVVCY0FFQkFRVUhBUUdBQW9DQUFnWUlBWDhCUVlDakJBc0hyZ0VMQm0xbGJXOXllUUlBQm0xaGJHeHZZd0FGQkdaeVpXVUFCZ3hhVTFSRVgybHpSWEp5YjNJQUVobGFVMVJFWDJacGJtUkVaV052YlhCeVpYTnpaV1JUYVhwbEFCd1BXbE5VUkY5a1pXTnZiWEJ5WlhOekFDSVpYMTlwYm1ScGNtVmpkRjltZFc1amRHbHZibDkwWVdKc1pRRUFFRjlmWlhKeWJtOWZiRzlqWVhScGIyNEFBUWx6ZEdGamExTmhkbVVBQnd4emRHRmphMUpsYzNSdmNtVUFDQXB6ZEdGamEwRnNiRzlqQUFrS2kvSUJJZ1VBUVlRZkN6TUJBWDhnQWdSQUlBQWhBd05BSUFNZ0FTMEFBRG9BQUNBRFFRRnFJUU1nQVVFQmFpRUJJQUpCQVdzaUFnMEFDd3NnQUFzcEFRRi9JQUlFUUNBQUlRTURRQ0FESUFFNkFBQWdBMEVCYWlFRElBSkJBV3NpQWcwQUN3c2dBQXRzQVFKL1FZQWZLQUlBSWdFZ0FFRUhha0Y0Y1NJQ2FpRUFBa0FnQWtFQUlBQWdBVTBiRFFBZ0FEOEFRUkIwU3dSQUlBQS9BRUVRZEd0Qi8vOERha0VRZGtBQVFYOUdCSDlCQUFWQkFCQUFRUUVMUlEwQkMwR0FIeUFBTmdJQUlBRVBDMEdFSDBFd05nSUFRWDhMdVNjQkMzOGpBRUVRYXlJS0pBQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCOUFGTkJFQkJpQjhvQWdBaUJrRVFJQUJCQzJwQmVIRWdBRUVMU1JzaUJVRURkaUlBZGlJQlFRTnhCRUFDUUNBQlFYOXpRUUZ4SUFCcUlnSkJBM1FpQVVHd0gyb2lBQ0FCUWJnZmFpZ0NBQ0lCS0FJSUlnUkdCRUJCaUI4Z0JrRitJQUozY1RZQ0FBd0JDeUFFSUFBMkFnd2dBQ0FFTmdJSUN5QUJRUWhxSVFBZ0FTQUNRUU4wSWdKQkEzSTJBZ1FnQVNBQ2FpSUJJQUVvQWdSQkFYSTJBZ1FNRHdzZ0JVR1FIeWdDQUNJSFRRMEJJQUVFUUFKQVFRSWdBSFFpQWtFQUlBSnJjaUFCSUFCMGNXZ2lBVUVEZENJQVFiQWZhaUlDSUFCQnVCOXFLQUlBSWdBb0FnZ2lCRVlFUUVHSUh5QUdRWDRnQVhkeElnWTJBZ0FNQVFzZ0JDQUNOZ0lNSUFJZ0JEWUNDQXNnQUNBRlFRTnlOZ0lFSUFBZ0JXb2lDQ0FCUVFOMElnRWdCV3NpQkVFQmNqWUNCQ0FBSUFGcUlBUTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRRkJuQjhvQWdBaEFnSi9JQVpCQVNBSFFRTjJkQ0lEY1VVRVFFR0lIeUFESUFaeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQXlBQklBSTJBZ2dnQXlBQ05nSU1JQUlnQVRZQ0RDQUNJQU0yQWdnTElBQkJDR29oQUVHY0h5QUlOZ0lBUVpBZklBUTJBZ0FNRHd0QmpCOG9BZ0FpQzBVTkFTQUxhRUVDZEVHNElXb29BZ0FpQWlnQ0JFRjRjU0FGYXlFRElBSWhBUU5BQWtBZ0FTZ0NFQ0lBUlFSQUlBRW9BaFFpQUVVTkFRc2dBQ2dDQkVGNGNTQUZheUlCSUFNZ0FTQURTU0lCR3lFRElBQWdBaUFCR3lFQ0lBQWhBUXdCQ3dzZ0FpZ0NHQ0VKSUFJZ0FpZ0NEQ0lFUndSQVFaZ2ZLQUlBR2lBQ0tBSUlJZ0FnQkRZQ0RDQUVJQUEyQWdnTURnc2dBa0VVYWlJQktBSUFJZ0JGQkVBZ0FpZ0NFQ0lBUlEwRElBSkJFR29oQVFzRFFDQUJJUWdnQUNJRVFSUnFJZ0VvQWdBaUFBMEFJQVJCRUdvaEFTQUVLQUlRSWdBTkFBc2dDRUVBTmdJQURBMExRWDhoQlNBQVFiOS9TdzBBSUFCQkMyb2lBRUY0Y1NFRlFZd2ZLQUlBSWdoRkRRQkJBQ0FGYXlFREFrQUNRQUpBQW45QkFDQUZRWUFDU1EwQUdrRWZJQVZCLy8vL0Iwc05BQm9nQlVFbUlBQkJDSFpuSWdCcmRrRUJjU0FBUVFGMGEwRSthZ3NpQjBFQ2RFRzRJV29vQWdBaUFVVUVRRUVBSVFBTUFRdEJBQ0VBSUFWQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQ0EwQUNRQ0FCS0FJRVFYaHhJQVZySWdZZ0EwOE5BQ0FCSVFRZ0JpSUREUUJCQUNFRElBRWhBQXdEQ3lBQUlBRW9BaFFpQmlBR0lBRWdBa0VkZGtFRWNXb29BaEFpQVVZYklBQWdCaHNoQUNBQ1FRRjBJUUlnQVEwQUN3c2dBQ0FFY2tVRVFFRUFJUVJCQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FHaEJBblJCdUNGcUtBSUFJUUFMSUFCRkRRRUxBMEFnQUNnQ0JFRjRjU0FGYXlJQ0lBTkpJUUVnQWlBRElBRWJJUU1nQUNBRUlBRWJJUVFnQUNnQ0VDSUJCSDhnQVFVZ0FDZ0NGQXNpQUEwQUN3c2dCRVVOQUNBRFFaQWZLQUlBSUFWclR3MEFJQVFvQWhnaEJ5QUVJQVFvQWd3aUFrY0VRRUdZSHlnQ0FCb2dCQ2dDQ0NJQUlBSTJBZ3dnQWlBQU5nSUlEQXdMSUFSQkZHb2lBU2dDQUNJQVJRUkFJQVFvQWhBaUFFVU5BeUFFUVJCcUlRRUxBMEFnQVNFR0lBQWlBa0VVYWlJQktBSUFJZ0FOQUNBQ1FSQnFJUUVnQWlnQ0VDSUFEUUFMSUFaQkFEWUNBQXdMQ3lBRlFaQWZLQUlBSWdSTkJFQkJuQjhvQWdBaEFBSkFJQVFnQldzaUFVRVFUd1JBSUFBZ0JXb2lBaUFCUVFGeU5nSUVJQUFnQkdvZ0FUWUNBQ0FBSUFWQkEzSTJBZ1FNQVFzZ0FDQUVRUU55TmdJRUlBQWdCR29pQVNBQktBSUVRUUZ5TmdJRVFRQWhBa0VBSVFFTFFaQWZJQUUyQWdCQm5COGdBallDQUNBQVFRaHFJUUFNRFFzZ0JVR1VIeWdDQUNJQ1NRUkFRWlFmSUFJZ0JXc2lBVFlDQUVHZ0gwR2dIeWdDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxSVFBTURRdEJBQ0VBSUFWQkwyb2lBd0ovUWVBaUtBSUFCRUJCNkNJb0FnQU1BUXRCN0NKQ2Z6Y0NBRUhrSWtLQW9JQ0FnSUFFTndJQVFlQWlJQXBCREdwQmNIRkIyS3JWcWdWek5nSUFRZlFpUVFBMkFnQkJ4Q0pCQURZQ0FFR0FJQXNpQVdvaUJrRUFJQUZySWdoeElnRWdCVTBOREVIQUlpZ0NBQ0lFQkVCQnVDSW9BZ0FpQnlBQmFpSUpJQWROSUFRZ0NVbHlEUTBMQWtCQnhDSXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFR2dIeWdDQUNJRUJFQkJ5Q0loQUFOQUlBUWdBQ2dDQUNJSFR3UkFJQWNnQUNnQ0JHb2dCRXNOQXdzZ0FDZ0NDQ0lBRFFBTEMwRUFFQVFpQWtGL1JnMERJQUVoQmtIa0lpZ0NBQ0lBUVFGcklnUWdBbkVFUUNBQklBSnJJQUlnQkdwQkFDQUFhM0ZxSVFZTElBVWdCazhOQTBIQUlpZ0NBQ0lBQkVCQnVDSW9BZ0FpQkNBR2FpSUlJQVJOSUFBZ0NFbHlEUVFMSUFZUUJDSUFJQUpIRFFFTUJRc2dCaUFDYXlBSWNTSUdFQVFpQWlBQUtBSUFJQUFvQWdScVJnMEJJQUloQUFzZ0FFRi9SZzBCSUFWQk1Hb2dCazBFUUNBQUlRSU1CQXRCNkNJb0FnQWlBaUFESUFacmFrRUFJQUpyY1NJQ0VBUkJmMFlOQVNBQ0lBWnFJUVlnQUNFQ0RBTUxJQUpCZjBjTkFndEJ4Q0pCeENJb0FnQkJCSEkyQWdBTElBRVFCQ0lDUVg5R1FRQVFCQ0lBUVg5R2NpQUFJQUpOY2cwRklBQWdBbXNpQmlBRlFTaHFUUTBGQzBHNElrRzRJaWdDQUNBR2FpSUFOZ0lBUWJ3aUtBSUFJQUJKQkVCQnZDSWdBRFlDQUFzQ1FFR2dIeWdDQUNJREJFQkJ5Q0loQUFOQUlBSWdBQ2dDQUNJQklBQW9BZ1FpQkdwR0RRSWdBQ2dDQ0NJQURRQUxEQVFMUVpnZktBSUFJZ0JCQUNBQUlBSk5HMFVFUUVHWUh5QUNOZ0lBQzBFQUlRQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFhZ2ZRWDgyQWdCQnJCOUI0Q0lvQWdBMkFnQkIxQ0pCQURZQ0FBTkFJQUJCQTNRaUFVRzRIMm9nQVVHd0gyb2lCRFlDQUNBQlFid2ZhaUFFTmdJQUlBQkJBV29pQUVFZ1J3MEFDMEdVSHlBR1FTaHJJZ0JCZUNBQ2EwRUhjU0lCYXlJRU5nSUFRYUFmSUFFZ0Ftb2lBVFlDQUNBQklBUkJBWEkyQWdRZ0FDQUNha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQVFMSUFJZ0EwMGdBU0FEUzNJTkFpQUFLQUlNUVFoeERRSWdBQ0FFSUFacU5nSUVRYUFmSUFOQmVDQURhMEVIY1NJQWFpSUJOZ0lBUVpRZlFaUWZLQUlBSUFacUlnSWdBR3NpQURZQ0FDQUJJQUJCQVhJMkFnUWdBaUFEYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFNTFFRQWhCQXdLQzBFQUlRSU1DQXRCbUI4b0FnQWdBa3NFUUVHWUh5QUNOZ0lBQ3lBQ0lBWnFJUUZCeUNJaEFBSkFBa0FDUUFOQUlBRWdBQ2dDQUVjRVFDQUFLQUlJSWdBTkFRd0NDd3NnQUMwQURFRUljVVVOQVF0QnlDSWhBQU5BSUFNZ0FDZ0NBQ0lCVHdSQUlBRWdBQ2dDQkdvaUJDQURTdzBEQ3lBQUtBSUlJUUFNQUFzQUN5QUFJQUkyQWdBZ0FDQUFLQUlFSUFacU5nSUVJQUpCZUNBQ2EwRUhjV29pQnlBRlFRTnlOZ0lFSUFGQmVDQUJhMEVIY1dvaUJpQUZJQWRxSWdWcklRQWdBeUFHUmdSQVFhQWZJQVUyQWdCQmxCOUJsQjhvQWdBZ0FHb2lBRFlDQUNBRklBQkJBWEkyQWdRTUNBdEJuQjhvQWdBZ0JrWUVRRUdjSHlBRk5nSUFRWkFmUVpBZktBSUFJQUJxSWdBMkFnQWdCU0FBUVFGeU5nSUVJQUFnQldvZ0FEWUNBQXdJQ3lBR0tBSUVJZ05CQTNGQkFVY05CaUFEUVhoeElRa2dBMEgvQVUwRVFDQUdLQUlNSWdFZ0JpZ0NDQ0lDUmdSQVFZZ2ZRWWdmS0FJQVFYNGdBMEVEZG5keE5nSUFEQWNMSUFJZ0FUWUNEQ0FCSUFJMkFnZ01CZ3NnQmlnQ0dDRUlJQVlnQmlnQ0RDSUNSd1JBSUFZb0FnZ2lBU0FDTmdJTUlBSWdBVFlDQ0F3RkN5QUdRUlJxSWdFb0FnQWlBMFVFUUNBR0tBSVFJZ05GRFFRZ0JrRVFhaUVCQ3dOQUlBRWhCQ0FESWdKQkZHb2lBU2dDQUNJRERRQWdBa0VRYWlFQklBSW9BaEFpQXcwQUN5QUVRUUEyQWdBTUJBdEJsQjhnQmtFb2F5SUFRWGdnQW10QkIzRWlBV3NpQ0RZQ0FFR2dIeUFCSUFKcUlnRTJBZ0FnQVNBSVFRRnlOZ0lFSUFBZ0FtcEJLRFlDQkVHa0gwSHdJaWdDQURZQ0FDQURJQVJCSnlBRWEwRUhjV3BCTDJzaUFDQUFJQU5CRUdwSkd5SUJRUnMyQWdRZ0FVSFFJaWtDQURjQ0VDQUJRY2dpS1FJQU53SUlRZEFpSUFGQkNHbzJBZ0JCekNJZ0JqWUNBRUhJSWlBQ05nSUFRZFFpUVFBMkFnQWdBVUVZYWlFQUEwQWdBRUVITmdJRUlBQkJDR29nQUVFRWFpRUFJQVJKRFFBTElBRWdBMFlOQUNBQklBRW9BZ1JCZm5FMkFnUWdBeUFCSUFOcklnSkJBWEkyQWdRZ0FTQUNOZ0lBSUFKQi93Rk5CRUFnQWtGNGNVR3dIMm9oQUFKL1FZZ2ZLQUlBSWdGQkFTQUNRUU4yZENJQ2NVVUVRRUdJSHlBQklBSnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEFTQUFJQU0yQWdnZ0FTQUROZ0lNSUFNZ0FEWUNEQ0FESUFFMkFnZ01BUXRCSHlFQUlBSkIvLy8vQjAwRVFDQUNRU1lnQWtFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUlRQUxJQU1nQURZQ0hDQURRZ0EzQWhBZ0FFRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlCRUVCSUFCMElnWnhSUVJBUVl3ZklBUWdCbkkyQWdBZ0FTQUROZ0lBREFFTElBSkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJBTkFJQVFpQVNnQ0JFRjRjU0FDUmcwQ0lBQkJIWFloQkNBQVFRRjBJUUFnQVNBRVFRUnhhaUlHS0FJUUlnUU5BQXNnQmlBRE5nSVFDeUFESUFFMkFoZ2dBeUFETmdJTUlBTWdBellDQ0F3QkN5QUJLQUlJSWdBZ0F6WUNEQ0FCSUFNMkFnZ2dBMEVBTmdJWUlBTWdBVFlDRENBRElBQTJBZ2dMUVpRZktBSUFJZ0FnQlUwTkFFR1VIeUFBSUFWcklnRTJBZ0JCb0I5Qm9COG9BZ0FpQUNBRmFpSUNOZ0lBSUFJZ0FVRUJjallDQkNBQUlBVkJBM0kyQWdRZ0FFRUlhaUVBREFnTFFZUWZRVEEyQWdCQkFDRUFEQWNMUVFBaEFnc2dDRVVOQUFKQUlBWW9BaHdpQVVFQ2RFRzRJV29pQkNnQ0FDQUdSZ1JBSUFRZ0FqWUNBQ0FDRFFGQmpCOUJqQjhvQWdCQmZpQUJkM0UyQWdBTUFnc2dDRUVRUVJRZ0NDZ0NFQ0FHUmh0cUlBSTJBZ0FnQWtVTkFRc2dBaUFJTmdJWUlBWW9BaEFpQVFSQUlBSWdBVFlDRUNBQklBSTJBaGdMSUFZb0FoUWlBVVVOQUNBQ0lBRTJBaFFnQVNBQ05nSVlDeUFBSUFscUlRQWdCaUFKYWlJR0tBSUVJUU1MSUFZZ0EwRitjVFlDQkNBRklBQkJBWEkyQWdRZ0FDQUZhaUFBTmdJQUlBQkIvd0ZOQkVBZ0FFRjRjVUd3SDJvaEFRSi9RWWdmS0FJQUlnSkJBU0FBUVFOMmRDSUFjVVVFUUVHSUh5QUFJQUp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFVMkFnZ2dBQ0FGTmdJTUlBVWdBVFlDRENBRklBQTJBZ2dNQVF0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFVZ0F6WUNIQ0FGUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQWtFQklBTjBJZ1J4UlFSQVFZd2ZJQUlnQkhJMkFnQWdBU0FGTmdJQURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBZ05BSUFJaUFTZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFpQURRUUYwSVFNZ0FTQUNRUVJ4YWlJRUtBSVFJZ0lOQUFzZ0JDQUZOZ0lRQ3lBRklBRTJBaGdnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFCS0FJSUlnQWdCVFlDRENBQklBVTJBZ2dnQlVFQU5nSVlJQVVnQVRZQ0RDQUZJQUEyQWdnTElBZEJDR29oQUF3Q0N3SkFJQWRGRFFBQ1FDQUVLQUljSWdCQkFuUkJ1Q0ZxSWdFb0FnQWdCRVlFUUNBQklBSTJBZ0FnQWcwQlFZd2ZJQWhCZmlBQWQzRWlDRFlDQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQVJHRzJvZ0FqWUNBQ0FDUlEwQkN5QUNJQWMyQWhnZ0JDZ0NFQ0lBQkVBZ0FpQUFOZ0lRSUFBZ0FqWUNHQXNnQkNnQ0ZDSUFSUTBBSUFJZ0FEWUNGQ0FBSUFJMkFoZ0xBa0FnQTBFUFRRUkFJQVFnQXlBRmFpSUFRUU55TmdJRUlBQWdCR29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQVFnQlVFRGNqWUNCQ0FFSUFWcUlnSWdBMEVCY2pZQ0JDQUNJQU5xSUFNMkFnQWdBMEgvQVUwRVFDQURRWGh4UWJBZmFpRUFBbjlCaUI4b0FnQWlBVUVCSUFOQkEzWjBJZ054UlFSQVFZZ2ZJQUVnQTNJMkFnQWdBQXdCQ3lBQUtBSUlDeUVCSUFBZ0FqWUNDQ0FCSUFJMkFnd2dBaUFBTmdJTUlBSWdBVFlDQ0F3QkMwRWZJUUFnQTBILy8vOEhUUVJBSUFOQkppQURRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0FpQUFOZ0ljSUFKQ0FEY0NFQ0FBUVFKMFFiZ2hhaUVCQWtBQ1FDQUlRUUVnQUhRaUJuRkZCRUJCakI4Z0JpQUljallDQUNBQklBSTJBZ0FNQVFzZ0EwRVpJQUJCQVhaclFRQWdBRUVmUnh0MElRQWdBU2dDQUNFRkEwQWdCU0lCS0FJRVFYaHhJQU5HRFFJZ0FFRWRkaUVHSUFCQkFYUWhBQ0FCSUFaQkJIRnFJZ1lvQWhBaUJRMEFDeUFHSUFJMkFoQUxJQUlnQVRZQ0dDQUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBRW9BZ2dpQUNBQ05nSU1JQUVnQWpZQ0NDQUNRUUEyQWhnZ0FpQUJOZ0lNSUFJZ0FEWUNDQXNnQkVFSWFpRUFEQUVMQWtBZ0NVVU5BQUpBSUFJb0Fod2lBRUVDZEVHNElXb2lBU2dDQUNBQ1JnUkFJQUVnQkRZQ0FDQUVEUUZCakI4Z0MwRitJQUIzY1RZQ0FBd0NDeUFKUVJCQkZDQUpLQUlRSUFKR0cyb2dCRFlDQUNBRVJRMEJDeUFFSUFrMkFoZ2dBaWdDRUNJQUJFQWdCQ0FBTmdJUUlBQWdCRFlDR0FzZ0FpZ0NGQ0lBUlEwQUlBUWdBRFlDRkNBQUlBUTJBaGdMQWtBZ0EwRVBUUVJBSUFJZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQW1vaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFJZ0JVRURjallDQkNBQ0lBVnFJZ1FnQTBFQmNqWUNCQ0FESUFScUlBTTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRQkJuQjhvQWdBaEFRSi9RUUVnQjBFRGRuUWlCU0FHY1VVRVFFR0lIeUFGSUFaeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQmlBQUlBRTJBZ2dnQmlBQk5nSU1JQUVnQURZQ0RDQUJJQVkyQWdnTFFad2ZJQVEyQWdCQmtCOGdBellDQUFzZ0FrRUlhaUVBQ3lBS1FSQnFKQUFnQUF2U0N3RUhmd0pBSUFCRkRRQWdBRUVJYXlJQ0lBQkJCR3NvQWdBaUFVRjRjU0lBYWlFRkFrQWdBVUVCY1EwQUlBRkJBM0ZGRFFFZ0FpQUNLQUlBSWdGcklnSkJtQjhvQWdCSkRRRWdBQ0FCYWlFQUFrQUNRRUdjSHlnQ0FDQUNSd1JBSUFGQi93Rk5CRUFnQVVFRGRpRUVJQUlvQWd3aUFTQUNLQUlJSWdOR0JFQkJpQjlCaUI4b0FnQkJmaUFFZDNFMkFnQU1CUXNnQXlBQk5nSU1JQUVnQXpZQ0NBd0VDeUFDS0FJWUlRWWdBaUFDS0FJTUlnRkhCRUFnQWlnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBSkJGR29pQkNnQ0FDSURSUVJBSUFJb0FoQWlBMFVOQWlBQ1FSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZLQUlFSWdGQkEzRkJBMGNOQWtHUUh5QUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0JTQUFOZ0lBRHd0QkFDRUJDeUFHUlEwQUFrQWdBaWdDSENJRFFRSjBRYmdoYWlJRUtBSUFJQUpHQkVBZ0JDQUJOZ0lBSUFFTkFVR01IMEdNSHlnQ0FFRitJQU4zY1RZQ0FBd0NDeUFHUVJCQkZDQUdLQUlRSUFKR0cyb2dBVFlDQUNBQlJRMEJDeUFCSUFZMkFoZ2dBaWdDRUNJREJFQWdBU0FETmdJUUlBTWdBVFlDR0FzZ0FpZ0NGQ0lEUlEwQUlBRWdBellDRkNBRElBRTJBaGdMSUFJZ0JVOE5BQ0FGS0FJRUlnRkJBWEZGRFFBQ1FBSkFBa0FDUUNBQlFRSnhSUVJBUWFBZktBSUFJQVZHQkVCQm9COGdBallDQUVHVUgwR1VIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1Fad2ZLQUlBUncwR1FaQWZRUUEyQWdCQm5COUJBRFlDQUE4TFFad2ZLQUlBSUFWR0JFQkJuQjhnQWpZQ0FFR1FIMEdRSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQVBDeUFCUVhoeElBQnFJUUFnQVVIL0FVMEVRQ0FCUVFOMklRUWdCU2dDRENJQklBVW9BZ2dpQTBZRVFFR0lIMEdJSHlnQ0FFRitJQVIzY1RZQ0FBd0ZDeUFESUFFMkFnd2dBU0FETmdJSURBUUxJQVVvQWhnaEJpQUZJQVVvQWd3aUFVY0VRRUdZSHlnQ0FCb2dCU2dDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFWQkZHb2lCQ2dDQUNJRFJRUkFJQVVvQWhBaUEwVU5BaUFGUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRklBRkJmbkUyQWdRZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FBd0RDMEVBSVFFTElBWkZEUUFDUUNBRktBSWNJZ05CQW5SQnVDRnFJZ1FvQWdBZ0JVWUVRQ0FFSUFFMkFnQWdBUTBCUVl3ZlFZd2ZLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBRktBSVFJZ01FUUNBQklBTTJBaEFnQXlBQk5nSVlDeUFGS0FJVUlnTkZEUUFnQVNBRE5nSVVJQU1nQVRZQ0dBc2dBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQ0FDUVp3ZktBSUFSdzBBUVpBZklBQTJBZ0FQQ3lBQVFmOEJUUVJBSUFCQmVIRkJzQjlxSVFFQ2YwR0lIeWdDQUNJRFFRRWdBRUVEZG5RaUFIRkZCRUJCaUI4Z0FDQURjallDQUNBQkRBRUxJQUVvQWdnTElRQWdBU0FDTmdJSUlBQWdBallDRENBQ0lBRTJBZ3dnQWlBQU5nSUlEd3RCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQUlnQXpZQ0hDQUNRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0FDUUVHTUh5Z0NBQ0lFUVFFZ0EzUWlCM0ZGQkVCQmpCOGdCQ0FIY2pZQ0FDQUJJQUkyQWdBZ0FpQUJOZ0lZREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFRTkFJQUVpQkNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQVNBRFFRRjBJUU1nQkNBQlFRUnhhaUlIUVJCcUtBSUFJZ0VOQUFzZ0J5QUNOZ0lRSUFJZ0JEWUNHQXNnQWlBQ05nSU1JQUlnQWpZQ0NBd0JDeUFFS0FJSUlnQWdBallDRENBRUlBSTJBZ2dnQWtFQU5nSVlJQUlnQkRZQ0RDQUNJQUEyQWdnTFFhZ2ZRYWdmS0FJQVFRRnJJZ0JCZnlBQUd6WUNBQXNMQkFBakFBc0dBQ0FBSkFBTEVBQWpBQ0FBYTBGd2NTSUFKQUFnQUF0S0FRRi9JQUFnQVVrRVFDQUFJQUVnQWhBQ0R3c2dBZ1JBSUFBZ0Ftb2hBeUFCSUFKcUlRRURRQ0FEUVFGcklnTWdBVUVCYXlJQkxRQUFPZ0FBSUFKQkFXc2lBZzBBQ3dzZ0FBdjlEZ0lSZndGK0l3QkJNR3NpQnlRQVFiaC9JUWdDUUNBRlJRMEFJQVFzQUFBaUNVSC9BWEVoQ3dKQUlBbEJBRWdFUUNBTFFmNEFhMEVCZGlJR0lBVlBEUUpCYkNFSUlBdEIvd0JySWd0Qi93RkxEUUlnQkVFQmFpRUlRUUFoQlFOQUlBVWdDMDhFUUNBTElRZ2dCaUVMREFNRklBQWdCV29nQ0NBRlFRRjJhaUlFTFFBQVFRUjJPZ0FBSUFBZ0JVRUJjbW9nQkMwQUFFRVBjVG9BQUNBRlFRSnFJUVVNQVFzQUN3QUxJQVVnQzAwTkFTQUhRZjhCTmdJRUlBWWdCMEVFYWlBSFFRaHFJQVJCQVdvaURpQUxFQXdpQkVHSWYwc0VRQ0FFSVFnTUFndEJWQ0VJSUFjb0FnZ2lFRUVHU3cwQklBY29BZ1FpRVVFQmRDSUpRUUpxclVJQklCQ3RoaUlZUVFFZ0VIUWlEVUVCYWlJRnJVSUNobng4UWd0OFF2ei8vLy8vLy8vLy93Q0RRdVFDVmcwQlFWSWhDQ0FSUWY4QlN3MEJJQTFCZjNOQkFuUkI1QUpxclNBUlFRRnFJaFZCQVhTdElCaDhRZ2g4VkEwQklBc2dCR3NoRmlBRUlBNXFJUmNnQmtHQUJHb2lFaUFGUVFKMGFpSVJJQWxxUVFKcUlRNGdCa0dFQkdvaEUwR0FnQUlnRUhSQkVIWWhDVUVBSVFWQkFTRVBJQTFCQVdzaUZDRUtBMEFnQlNBVlJrVUVRQUpBSUFZZ0JVRUJkQ0lJYWk4QkFDSUVRZi8vQTBZRVFDQVRJQXBCQW5ScUlBVTZBQUlnQ2tFQmF5RUtRUUVoQkF3QkN5QVBRUUFnQ1NBRXdVb2JJUThMSUFnZ0VXb2dCRHNCQUNBRlFRRnFJUVVNQVFzTElBWWdEenNCZ2dRZ0JpQVFPd0dBQkFKQUlBb2dGRVlFUUNBTlFRTjJJUWhDQUNFWVFRQWhEd05BSUF3Z0ZVWUVRQ0FJSUExQkFYWnFRUU5xSWdsQkFYUWhDRUVBSVFSQkFDRUtBMEJCQUNFRklBb2dEVThOQkFOQUlBVkJBa1pGQkVBZ0V5QUZJQWxzSUFScUlCUnhRUUowYWlBT0lBVWdDbXBxTFFBQU9nQUNJQVZCQVdvaEJRd0JDd3NnQ2tFQ2FpRUtJQVFnQ0dvZ0ZIRWhCQXdBQ3dBRklBWWdERUVCZEdvdUFRQWhDU0FPSUE5cUlnUWdHRGNBQUVFSUlRVURRQ0FGSUFsT1JRUkFJQVFnQldvZ0dEY0FBQ0FGUVFocUlRVU1BUXNMSUJoQ2dZS0VpSkNnd0lBQmZDRVlJQXhCQVdvaERDQUpJQTlxSVE4TUFRc0FDd0FMSUExQkEzWWdEVUVCZG1wQkEyb2hDRUVBSVFVRFFDQU1JQlZHUlFSQVFRQWhDU0FHSUF4QkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FKUmtVRVFDQVRJQVZCQW5ScUlBdzZBQUlEUUNBRklBaHFJQlJ4SWdVZ0Nrc05BQXNnQ1VFQmFpRUpEQUVMQ3lBTVFRRnFJUXdNQVFzTFFYOGhDQ0FGRFFJTElCQkJBV29oQ0VFQUlRVURRQ0FGSUExR1JRUkFJQkVnRXlBRlFRSjBhaUlPTFFBQ1FRRjBhaUlFSUFRdkFRQWlDVUVCYWpzQkFDQU9JQWdnQ1dkQllITnFJZ1E2QUFNZ0RpQUpJQVIwSUExck93RUFJQVZCQVdvaEJRd0JDd3NDUUFKQUlBWXZBWUlFQkVBZ0IwRWNhaUlFSUJjZ0ZoQU5JZ2hCaUg5TERRSWdCMEVVYWlBRUlCSVFEaUFIUVF4cUlBUWdFaEFPUVFBaEJRTkFJQWRCSEdvaUJCQVBJQVZCK3dGTGNnMENJQUFnQldvaUJpQUhRUlJxSUFRUUVEb0FBQ0FHSUFkQkRHb2dCQkFRT2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVU1Bd1VnQUNBRWFpQUhRUlJxSUFkQkhHb2lCQkFRT2dBQUlBWWdCMEVNYWlBRUVCQTZBQU1nQlVFRWFpRUZEQUVMQUFzQUN5QUhRUnhxSWdRZ0Z5QVdFQTBpQ0VHSWYwc05BU0FIUVJScUlBUWdFaEFPSUFkQkRHb2dCQ0FTRUE1QkFDRUZBMEFnQjBFY2FpSUVFQThnQlVIN0FVdHlSUVJBSUFBZ0JXb2lCaUFIUVJScUlBUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVGSUFBZ0JHb2dCMEVVYWlBSFFSeHFJZ1FRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FESUFWQkJHb2hCUXdDQ3dzTEFuOERRRUc2ZnlFSUlBVkIvUUZMRFFNZ0FDQUZhaUlHSUFkQkZHb2dCMEVjYWlJSkVCRTZBQUFnQmtFQmFpRUVJQWtRRDBFRFJnUkFJQWRCREdvaENFRUNEQUlMSUFWQi9BRkxEUU1nQmlBSFFReHFJQWRCSEdvaUJCQVJPZ0FCSUFWQkFtb2hCU0FFRUE5QkEwY05BQXNnQUNBRmFpRUVJQWRCRkdvaENFRURDeUFFSUFnZ0IwRWNhaEFST2dBQUlBWnFJQUJySVFnTUFRc0Nmd05BUWJwL0lRZ2dCVUg5QVVzTkFpQUFJQVZxSWdZZ0IwRVVhaUFIUVJ4cUlna1FFRG9BQUNBR1FRRnFJUVFnQ1JBUFFRTkdCRUFnQjBFTWFpRUlRUUlNQWdzZ0JVSDhBVXNOQWlBR0lBZEJER29nQjBFY2FpSUVFQkE2QUFFZ0JVRUNhaUVGSUFRUUQwRURSdzBBQ3lBQUlBVnFJUVFnQjBFVWFpRUlRUU1MSUFRZ0NDQUhRUnhxRUJBNkFBQWdCbW9nQUdzaENBc2dDRUdJZjBzTkFRc2dDQ0VFUVFBaEJTQUJRUUJCTkJBRElRbEJBQ0VLQTBBZ0JDQUZSd1JBSUFBZ0JXb2lCaTBBQUNJQlFRdExCRUJCYkNFSURBTUZJQWtnQVVFQ2RHb2lBU0FCS0FJQVFRRnFOZ0lBSUFWQkFXb2hCVUVCSUFZdEFBQjBRUUYxSUFwcUlRb01BZ3NBQ3d0QmJDRUlJQXBGRFFBZ0NtY2lCVUVmY3lJQlFRdExEUUFnQTBFZ0lBVnJOZ0lBUVFGQkFpQUJkQ0FLYXlJRFowRWZjeUlCZENBRFJ3MEFJQUFnQkdvZ0FVRUJhaUlBT2dBQUlBa2dBRUVDZEdvaUFDQUFLQUlBUVFGcU5nSUFJQWtvQWdRaUFFRUNTU0FBUVFGeGNnMEFJQUlnQkVFQmFqWUNBQ0FMUVFGcUlRZ0xJQWRCTUdva0FDQUlDNkFGQVF4L0l3QkJFR3NpRENRQUFuOGdCRUVIVFFSQUlBeENBRGNEQ0NBTVFRaHFJZ1VnQXlBRUVBSWFRV3dnQUNBQklBSWdCVUVJRUF3aUFDQUFJQVJMR3lBQUlBQkJpWDlKR3d3QkN5QUFRUUFnQVNnQ0FFRUJhaUlOUVFGMEVBTWhEMEZVSUFNb0FBQWlCa0VQY1NJQVFRcExEUUFhSUFJZ0FFRUZhallDQUNBRElBUnFJZ0pCQkdzaEJ5QUNRUWRySVFzZ0FFRUdhaUVPUVFRaEFpQUdRUVIySVFWQklDQUFkQ0lJUVFGeUlRbEJBQ0VBUVFFaEJpQURJUVFEUUFKQUlBWkJBWEZGQkVBRFFDQUZRWDl6UVlDQWdJQjRjbWdpQmtFWVNVVUVRQ0FBUVNScUlRQWdCQ0FMVFFSL0lBUkJBMm9GSUFRZ0MydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xJQUlnQmtFZWNTSUtha0VDYWlFQ0lBWkJBWFpCQTJ3Z0FHb2dCU0FLZGtFRGNXb2lBQ0FOVHcwQkFuOGdCQ0FMU3lBQ1FRTjJJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBUWdCMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVUxJQVVnQ0VFQmEzRWlCaUFJUVFGMFFRRnJJZ29nQ1dzaUVFa0VmeUFPUVFGckJTQUZJQXB4SWdVZ0VFRUFJQVVnQ0U0YmF5RUdJQTRMSVFVZ0R5QUFRUUYwYWlBR1FRRnJJZ283QVFBZ0FFRUJhaUVBSUFJZ0JXb2hBaUFJUVFFZ0Jtc2dDaUFHUVFCS0d5QUphaUlKU2dSQUlBbEJBa2dOQVVFZ0lBbG5JZ1ZySVE1QkFTQUZRUjl6ZENFSUN5QUFJQTFQRFFBZ0NrRUFSeUVHQW44Z0JDQUxTeUFDUVFOMUlBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFJZ0JDQUhhMEVEZEdwQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xRV3dnQ1VFQlJ3MEFHa0ZRSUFBZ0RVc05BQnBCYkNBQ1FTQktEUUFhSUFFZ0FFRUJhellDQUNBRUlBSkJCMnBCQTNWcUlBTnJDeUFNUVJCcUpBQUw4Z0VCQVg4Z0FrVUVRQ0FBUWdBM0FnQWdBRUVBTmdJUUlBQkNBRGNDQ0VHNGZ3OExJQUFnQVRZQ0RDQUFJQUZCQkdvMkFoQWdBa0VFVHdSQUlBQWdBU0FDYWlJQlFRUnJJZ00yQWdnZ0FDQURLQUFBTmdJQUlBRkJBV3N0QUFBaUFRUkFJQUFnQVdkQkYyczJBZ1FnQWc4TElBQkJBRFlDQkVGL0R3c2dBQ0FCTmdJSUlBQWdBUzBBQUNJRE5nSUFBa0FDUUFKQUlBSkJBbXNPQWdFQUFnc2dBQ0FCTFFBQ1FSQjBJQU55SWdNMkFnQUxJQUFnQVMwQUFVRUlkQ0FEYWpZQ0FBc2dBU0FDYWtFQmF5MEFBQ0lCUlFSQUlBQkJBRFlDQkVGc0R3c2dBQ0FCWnlBQ1FRTjBhMEVKYWpZQ0JDQUNDMFFCQW44Z0FTQUNMd0VBSWdNZ0FTZ0NCR29pQkRZQ0JDQUFJQU5CQW5SQm9CMXFLQUlBSUFFb0FnQkJBQ0FFYTNaeE5nSUFJQUVRRHhvZ0FDQUNRUVJxTmdJRUM1OEJBUVIvUVFNaEFTQUFLQUlFSWdKQklFMEVRQ0FBS0FJSUlnRWdBQ2dDRUU4RVFDQUFJQUpCQjNFMkFnUWdBQ0FCSUFKQkEzWnJJZ0kyQWdnZ0FDQUNLQUFBTmdJQVFRQVBDeUFBS0FJTUlnTWdBVVlFUUVFQlFRSWdBa0VnU1JzUEN5QUFJQUVnQVNBRGF5QUNRUU4ySWdRZ0FTQUVheUFEU1NJQkd5SURheUlFTmdJSUlBQWdBaUFEUVFOMGF6WUNCQ0FBSUFRb0FBQTJBZ0FMSUFFTFNBRUVmeUFBS0FJRUlBQW9BZ0JCQW5ScUlnSXRBQUlnQWk4QkFDRUVJQUVnQVNnQ0JDSUZJQUl0QUFNaUFtbzJBZ1FnQUNBRUlBRW9BZ0FnQlhSQkFDQUNhM1pxTmdJQUMxSUJCSDhnQUNnQ0JDQUFLQUlBUVFKMGFpSUNMUUFDSUFJdkFRQWhCQ0FCSUFJdEFBTWlBaUFCS0FJRWFpSUZOZ0lFSUFBZ0JDQUNRUUowUWFBZGFpZ0NBQ0FCS0FJQVFRQWdCV3QyY1dvMkFnQUxDQUFnQUVHSWYwc0xHZ0FnQUFSQUlBRUVRQ0FDSUFBZ0FSRUNBQThMSUFBUUJnc0xwZ2dDRFg4QmZpTUFRUkJySWdra0FDQUpRUUEyQWd3Z0NVRUFOZ0lJQW44Q1FDQURRZWdKYWlBRElBbEJDR29nQ1VFTWFpQUJJQUlnQTBHQUFXb1FDeUlQUVloL1N3MEFRVlFnQ1NnQ0RDSUVJQUFvQWdBaUFVSC9BWEZCQVdwTERRRWFJQUJCQkdvaEN5QUFJQUZCLzRHQWVIRWdCRUVRZEVHQWdQd0hjWEkyQWdCQmZ5QUVJQVJCQUVnYlFRRnFJUUJCQUNFQklBa29BZ2doQlVFQUlRSURRQ0FBSUFKR0JFQWdCVUVEYXlFQlFRQWhBQU5BQWtCQkFDRUNJQUFnQVU0RVFBTkFJQUFnQlU0TkFpQURJQUFnQTJwQjZBbHFMUUFBUVFKMGFrRkFheUlCSUFFb0FnQWlBVUVCYWpZQ0FDQUJJQU5xSUFBNkFPZ0hJQUJCQVdvaEFBd0FDd0FGQTBBZ0FrRUVSa1VFUUNBRElBTWdBQ0FDYWlJSGFrSG9DV290QUFCQkFuUnFRVUJySWdnZ0NDZ0NBQ0lJUVFGcU5nSUFJQU1nQ0dvZ0J6b0E2QWNnQWtFQmFpRUNEQUVMQ3lBQVFRUnFJUUFNQWdzQUN3c2dCRUVCYWlFT0lBTW9BZ0FoQjBFQUlRQkJBU0VJQTBBZ0NDQU9SZzBESUE0Z0NHc2hCQ0FESUFoQkFuUnFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQkJBU0FJZEVFQmRTSU5RUUZyRGdnQUFRUUNCQVFFQXdRTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBQUlRRURRQ0FDSUFaR0RRVWdBeUFDSUFkcWFpMEE2QWNoQ2lBTElBRkJBWFJxSWd3Z0JEb0FBU0FNSUFvNkFBQWdBa0VCYWlFQ0lBRkJBV29oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaENpQUFJUUVEUUNBQ0lBcEdEUVFnQ3lBQlFRRjBhaUlHSUFNZ0FpQUhhbW90QU9nSElndzZBQUlnQmlBRU9nQUJJQVlnRERvQUFDQUdJQVE2QUFNZ0FrRUJhaUVDSUFGQkFtb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBRVFRaDBRWUQrQTNFaEJDQUFJUUVEUUNBQ0lBWkdEUU1nQ3lBQlFRRjBhaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitOd0FBSUFKQkFXb2hBaUFCUVFScUlRRU1BQXNBQzBFQUlRSWdCVUVBSUFWQkFFb2JJUVlnQkVFSWRFR0EvZ054SVFRZ0FDRUJBMEFnQWlBR1JnMENJQXNnQVVFQmRHb2lDaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJaEUzQUFnZ0NpQVJOd0FBSUFKQkFXb2hBaUFCUVFocUlRRU1BQXNBQzBFQUlRRWdCVUVBSUFWQkFFb2JJUW9nQkVFSWRFR0EvZ054SVF3Z0FDRUVBMEFnQVNBS1JnMEJJQXNnQkVFQmRHb2hFQ0FNSUFNZ0FTQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJUkZCQUNFQ0EwQWdBaUFOVGtVRVFDQVFJQUpCQVhScUlnWWdFVGNBR0NBR0lCRTNBQkFnQmlBUk53QUlJQVlnRVRjQUFDQUNRUkJxSVFJTUFRc0xJQUZCQVdvaEFTQUVJQTFxSVFRTUFBc0FDeUFJUVFGcUlRZ2dCU0FIYWlFSElBVWdEV3dnQUdvaEFBd0FDd0FGSUFNZ0FrRUNkR29pQjBGQWF5QUJOZ0lBSUFKQkFXb2hBaUFIS0FJQUlBRnFJUUVNQVFzQUN3QUxJQThMSUFsQkVHb2tBQXZ5QWdFR2Z5TUFRU0JySWdVa0FDQUVLQUlBSVFZZ0JVRU1haUFDSUFNUURTSURRWWgvVFFSQUlBUkJCR29oQWlBQUlBRnFJZ2xCQTJzaEJFRUFJQVpCRUhaclFSOXhJUU1EUUNBRlFReHFFQThnQUNBRVQzSkZCRUFnQWlBRktBSU1JZ1lnQlNnQ0VDSUhkQ0FEZGtFQmRHb2lDQzBBQVNFS0lBQWdDQzBBQURvQUFDQUNJQVlnQnlBS2FpSUdkQ0FEZGtFQmRHb2lCeTBBQUNFSUlBVWdCaUFITFFBQmFqWUNFQ0FBSUFnNkFBRWdBRUVDYWlFQURBRUxDd05BSUFWQkRHb1FEeUVISUFVb0Fnd2hCaUFGS0FJUUlRUWdBQ0FKVHlBSGNrVUVRQ0FDSUFZZ0JIUWdBM1pCQVhScUlnWXRBQUFoQnlBRklBUWdCaTBBQVdvMkFoQWdBQ0FIT2dBQUlBQkJBV29oQUF3QkN3c0RRQ0FBSUFsUFJRUkFJQUlnQmlBRWRDQURka0VCZEdvaUJ5MEFBU0VJSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQkNBSWFpRUVEQUVMQzBGc1FXd2dBU0FGS0FJVUlBVW9BaGhIR3lBRVFTQkhHeUVEQ3lBRlFTQnFKQUFnQXd2UEZBRWpmeU1BUWRBQWF5SUZKQUJCYkNFSkFrQWdBMEVLU1EwQUFrQWdBeUFDTHdBRUlnY2dBaThBQUNJSUlBSXZBQUlpRFdwcVFRWnFJZ3hKRFFBZ0JDOEJBaUVHSUFWQlBHb2dBa0VHYWlJQ0lBZ1FEU0lKUVloL1N3MEJJQVZCS0dvZ0FpQUlhaUlDSUEwUURTSUpRWWgvU3cwQklBVkJGR29nQWlBTmFpSUNJQWNRRFNJSlFZaC9TdzBCSUFVZ0FpQUhhaUFESUF4ckVBMGlDVUdJZjBzTkFTQUVRUVJxSVFvZ0FDQUJhaUlmUVFOcklTQkJBQ0FHYTBFZmNTRUxJQVVvQWdnaEVTQUZLQUljSVJJZ0JTZ0NNQ0VUSUFVb0FrUWhGQ0FGS0FJRUlRa2dCU2dDR0NFTklBVW9BaXdoRENBRktBSkFJUVlnQlNnQ0VDRWhJQVVvQWlRaElpQUZLQUk0SVNNZ0JTZ0NUQ0VrSUFVb0FnQWhGU0FGS0FJVUlSWWdCU2dDS0NFWElBVW9BandoR0VFQklROGdBQ0FCUVFOcVFRSjJJZ1JxSWdNZ0JHb2lBaUFFYWlJWklRUWdBaUVJSUFNaEJ3TkFJQTlCQVhGRklBUWdJRTl5UlFSQUlBQWdDaUFZSUFaMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhHaUFPTFFBRElSQWdCeUFLSUJjZ0RIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0RpMEFBaUViSUE0dEFBTWhEeUFJSUFvZ0ZpQU5kQ0FMZGtFQ2RHb2lEaThCQURzQUFDQU9MUUFDSVJ3Z0RpMEFBeUVkSUFRZ0NpQVZJQWwwSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEhpQU9MUUFESVE0Z0FDQVFhaUlsSUFvZ0dDQUdJQnBxSWdaMElBdDJRUUowYWlJUUx3RUFPd0FBSUJBdEFBSWdFQzBBQXlFbUlBY2dEMm9pSnlBS0lCY2dEQ0FiYWlJYWRDQUxka0VDZEdvaUJ5OEJBRHNBQUNBSExRQUNJUXdnQnkwQUF5RVFJQWdnSFdvaUd5QUtJQllnRFNBY2FpSVBkQ0FMZGtFQ2RHb2lDQzhCQURzQUFDQUlMUUFDSVEwZ0NDMEFBeUVjSUFRZ0Rtb2lIU0FLSUJVZ0NTQWVhaUlPZENBTGRrRUNkR29pQ1M4QkFEc0FBQ0FHYWlFQVFRTWhCd0ovSUJRZ0pFa0VRQ0FBSVFaQkF3d0JDeUFBUVFkeElRWWdGQ0FBUVFOMmF5SVVLQUFBSVJoQkFBc2dDUzBBQXlFZUlBa3RBQUloQ0NBTUlCcHFJUUFnRXlBalNRUi9JQUFGSUJNZ0FFRURkbXNpRXlnQUFDRVhRUUFoQnlBQVFRZHhDeUVNSUEwZ0Qyb2hBQ0FIY2lFSlFRTWhEd0ovSUJJZ0lra0VRQ0FBSVExQkF3d0JDeUFBUVFkeElRMGdFaUFBUVFOMmF5SVNLQUFBSVJaQkFBc2dDQ0FPYWlFQUlBbHlJQkVnSVVrRWZ5QUFCU0FSSUFCQkEzWnJJaEVvQUFBaEZVRUFJUThnQUVFSGNRc2hDU0FsSUNacUlRQWdFQ0FuYWlFSElCc2dIR29oQ0NBZElCNXFJUVFnRDNKRklROE1BUXNMSUFVZ0REWUNMQ0FGSUFZMkFrQWdCU0FOTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBSWdCMGtnQUNBRFMzSU5BRUZzSVFrZ0NDQVpTdzBCSUFOQkEyc2hDUU5BSUFWQlBHb1FEMFVnQUNBSlNYRUVRQ0FBSUFvZ0JTZ0NQQ0lOSUFVb0FrQWlESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdBQ0FPTFFBRGFpSUdJQW9nRFNBTUlBNHRBQUpxSWdCMElBdDJRUUowYWlJTUx3RUFPd0FBSUFVZ0FDQU1MUUFDYWpZQ1FDQUdJQXd0QUFOcUlRQU1BUVVnQTBFQ2F5RU1BMEFnQlVFOGFoQVBJUVlnQlNnQ1BDRU5JQVVvQWtBaENTQUFJQXhMSUFaeVJRUkFJQUFnQ2lBTklBbDBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdDU0FHTFFBQ2FqWUNRQ0FBSUFZdEFBTnFJUUFNQVFzTEEwQWdBQ0FNUzBVRVFDQUFJQW9nRFNBSmRDQUxka0VDZEdvaUJpOEJBRHNBQUNBQUlBWXRBQU5xSVFBZ0NTQUdMUUFDYWlFSkRBRUxDd0pBSUFBZ0EwOE5BQ0FBSUFvZ0RTQUpkQ0FMZGlJQVFRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FKSUFNdEFBSnFJUWtNQVFzZ0NVRWZTdzBBUVNBZ0NTQUtJQUJCQW5ScUxRQUNhaUlBSUFCQklFOGJJUWtMSUFKQkEyc2hEQU5BSUFWQktHb1FEMFVnQnlBTVNYRUVRQ0FISUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lBSFFnQzNaQkFuUnFJZzB2QVFBN0FBQWdCeUFOTFFBRGFpSURJQW9nQmlBQUlBMHRBQUpxSWdCMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FDQUdMUUFDYWpZQ0xDQURJQVl0QUFOcUlRY01BUVVnQWtFQ2F5RUdBMEFnQlVFb2FoQVBJUU1nQlNnQ0tDRU1JQVVvQWl3aEFDQUdJQWRKSUFOeVJRUkFJQWNnQ2lBTUlBQjBJQXQyUVFKMGFpSURMd0VBT3dBQUlBVWdBQ0FETFFBQ2FqWUNMQ0FISUFNdEFBTnFJUWNNQVFzTEEwQWdCaUFIU1VVRVFDQUhJQW9nRENBQWRDQUxka0VDZEdvaUF5OEJBRHNBQUNBSElBTXRBQU5xSVFjZ0FDQURMUUFDYWlFQURBRUxDd0pBSUFJZ0IwME5BQ0FISUFvZ0RDQUFkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FBSUFNdEFBSnFJUUFNQVFzZ0FFRWZTdzBBUVNBZ0FDQUtJQUpCQW5ScUxRQUNhaUlBSUFCQklFOGJJUUFMSUJsQkEyc2hEQU5BSUFWQkZHb1FEMFVnQ0NBTVNYRUVRQ0FJSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lBblFnQzNaQkFuUnFJZzB2QVFBN0FBQWdDQ0FOTFFBRGFpSURJQW9nQmlBQ0lBMHRBQUpxSWdKMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FpQUdMUUFDYWpZQ0dDQURJQVl0QUFOcUlRZ01BUVVnR1VFQ2F5RURBMEFnQlVFVWFoQVBJUUlnQlNnQ0ZDRUdJQVVvQWhnaEJ5QURJQWhKSUFKeVJRUkFJQWdnQ2lBR0lBZDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBVWdCeUFDTFFBQ2FqWUNHQ0FJSUFJdEFBTnFJUWdNQVFzTEEwQWdBeUFJU1VVRVFDQUlJQW9nQmlBSGRDQUxka0VDZEdvaUFpOEJBRHNBQUNBSUlBSXRBQU5xSVFnZ0J5QUNMUUFDYWlFSERBRUxDd0pBSUFnZ0dVOE5BQ0FJSUFvZ0JpQUhkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FISUFNdEFBSnFJUWNNQVFzZ0IwRWZTdzBBUVNBZ0J5QUtJQUpCQW5ScUxRQUNhaUlDSUFKQklFOGJJUWNMQTBBZ0JSQVBSU0FFSUNCSmNRUkFJQVFnQ2lBRktBSUFJZ1lnQlNnQ0JDSUNkQ0FMZGtFQ2RHb2lEQzhCQURzQUFDQUVJQXd0QUFOcUlnTWdDaUFHSUFJZ0RDMEFBbW9pQW5RZ0MzWkJBblJxSWdRdkFRQTdBQUFnQlNBQ0lBUXRBQUpxTmdJRUlBTWdCQzBBQTJvaEJBd0JCU0FmUVFKcklRTURRQ0FGRUE4aEFpQUZLQUlBSVFZZ0JTZ0NCQ0VJSUFNZ0JFa2dBbkpGQkVBZ0JDQUtJQVlnQ0hRZ0MzWkJBblJxSWdJdkFRQTdBQUFnQlNBSUlBSXRBQUpxTmdJRUlBUWdBaTBBQTJvaEJBd0JDd3NEUUNBRElBUkpSUVJBSUFRZ0NpQUdJQWgwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVFnQWkwQUEyb2hCQ0FJSUFJdEFBSnFJUWdNQVFzTEFrQWdCQ0FmVHcwQUlBUWdDaUFHSUFoMElBdDJJZ0pCQW5ScUlnTXRBQUE2QUFBZ0F5MEFBMEVCUmdSQUlBZ2dBeTBBQW1vaENBd0JDeUFJUVI5TERRQkJJQ0FJSUFvZ0FrRUNkR290QUFKcUlnSWdBa0VnVHhzaENBdEJiRUZzUVd4QmJFRnNRV3hCYkVGc0lBRWdDRUVnUnhzZ0JTZ0NDQ0FGS0FJTVJ4c2dCMEVnUnhzZ0JTZ0NIQ0FGS0FJZ1J4c2dBRUVnUnhzZ0JTZ0NNQ0FGS0FJMFJ4c2dDVUVnUnhzZ0JTZ0NSQ0FGS0FKSVJ4c2hDUXdKQ3dBTEFBc0FDd0FMQUFzQUN3QUxBQXRCYkNFSkN5QUZRZEFBYWlRQUlBa0w3QkFCSG44akFFSFFBR3NpQlNRQVFXd2hDUUpBSUFOQkNra05BQUpBSUFNZ0FpOEFCQ0lHSUFJdkFBQWlCeUFDTHdBQ0lnaHFha0VHYWlJT1NRMEFJQVF2QVFJaER5QUZRVHhxSUFKQkJtb2lBaUFIRUEwaUNVR0lmMHNOQVNBRlFTaHFJQUlnQjJvaUFpQUlFQTBpQ1VHSWYwc05BU0FGUVJScUlBSWdDR29pQWlBR0VBMGlDVUdJZjBzTkFTQUZJQUlnQm1vZ0F5QU9heEFOSWdsQmlIOUxEUUVnQkVFRWFpRUtJQUFnQVdvaUhFRURheUVkUVFBZ0QydEJIM0VoQ3lBRktBSUlJUkVnQlNnQ0hDRVNJQVVvQWpBaEV5QUZLQUpFSVJRZ0JTZ0NCQ0VKSUFVb0FoZ2hCaUFGS0FJc0lRY2dCU2dDUUNFSUlBVW9BaEFoSGlBRktBSWtJUjhnQlNnQ09DRWdJQVVvQWt3aElTQUZLQUlBSVJVZ0JTZ0NGQ0VXSUFVb0FpZ2hGeUFGS0FJOElSaEJBU0VOSUFBZ0FVRURha0VDZGlJQ2FpSU9JQUpxSWc4Z0Ftb2lHU0VFSUE4aEFpQU9JUU1EUUNBTlJTQUVJQjFQY2tVRVFDQUtJQmdnQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUFnQ2lBWElBZDBJQXQyUVFGMGFpSU1MUUFCSVJBZ0F5QU1MUUFBT2dBQUlBb2dGaUFHZENBTGRrRUJkR29pREMwQUFTRWFJQUlnREMwQUFEb0FBQ0FLSUJVZ0NYUWdDM1pCQVhScUlnd3RBQUVoR3lBRUlBd3RBQUE2QUFBZ0NpQVlJQWdnRFdvaUNIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFFZ0NpQVhJQWNnRUdvaUIzUWdDM1pCQVhScUlnd3RBQUVoRUNBRElBd3RBQUE2QUFFZ0NpQVdJQVlnR21vaURIUWdDM1pCQVhScUlnWXRBQUVoR2lBQ0lBWXRBQUE2QUFFZ0NpQVZJQWtnRzJvaUczUWdDM1pCQVhScUlna3RBQUVoSWlBRUlBa3RBQUE2QUFFZ0NDQU5haUVHUVFNaENRSi9JQlFnSVVrRVFFRURJUTBnQmd3QkN5QVVJQVpCQTNackloUW9BQUFoR0VFQUlRMGdCa0VIY1FzaENDQUhJQkJxSVFZZ0V5QWdTUVIvSUFZRklCTWdCa0VEZG1zaUV5Z0FBQ0VYUVFBaENTQUdRUWR4Q3lFSElBd2dHbW9oRENBSklBMXlJUkJCQXlFTkFuOGdFaUFmU1FSQUlBd2hCa0VEREFFTElBeEJCM0VoQmlBU0lBeEJBM1pySWhJb0FBQWhGa0VBQ3lBYklDSnFJUXdnRUhJaEVDQVJJQjVKQkg4Z0RBVWdFU0FNUVFOMmF5SVJLQUFBSVJWQkFDRU5JQXhCQjNFTElRa2dCRUVDYWlFRUlBSkJBbW9oQWlBRFFRSnFJUU1nQUVFQ2FpRUFJQTBnRUhKRklRME1BUXNMSUFVZ0J6WUNMQ0FGSUFnMkFrQWdCU0FHTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBQWdEa3NnQXlBUFMzSU5BRUZzSVFrZ0FpQVpTdzBCSUE1QkEyc2hDUU5BSUFWQlBHb1FEeUFBSUFsUGNrVUVRQ0FLSUFVb0Fqd2lCaUFGS0FKQUlnZDBJQXQyUVFGMGFpSUlMUUFCSVF3Z0FDQUlMUUFBT2dBQUlBb2dCaUFISUF4cUlnWjBJQXQyUVFGMGFpSUhMUUFBSVFnZ0JTQUdJQWN0QUFGcU5nSkFJQUFnQ0RvQUFTQUFRUUpxSVFBTUFRc0xBMEFnQlVFOGFoQVBJUWNnQlNnQ1BDRUdJQVVvQWtBaENTQUFJQTVQSUFkeVJRUkFJQW9nQmlBSmRDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0NTQUdMUUFCYWpZQ1FDQUFJQWM2QUFBZ0FFRUJhaUVBREFFTEN3TkFJQUFnRGs5RkJFQWdDaUFHSUFsMElBdDJRUUYwYWlJSExRQUJJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdDV29oQ1F3QkN3c2dEMEVEYXlFQUEwQWdCVUVvYWhBUElBQWdBMDF5UlFSQUlBb2dCU2dDS0NJR0lBVW9BaXdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFESUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWl3Z0F5QUlPZ0FCSUFOQkFtb2hBd3dCQ3dzRFFDQUZRU2hxRUE4aEJ5QUZLQUlvSVFZZ0JTZ0NMQ0VBSUFNZ0QwOGdCM0pGQkVBZ0NpQUdJQUIwSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FBSUFZdEFBRnFOZ0lzSUFNZ0J6b0FBQ0FEUVFGcUlRTU1BUXNMQTBBZ0F5QVBUMFVFUUNBS0lBWWdBSFFnQzNaQkFYUnFJZ2N0QUFFaENDQURJQWN0QUFBNkFBQWdBMEVCYWlFRElBQWdDR29oQUF3QkN3c2dHVUVEYXlFREEwQWdCVUVVYWhBUElBSWdBMDl5UlFSQUlBb2dCU2dDRkNJR0lBVW9BaGdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFDSUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWhnZ0FpQUlPZ0FCSUFKQkFtb2hBZ3dCQ3dzRFFDQUZRUlJxRUE4aEJ5QUZLQUlVSVFZZ0JTZ0NHQ0VESUFJZ0dVOGdCM0pGQkVBZ0NpQUdJQU4wSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FESUFZdEFBRnFOZ0lZSUFJZ0J6b0FBQ0FDUVFGcUlRSU1BUXNMQTBBZ0FpQVpUMFVFUUNBS0lBWWdBM1FnQzNaQkFYUnFJZ2N0QUFFaENDQUNJQWN0QUFBNkFBQWdBa0VCYWlFQ0lBTWdDR29oQXd3QkN3c0RRQ0FGRUE4Z0JDQWRUM0pGQkVBZ0NpQUZLQUlBSWdJZ0JTZ0NCQ0lHZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FLSUFJZ0JpQUlhaUlDZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQWlBR0xRQUJhallDQkNBRUlBYzZBQUVnQkVFQ2FpRUVEQUVMQ3dOQUlBVVFEeUVISUFVb0FnQWhCaUFGS0FJRUlRSWdCQ0FjVHlBSGNrVUVRQ0FLSUFZZ0FuUWdDM1pCQVhScUlnWXRBQUFoQnlBRklBSWdCaTBBQVdvMkFnUWdCQ0FIT2dBQUlBUkJBV29oQkF3QkN3c0RRQ0FFSUJ4UFJRUkFJQW9nQmlBQ2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBRVFRRnFJUVFnQWlBSWFpRUNEQUVMQzBGc1FXeEJiRUZzUVd4QmJFRnNRV3dnQVNBQ1FTQkhHeUFGS0FJSUlBVW9BZ3hIR3lBRFFTQkhHeUFGS0FJY0lBVW9BaUJIR3lBQVFTQkhHeUFGS0FJd0lBVW9BalJIR3lBSlFTQkhHeUFGS0FKRUlBVW9Ba2hIR3lFSkRBRUxRV3doQ1FzZ0JVSFFBR29rQUNBSkMxZ0JBMzhDUUNBQUtBS1E2d0VpQVVVTkFDQUJLQUlBSUFGQnROVUJhaWdDQUNJQ0lBRkJ1TlVCYWlnQ0FDSURFQk1nQWdSQUlBTWdBU0FDRVFJQURBRUxJQUVRQmdzZ0FFRUFOZ0tnNndFZ0FFSUFOd09RNndFTDZRTUNCSDhDZmlBQVFRQkJLQkFESVFRZ0FrRUJRUVVnQXhzaUFFa0VRQ0FBRHdzZ0FVVUVRRUYvRHd0QkFTRUdBa0FDUUNBRFFRRkdEUUFnQXlFR0lBRW9BQUFpQlVHbzZyNXBSZzBBUVhZaEF5QUZRWEJ4UWREVXRNSUJSdzBCUVFnaEF5QUNRUWhKRFFFZ0FUVUFCQ0VJSUFSQkFUWUNGQ0FFSUFnM0F3QkJBQThMSUFFZ0FpQUdFQm9pQXlBQ1N3MEFJQVFnQXpZQ0dFRnlJUU1nQUNBQmFpSUZRUUZyTFFBQUlnSkJDSEVOQUNBQ1FTQnhJZ1pGQkVCQmNDRURJQVV0QUFBaUJVR25BVXNOQVNBRlFRZHhyVUlCSUFWQkEzWkJDbXF0aGlJSVFnT0lmaUFJZkNFSklBQkJBV29oQUFzZ0FrRUdkaUVGSUFKQkFuWkJBQ0VEQWtBQ1FBSkFBa0FnQWtFRGNVRUJhdzREQUFFQ0F3c2dBQ0FCYWkwQUFDRURJQUJCQVdvaEFBd0NDeUFBSUFGcUx3QUFJUU1nQUVFQ2FpRUFEQUVMSUFBZ0FXb29BQUFoQXlBQVFRUnFJUUFMUVFGeElRSUNmZ0pBQWtBQ1FBSkFJQVZCQVdzT0F3RUNBd0FMUW44Z0JrVU5BeG9nQUNBQmFqRUFBQXdEQ3lBQUlBRnFNd0FBUW9BQ2ZBd0NDeUFBSUFGcU5RQUFEQUVMSUFBZ0FXb3BBQUFMSVFnZ0JDQUNOZ0lnSUFRZ0F6WUNIQ0FFSUFnM0F3QkJBQ0VESUFSQkFEWUNGQ0FFSUFnZ0NTQUdHeUlJTndNSUlBUkNnSUFJSUFnZ0NFS0FnQWhhR3o0Q0VBc2dBd3RmQVFGL1FiaC9JUU1nQVVFQlFRVWdBaHNpQWs4RWZ5QUFJQUpxUVFGckxRQUFJZ0JCQTNGQkFuUkJvQjVxS0FJQUlBSnFJQUJCQkhaQkRIRkJzQjVxS0FJQWFpQUFRU0J4SWdGRmFpQUJRUVYySUFCQndBQkpjV29GUWJoL0N3c01BQ0FBSUFFZ0FrRUFFQmtMbHdNQ0JYOENmaU1BUVVCcUlnUWtBQUpBQTBBZ0FVRUZUd1JBQWtBZ0FDZ0FBRUZ3Y1VIUTFMVENBVVlFUUVKK0lRY2dBVUVJU1EwRUlBQW9BQVFpQWtGM1N3MEVJQUpCQ0dvaUF5QUJTdzBFSUFKQmdYOUpEUUVNQkFzZ0JFRVlhaUFBSUFFUUd5RUNRbjRnQkNrREdFSUFJQVFvQWl4QkFVY2JJQUliSWdkQ2ZWWU5BeUFISUFoOElnZ2dCMVJDZmlFSERRTUNRQUpBSUFGQkNFa05BQ0FBS0FBQVFYQnhRZERVdE1JQlJ3MEFJQUFvQUFRaUFrRjNTdzBGUWJoL0lBSkJDR29pQWlBQklBSkpHeUVEREFFTElBUkJHR29nQUNBQkVCc2lBa0dJZjBzRVFDQUNJUU1NQVF0QnVIOGhBeUFDRFFBZ0FTQUVLQUl3SWdKcklRVWdBQ0FDYWlFR0EwQWdCaUFGSUFSQkRHb1FIU0lEUVloL1N3MEJJQU5CQTJvaUFpQUZTd1JBUWJoL0lRTU1BZ3NnQlNBQ2F5RUZJQUlnQm1vaEJpQUVLQUlRUlEwQUN5QUVLQUk0Qkg5QnVIOGhBeUFGUVFSSkRRRWdCa0VFYWdVZ0Jnc2dBR3NoQXdzZ0EwR0lmMHNOQXdzZ0FTQURheUVCSUFBZ0Eyb2hBQXdCQ3d0Q2ZpQUlJQUViSVFjTElBUkJRR3NrQUNBSEMyUUJBWDlCdUg4aEF3SkFJQUZCQTBrTkFDQUFMUUFDSVFFZ0FpQUFMd0FBSWdCQkFYRTJBZ1FnQWlBQVFRRjJRUU54SWdNMkFnQWdBaUFBSUFGQkVIUnlRUU4ySWdBMkFnZ0NRQUpBSUFOQkFXc09Bd0lCQUFFTFFXd1BDeUFBSVFNTElBTUxSQUVDZnlBQklBSW9BZ1FpQXlBQktBSUVhaUlFTmdJRUlBQWdBMEVDZEVHZ0hXb29BZ0FnQVNnQ0FFRUFJQVJyZG5FMkFnQWdBUkFQR2lBQUlBSkJDR28yQWdRTHpnRUJCbjlCdW44aENnSkFJQUlvQWdRaUNDQUNLQUlBSWdscUlnMGdBU0FBYTBzTkFFRnNJUW9nQ1NBRUlBTW9BZ0FpQzJ0TERRQWdBQ0FKYWlJRUlBSW9BZ2dpREdzaEFpQUFJQUZCSUdzaUFDQUxJQWxCQUJBZ0lBTWdDU0FMYWpZQ0FBSkFBa0FnQkNBRmF5QU1Ud1JBSUFJaEJRd0JDeUFNSUFRZ0JtdExEUUlnQnlBSElBSWdCV3NpQW1vaUFTQUlhazhFUUNBRUlBRWdDQkFLR2d3Q0N5QUNJQWhxSVFnZ0JDQUJRUUFnQW1zUUNpQUNheUVFQ3lBRUlBQWdCU0FJUVFFUUlBc2dEU0VLQ3lBS0M4Y0VBUUovSUFBZ0Eyb2hCZ0pBSUFOQkIwd0VRQU5BSUFBZ0JrOE5BaUFBSUFJdEFBQTZBQUFnQUVFQmFpRUFJQUpCQVdvaEFnd0FDd0FMSUFSQkFVWUVRQUpBSUFBZ0Ftc2lCVUVIVFFSQUlBQWdBaTBBQURvQUFDQUFJQUl0QUFFNkFBRWdBQ0FDTFFBQ09nQUNJQUFnQWkwQUF6b0FBeUFBSUFJZ0JVRUNkQ0lGUWNBZWFpZ0NBR29pQWlnQUFEWUFCQ0FDSUFWQjRCNXFLQUlBYXlFQ0RBRUxJQUFnQWlrQUFEY0FBQXNnQWtFSWFpRUNJQUJCQ0dvaEFBc2dBU0FHVHdSQUlBQWdBMm9oQVNBRVFRRkhJQUFnQW10QkQwcHlSUVJBQTBBZ0FDQUNLUUFBTndBQUlBSkJDR29oQWlBQVFRaHFJZ0FnQVVrTkFBd0RDd0FMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0EwRVJTUTBCSUFCQkVHb2hBQU5BSUFBZ0Fpa0FFRGNBQUNBQUlBSXBBQmczQUFnZ0FDQUNLUUFnTndBUUlBQWdBaWtBS0RjQUdDQUNRU0JxSVFJZ0FFRWdhaUlBSUFGSkRRQUxEQUVMQWtBZ0FDQUJTd1JBSUFBaEFRd0JDeUFCSUFCcklRVUNRQ0FFUVFGSElBQWdBbXRCRDBweVJRUkFJQUloQXdOQUlBQWdBeWtBQURjQUFDQURRUWhxSVFNZ0FFRUlhaUlBSUFGSkRRQUxEQUVMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0JVRVJTQTBBSUFCQkVHb2hBQ0FDSVFNRFFDQUFJQU1wQUJBM0FBQWdBQ0FES1FBWU53QUlJQUFnQXlrQUlEY0FFQ0FBSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUJCSUdvaUFDQUJTUTBBQ3dzZ0FpQUZhaUVDQ3dOQUlBRWdCazhOQVNBQklBSXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2hBZ3dBQ3dBTEM2NEhBZ1YvQVg0akFFR0FBV3NpRVNRQUlCRWdBellDZkVGL0lROENRQUpBQWtBQ1FBSkFJQUlPQkFFQUF3SUVDeUFHUlFSQVFiaC9JUThNQkF0QmJDRVBJQVV0QUFBaUFpQURTdzBESUFnZ0FrRUNkQ0lDYWlnQ0FDRURJQUlnQjJvb0FnQWhBaUFBUVFBNkFBc2dBRUlBTndJQUlBQWdBallDRENBQUlBTTZBQW9nQUVFQU93RUlJQUVnQURZQ0FFRUJJUThNQXdzZ0FTQUpOZ0lBUVFBaER3d0NDeUFLUlFSQVFXd2hEd3dDQzBFQUlROGdDMFVnREVFWlNISU5BVUVJSUFSMFFRaHFJUUJCQUNFREEwQWdBQ0FEVFEwQ0lBTkJRR3NoQXd3QUN3QUxRV3doRHlBUklCRkIvQUJxSUJGQitBQnFJQVVnQmhBTUlnTkJpSDlMRFFBZ0VTZ0NlQ0lDSUFSTERRQWdFU2dDZkVFQmFpRUpJQUJCQ0dvaEMwR0FnQUlnQW5SQkVIVWhCVUVCSVJCQkFTQUNkQ0lQUVFGcklnb2hFZ05BSUFrZ0RrY0VRQUpBSUJFZ0RrRUJkQ0lFYWk4QkFDSU1RZi8vQTBZRVFDQUxJQkpCQTNScUlBNDJBZ1FnRWtFQmF5RVNRUUVoREF3QkN5QVFRUUFnQlNBTXdVb2JJUkFMSUFRZ0RXb2dERHNCQUNBT1FRRnFJUTRNQVFzTElBQWdBallDQkNBQUlCQTJBZ0FDUUNBS0lCSkdCRUFnRFVIcUFHb2hCa0VBSVJCQkFDRU1BMEFnQ1NBUVJnUkFJQTlCQTNZZ0QwRUJkbXBCQTJvaUJVRUJkQ0VFUVFBaERFRUFJUklEUUVFQUlRNGdEeUFTVFEwRUEwQWdEa0VDUndSQUlBc2dCU0FPYkNBTWFpQUtjVUVEZEdvZ0JpQU9JQkpxYWkwQUFEWUNCQ0FPUVFGcUlRNE1BUXNMSUJKQkFtb2hFaUFFSUF4cUlBcHhJUXdNQUFzQUJTQVJJQkJCQVhScUxnRUFJUVVnQmlBTWFpSUVJQk0zQUFCQkNDRU9BMEFnQlNBT1NnUkFJQVFnRG1vZ0V6Y0FBQ0FPUVFocUlRNE1BUXNMSUJOQ2dZS0VpSkNnd0lBQmZDRVRJQkJCQVdvaEVDQUZJQXhxSVF3TUFRc0FDd0FMSUE5QkEzWWdEMEVCZG1wQkEyb2hCVUVBSVJCQkFDRU9BMEFnQ1NBUVJnMEJRUUFoRENBUklCQkJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBTVJ3UkFJQXNnRGtFRGRHb2dFRFlDQkFOQUlBVWdEbW9nQ25FaURpQVNTdzBBQ3lBTVFRRnFJUXdNQVFzTElCQkJBV29oRUF3QUN3QUxJQUpCQVdvaEJVRUFJUXdEUUNBTUlBOUhCRUFnRFNBTElBeEJBM1JxSWdrb0FnUWlCRUVCZEdvaUFpQUNMd0VBSWdaQkFXbzdBUUFnQ1NBRklBWm5RV0J6YWlJQ09nQURJQWtnQmlBQ2RDQVBhenNCQUNBSklBZ2dCRUVDZENJQ2FpZ0NBRG9BQWlBSklBSWdCMm9vQWdBMkFnUWdERUVCYWlFTURBRUxDeUFCSUFBMkFnQWdBeUVQQ3lBUlFZQUJhaVFBSUE4TDdWb0NPMzhHZmlNQVFlQUJheUlFSkFBQ1FFR3c3QWtRQlNJRlJRUkFRVUFoQnd3QkN5QUZRZ0EzQXZUcUFTQUZRUUEyQXNUckFTQUZRUUEyQXJUckFTQUZRZ0EzQXB6ckFTQUZRUUEyQXJqcEFTQUZRUUEyQXF6c0NTQUZRZ0EzQXRUckFTQUZRZ0EzQXF6ckFTQUZRZ0EzQTRqckFTQUZRZ0EzQXVUcUFTQUZRZ0EzQXVUckFTQUZRWUdBZ01BQU5nSzg2d0VnQlVJQU53S2s2d0VnQlVIODZnRnFRUUEyQWdBZ0JVR1E2d0ZxUWdBM0F3QWdCUkFZSUFWQnJOVUJhaUVVSUFWQitPc0JhaUVjSUFWQnNPb0JhaUVpSUFWQm9EQnFJU29nQlVHWUlHb2hLeUFGUWFqUUFHb2hIaUFGUVJCcUlTd2dCVUVJYWlFb0lBVkJCR29oTFNBRlFjRHBBV29oS1NBRlFZanJBV29nQkVHVUFXb2hMeUFFUVl3QmFpRXdJQVJCaEFGcUlURWdCRUhjQUdvaE1pQUVRZFFBYWlFeklBUkJ6QUJxSVRRZ0FDRWRBa0FDUUFKQUFrQUNRQU5BUVFGQkJTQUZLQUxrNmdFYklRWUNRQU5BSUFNZ0Jra05BU0FDS0FBQVFYQnhRZERVdE1JQlJnUkFRYmgvSVFjZ0EwRUlTUTBJSUFJb0FBUWlEa0YzU3dSQVFYSWhCd3dKQ3lBRElBNUJDR29pQ1VrTkNDQU9RWUIvU3dSQUlBa2hCd3dKQ3lBRElBbHJJUU1nQWlBSmFpRUNEQUVMQ3lBRlFnQTNBcXpwQVNBRlFnQTNBK2pwQVNBRlFRQTJBcGpyQVNBRlFnQTNBNERxQVNBRlFnTTNBL2pwQVNBRlFiVHBBV3BDQURjQ0FDQUZRZkRwQVdwQ0FEY0RBQ0FGUWFqUUFHb2lDVUdNZ0lEZ0FEWUNBQ0FGUWF6UUFXcEI0QklwQWdBM0FnQWdCVUcwMEFGcVFlZ1NLQUlBTmdJQUlBVWdCVUVRYWpZQ0FDQUZJQVZCb0RCcU5nSUVJQVVnQlVHWUlHbzJBZ2dnQlNBSk5nSU1JQVZCQVVFRklBVW9BdVRxQVJzMkFyenBBUUpBSUFGRkRRQWdCU2dDck9rQklna2dIVVlOQUNBRklBazJBcmpwQVNBRklCMDJBcXpwQVNBRktBS3c2UUVoRGlBRklCMDJBckRwQVNBRklCMGdEaUFKYTJvMkFyVHBBUXRCdUg4aENTQURRUVZCQ1NBRktBTGs2Z0VpQmh0SkRRVWdBa0VCUVFVZ0Joc2dCaEFhSWc1QmlIOUxCRUFnRGlFSkRBVUxJQU1nRGtFRGFra05CU0FwSUFJZ0RpQUdFQmtpQmtHSWYwc0VRQ0FHSVFrTUJRc2dCZzBGQWtBQ1FDQUZLQUtvNndGQkFVY05BQ0FGS0FLazZ3RWlDVVVOQUNBRktBS1U2d0ZGRFFBZ0NTZ0NCRUVCYXlJSElBVW9BdHpwQVNJS3JVS0hsYSt2bUxiZW01NS9ma0xKejlteThlVzY2aWVGUWhlSlFzL1cwNzdTeDZ2WlFuNUMrZlBkOFpuMm1hc1dmQ0kvUWlHSUlEK0ZRcy9XMDc3U3g2dlpRbjRpUDBJZGlDQS9oVUw1ODkzeG1mYVpxeForSWo5Q0lJZ2dQNFduY1NFR0lBa29BZ0FoRlFOQVFRQWhDQUpBSUJVZ0JrRUNkR29vQWdBaUNVVU5BQ0FKS0FJSVFRaEpEUUFnQ1NnQ0JDSVNLQUFBUWJmSXd1RitSdzBBSUJJb0FBUWhDQXNnQ0NBS1J3UkFJQVlnQjNGQkFXb2hCaUFJRFFFTEN5QUpSUTBBSUFVUUdDQUZRWDgyQXFEckFTQUZJQWsyQXBUckFTQUZJQVVvQXR6cEFTSUlOZ0tZNndFTUFRc2dCU2dDM09rQklRZ0xBa0FnQ0VVTkFDQUZLQUtZNndFZ0NFWU5BRUZnSVFrTUJnc0NRQ0FGS0FMZzZRRUVRQ0FGSUFVb0F1anFBU0lKUlRZQzdPb0JJQWtOQVNBRlF2bnEwTkRueWFIazRRQTNBNmpxQVNBRlFnQTNBNkRxQVNBRlFzL1cwNzdTeDZ2WlFqY0RtT29CSUFWQzF1dUM3dXI5aWZYZ0FEY0RrT29CSUFWQ0FEY0RpT29CSUNKQkFFRW9FQU1hREFFTElBVkJBRFlDN09vQkN5QUJJQjFxSVNVZ0JTQUZLUVBvNlFFZ0RxMThOd1BvNlFFZ0F5QU9heUVESUFJZ0Rtb2hBaUFkSVE0RFFDQUNJQU1nQkVFc2FoQWRJaFZCaUg5TEJFQWdGU0VKREFZTElBTkJBMnNpTlNBVlNRMEVJQUpCQTJvaEcwRnNJUWtDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVLQUlzRGdNQ0FRQVZDeUFWUWYvL0Iwc05FeUFWUVFOSkRSSWdCU2tEeU9rQklUOENRQUpBSUJzdEFBQWlDVUVEY1NJYVFRRnJEZ01HQVFBSEN5QUZLQUtBNmdFTkFFRmlJUWtNRlFzZ0ZVRUZTUTBTSUJzb0FBQWhBd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRWlDVUVDYXc0Q0FRSUFDeUFKUVFCSElRY2dBMEVFZGtIL0IzRWhDMEVESVFZZ0EwRU9ka0gvQjNFTUFndEJCQ0VHSUFOQkJIWkIvLzhBY1NFTFFRRWhCeUFEUVJKMkRBRUxJQU5CQkhaQi8vOFBjU0lMUVlDQUNFc05FMEVCSVFkQkJTRUdJQUl0QUFkQkNuUWdBMEVXZG5JTElnZ2dCbW9pQ1NBVlN3MFNBa0FnQzBHQkJra05BQ0FGS0FLYzZ3RkZEUUJCQUNFREEwQWdBMEdEZ0FGTERRRWdBMEZBYXlFRERBQUxBQXNnQmlBYmFpRVBJQnBCQTBjTkJpQUZLQUlNSWdJdEFBRkJDSFFoQXlBSERRY2dBMFVOQ0NBRVFmQUFhaUFQSUFnUURTSURRWWgvU3cwSklBSkJCR29oQmlBTElCeHFJaEpCQTJzaENrRUFJQUl2QVFKclFSOXhJUWNnSENFREEwQWdCRUh3QUdvUUQwVWdBeUFLU1hFRVFDQURJQVlnQkNnQ2NDSUlJQVFvQW5RaUQzUWdCM1pCQW5ScUlnSXZBUUE3QUFBZ0F5QUNMUUFEYWlJRElBWWdDQ0FQSUFJdEFBSnFJZ2gwSUFkMlFRSjBhaUlDTHdFQU93QUFJQVFnQ0NBQ0xRQUNhallDZENBRElBSXRBQU5xSVFNTUFRVWdFa0VDYXlFSUEwQWdCRUh3QUdvUUR5RVBJQVFvQW5BaENpQUVLQUowSVFJZ0F5QUlTeUFQY2tVRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUNpOEJBRHNBQUNBRUlBSWdDaTBBQW1vMkFuUWdBeUFLTFFBRGFpRUREQUVMQ3dOQUlBTWdDRTBFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pRHk4QkFEc0FBQ0FESUE4dEFBTnFJUU1nQWlBUExRQUNhaUVDREFFTEN3SkFJQU1nRWs4TkFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUF5MEFBRG9BQUNBRExRQURRUUZHQkVBZ0FpQURMUUFDYWlFQ0RBRUxJQUpCSDBzTkFFRWdJQUlnQXkwQUFtb2lBaUFDUVNCUEd5RUNDMEZzUVd3Z0N5QUVLQUo0SUFRb0FueEhHeUFDUVNCSEd5RUREQXNMQUFzQUN5QUVLQUkwSWdJZ0pTQU9hMHNOQ2lBT1JRUkFRUUFoQ1NBQ0RRSU1EZ3NnRGlBYkxRQUFJQUlRQXhvZ0FpRUpEQXdMSUJVZ0pTQU9hMHNOQ1NBT0RRRkJBQ0VKSUJWRkRRd0xRYlovSVFrTUVRc2dEaUFiSUJVUUFob2dGU0VKREFvTElCd2dHd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRkJBV3NPQXdFQUFnQUxJQWxCQTNZaEEwRUJEQUlMSUJzdkFBQkJCSFloQTBFQ0RBRUxJQlZCQkVrTkRpQUNMd0FESUFJdEFBVkJFSFJ5SWdKQmo0Q0FBVXNORGlBQ1FRUjJJUU5CQXdzaUFtb3RBQUFnQTBFZ2FoQURJUWtnQlNBRE5nS0E2d0VnQlNBSk5nTHc2Z0VnQWtFQmFpRUpEQVVMSUJVQ2Z3SkFBa0FDUUNBSlFRSjJRUU54UVFGckRnTUJBQUlBQ3lBSlFRTjJJUU5CQVF3Q0N5QWJMd0FBUVFSMklRTkJBZ3dCQ3lBQ0x3QURJQUl0QUFWQkVIUnlRUVIySVFOQkF3c2lBaUFEYWlJSlFTQnFTUVJBSUFrZ0ZVc05EU0FjSUFJZ0cyb2dBeEFDSVFJZ0JTQUROZ0tBNndFZ0JTQUNOZ0x3NmdFZ0FpQURhaUlDUWdBM0FCZ2dBa0lBTndBUUlBSkNBRGNBQ0NBQ1FnQTNBQUFNQlFzZ0JTQUROZ0tBNndFZ0JTQUNJQnRxTmdMdzZnRU1CQXNnQjBVRVFDQWVJQThnQ0NBVUVCUWlBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRlNFRERBTUxJQXRGSUFoRmNnMExJQXRCQ0hZaUF5QUlJQXRKQkg4Z0NFRUVkQ0FMYmdWQkR3dEJHR3dpQWtHTUNHb29BZ0JzSUFKQmlBaHFLQUlBYWlJR1FRTjJJQVpxSUFKQmdBaHFLQUlBSUFKQmhBaHFLQUlBSUFOc2Fra0VRQ01BUVJCckloQWtBQ0FlS0FJQUlRTWdGRUh3QkdwQkFFSHNBQkFESVFaQlZDRUNBa0FnQTBIL0FYRWlERUVNU3cwQUFrQWdGRUhjQ1dvZ0JpQVFRUWhxSUJCQkRHb2dEeUFJSUJSQjNBdHFJaGNRQ3lJU1FZaC9TdzBBSUJBb0Fnd2lCaUFNU3cwQklCUkJxQVZxSVEwZ0ZFR2tCV29oTmlBZVFRUnFJUkVnQTBHQWdJQjRjU0UzSUFaQkFXb2lFeUVDSUFZaEF3TkFJQUlpQjBFQmF5RUNJQU1pQ2tFQmF5RURJQlFnQ2tFQ2RHb29BdkFFUlEwQUMwRUJJQWNnQjBFQlRSc2hGa0VBSVFkQkFTRUNBMEFnQWlBV1J3UkFJQlFnQWtFQ2RDSURhaWdDOEFRaEdDQURJQTFxSUFjMkFnQWdBa0VCYWlFQ0lBY2dHR29oQnd3QkN3c2dEU0FITmdJQVFRQWhBaUFRS0FJSUlRTURRQ0FDSUFOSEJFQWdEU0FDSUJScVFkd0phaTBBQUNJWVFRSjBhaUlaSUJrb0FnQWlHVUVCYWpZQ0FDQVVJQmxCQVhScUloa2dHRG9BM1FVZ0dTQUNPZ0RjQlNBQ1FRRnFJUUlNQVFzTFFRQWhBeUFOUVFBMkFnQWdEQ0FHUVg5emFpRUdRUUVoQWdOQUlBSWdGa2NFUUNBVUlBSkJBblJxSWcwZ0F6WUNBQ0FOS0FMd0JDQUNJQVpxZENBRGFpRURJQUpCQVdvaEFnd0JDd3NnRENBVElBcHJJZ1pyUVFGcUlRb2dCaUVEQTBBZ0F5QUtTUVJBSUJRZ0EwRTBiR29oRFVFQklRSURRQ0FDSUJaSEJFQWdEU0FDUVFKMEloaHFJQlFnR0dvb0FnQWdBM1kyQWdBZ0FrRUJhaUVDREFFTEN5QURRUUZxSVFNTUFRc0xJQmNnRkVFMEVBSWhPQ0FVUVpBTWFpRTVJQk1nREdzaE9pQVVRZHdGYWlFWFFRQWhDZ05BQWtBQ1FDQUhJQXBIQkVCQkFTQU1JQk1nRnlBS1FRRjBhaUlDTFFBQklnMXJJZ05ySWhoMElSa2dBaTBBQUNFV0lEZ2dEVUVDZEdvaUh5Z0NBQ0VDSUFZZ0dFMEVRQ0EyUVFFZ0F5QTZhaUlOSUExQkFVd2JJaUJCQW5RaUpHb29BZ0FoRFNBNUlCUWdBMEUwYkdwQk5CQUNJU0VnRFVFQmRDRW1JQkVnQWtFQ2RHb2hJeUFnUVFGTkRRSWdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVnSUNFZ0pHb29BZ0FoSkVFQUlRSURRQ0FDSUNSR0RRTWdJeUFDUVFKMGFpQWdOZ0VBSUFKQkFXb2hBZ3dBQ3dBTElBSWdBaUFaYWlJTklBSWdEVXNiSVEwZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRURBMEFnQWlBTlJnMERJQkVnQWtFQ2RHb2dBellCQUNBQ1FRRnFJUUlNQUFzQUN5QWVJQXhCRUhRZ04zSWdESEpCZ0FKeU5nSUFEQU1MSUFjZ0RXc2hKQ0FYSUNacUlTWkJBQ0VOQTBBZ0RTQWtSZzBCUVFFZ0dDQVRJQ1lnRFVFQmRHb2lKeTBBQVNJQ2F5STdhM1FpUENBaElBSkJBblJxSWlBb0FnQWlBbW9oUFNBRElEdHFRUkIwUVlDQS9BZHhJQ2N0QUFCQkNIUnlJQlp5UVlDQWdCQnlJU2NEUUNBaklBSkJBblJxSUNjMkFRQWdBa0VCYWlJQ0lEMUpEUUFMSUNBZ0lDZ0NBQ0E4YWpZQ0FDQU5RUUZxSVEwTUFBc0FDeUFmSUI4b0FnQWdHV28yQWdBZ0NrRUJhaUVLREFBTEFBc2dFaUVDQ3lBUVFSQnFKQUFnQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZpRUREQU1MSUI0Z0R5QUlJQlFRRkNJQ1FZaC9TeUFDSUFoUGNnMExJQndnQ3lBQ0lBOXFJQWdnQW1zZ0hoQVhJUU1NQWdzZ0F3UkFJQndnQ3lBUElBZ2dBaEFXSVFNTUFnc2dIQ0FMSUE4Z0NDQUNFQmNoQXd3QkN5QWNJQXNnRHlBSUlBSVFGU0VEQ3lBRFFZaC9TdzBJSUFVZ0N6WUNnT3NCSUFVZ0hEWUM4T29CSUFWQkFUWUNnT29CSUJwQkFrWUVRQ0FGSUI0MkFnd0xJQXNnSEdvaUFrSUFOd0FBSUFKQ0FEY0FHQ0FDUWdBM0FCQWdBa0lBTndBSUlBbEJpSDlMRFFvTElBa2dGVVlOQ0NBVklBbHJJUVlnQlNnQ25Pc0JJUW9DUUNBSklCdHFJZ010QUFBaUQwVUVRRUVCSVFKQkFDRVBRYmgvSVFrZ0JrRUJSZzBCREFzTEFuOGdBMEVCYWlBUHdDSUNRUUJPRFFBYUlBSkJmMFlFUUNBR1FRTklEUXNnQXk4QUFVR0EvZ0ZxSVE4Z0EwRURhZ3dCQ3lBR1FRSklEUW9nQXkwQUFTQVBRUWgwY2tHQWdBSnJJUThnQTBFQ2Fnc2hFa0c0ZnlFSklCSkJBV29pQWlBVklCdHFJZ2RMRFFvZ0xDQUZJQkl0QUFBaUVrRUdka0VqUVFrZ0FpQUhJQUpyUWNBUVFkQVJRZkFTSUFVb0FvVHFBU0FLSUE4Z0ZCQWhJZ2xCaUg5TERRZ2dLeUFvSUJKQkJIWkJBM0ZCSDBFSUlBSWdDV29pQWlBSElBSnJRWUFMUVlBTVFZQVhJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQ0VHSWYwc05DRUZzSVFrZ0tpQXRJQkpCQW5aQkEzRkJORUVKSUFJZ0NHb2lBaUFISUFKclFZQU5RZUFPUVpBWklBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlCMEdJZjBzTkNpQUNJQWRxSUFOcklnSWhDU0FDUVloL1N3MEtDeUFPSUE5QkFFeHlEUUVMUWJwL0lRa01DQXNnSlNBT2F5RUpJQVlnQW1zaEJpQUNJQU5xSVFjQ1FBSkFBa0FnQ2tVRVFDQVBRUWxJSUFVcEE4anBBVUtCZ0lBSVZISU5BaUFvS0FJQUlnSkJDR29oRWlBQ0tBSUVJUXBCQUNFRFFRQWhBZ05BSUFNZ0NuWkZCRUFnQWlBU0lBTkJBM1JxTFFBQ1FSWkxhaUVDSUFOQkFXb2hBd3dCQ3dzZ0JVRUFOZ0tjNndFZ0FrRUlJQXByZEVFVVR3MEJEQU1MSUFWQkFEWUNuT3NCQ3lBRUlBVW9BdkRxQVNJRE5nTGNBU0FKSUE1cUlSWWdBeUFGS0FLQTZ3RnFJUmNDUUNBUFJRUkFJQTRoQnd3QkN5QUZLQUs0NlFFaEdpQUZLQUswNlFFaEdDQUZLQUt3NlFFaEVpQUZRUUUyQW9UcUFVRUFJUU1EUUNBRFFRTkhCRUFnQkNBRFFRSjBJZ0pxSUFJZ0JXcEJyTkFCYWlnQ0FEWUNaQ0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRVGhxSWdJZ0J5QUdFQTFCaUg5TERRTkJDQ0FQSUE5QkNFNGJJUjhnTkNBQ0lBVW9BZ0FRSGlBeklBSWdCU2dDQ0JBZUlESWdBaUFGS0FJRUVCNGdEaUFTYXlFWlFRQWhDQU5BSUFSQk9Hb1FEMEVEUmlBSUlCOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnZEJFSFlpRVVIL0FYRWhDeUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWd4QkVIWWlJVUgvQVhFaEVDQUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFZZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDa0gvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJS2F5SU5JQUlnQWlBTlN4c2lFeUFLYWpZQ1BDQUdJQVFvQWpnZ0NuUkJBQ0FUYTNZZ0FpQVRheUlUZEdvaENpQUVRVGhxRUE4YUlBSWdEVTBOQVNBRUlBUW9BandpQWlBVGFqWUNQQ0FFS0FJNElBSjBRUUFnRTJ0MklBcHFJUW9NQVFzZ0JDQUNJQVFvQWp3aURXbzJBandnQkNnQ09DQU5kRUVBSUFwcmRpQUdhaUVLSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUFvMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQURCRUFnQkNnQ1pDRUtEQU1MSUFRb0FtZ2hDZ3dCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFZZ0EwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnWkZJQVpxSVFvZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQW8yQW1RTHB5RUNJRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUJCcU5nSThJQVFvQWpnZ0JuUkJBQ0FoYTNZZ0Ftb2hBZ3NnQ3lBUWFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lBdHFOZ0k4SUFRb0FqZ2dCblJCQUNBUmEzWWdBMm9oQXdzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQmtFQUlBZEJHSFlpQ3lBRUtBSThhaUlRYTNZZ0MwRUNkRUdnSFdvb0FnQnhJQWRCLy84RGNXbzJBa3dnQkNBUUlBeEJHSFlpQjJvaUN6WUNQQ0FFSUFkQkFuUkJvQjFxS0FJQUlBWkJBQ0FMYTNaeElBeEIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdaQkdIWWlCeUFFS0FJOGFpSUxOZ0k4SUFRZ0IwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBdHJkbkVnQmtILy93TnhhallDVkNBRVFmQUFhaUFJUVF4c2FpSUdJQW8yQWdnZ0JpQUNOZ0lFSUFZZ0F6WUNBQ0FJUVFGcUlRZ2dBeUFaYWlBQ2FpRVpEQUVMQ3lBSUlCOUlEUU1nRmtFZ2F5RWhJQTRoQndOQUlBUkJPR29RRDBFRFJpQUlJQTlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ1pCRUhZaUkwSC9BWEVoQ2lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklnMUJFSFlpSUVIL0FYRWhFeUFFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRTWdRVUlnaUNCQVFpQ0lweUVMQWtBZ1FrSVFpS2NpREVIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSU1heUlSSUFJZ0FpQVJTeHNpRUNBTWFqWUNQQ0FESUFRb0FqZ2dESFJCQUNBUWEzWWdBaUFRYXlJTWRHb2hFQ0FFUVRocUVBOGFJQUlnRVUwTkFTQUVJQVFvQWp3aUFpQU1hallDUENBRUtBSTRJQUowUVFBZ0RHdDJJQkJxSVJBTUFRc2dCQ0FDSUFRb0Fqd2lFR28yQWp3Z0JDZ0NPQ0FRZEVFQUlBeHJkaUFEYWlFUUlBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlCQTJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FMQkVBZ0JDZ0NaQ0VRREFNTElBUW9BbWdoRUF3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBTWdDMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ05GSUFOcUlSQWdBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUJBMkFtUUxweUVNSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lCTnFOZ0k4SUFRb0FqZ2dBblJCQUNBZ2EzWWdER29oREFzZ0NpQVRha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQXBxTmdJOElBUW9BamdnQW5SQkFDQWphM1lnQzJvaEN3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUFrRUFJQVpCR0hZaUF5QUVLQUk4YWlJS2EzWWdBMEVDZEVHZ0hXb29BZ0J4SUFaQi8vOERjV28yQWt3Z0JDQUtJQTFCR0hZaUEyb2lCallDUENBRUlBTkJBblJCb0IxcUtBSUFJQUpCQUNBR2EzWnhJQTFCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnSkJHSFlpQXlBRUtBSThhaUlHTmdJOElBUWdBMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQVpyZG5FZ0FrSC8vd054YWpZQ1ZBSkFBa0FDUUNBRUtBTGNBU0lESUFSQjhBQnFJQWhCQjNGQkRHeHFJaE1vQWdBaUVXb2lJeUFYU3cwQUlBY2dFeWdDQkNJTklCRnFJZ3BxSUNGTERRQWdDa0VnYWlBV0lBZHJUUTBCQ3lBRUlCTW9BZ2cyQWhnZ0JDQVRLUUlBTndNUUlBY2dGaUFFUVJCcUlBUkIzQUZxSUJjZ0VpQVlJQm9RSHlFS0RBRUxJQWNnRVdvaEFpQVRLQUlJSVFZZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNBSkFJQkZCRVVrTkFDQUhJQU1wQUJBM0FCQWdCeUFES1FBWU53QVlJQkZCRUd0QkVVZ05BQ0FEUVJCcUlRTWdCMEVnYWlFUkEwQWdFU0FES1FBUU53QUFJQkVnQXlrQUdEY0FDQ0FSSUFNcEFDQTNBQkFnRVNBREtRQW9Od0FZSUFOQklHb2hBeUFSUVNCcUloRWdBa2tOQUFzTElBSWdCbXNoQXlBRUlDTTJBdHdCSUFJZ0Vtc2dCa2tFUUNBR0lBSWdHR3RMRFFjZ0dpQWFJQU1nRW1zaUEyb2lFU0FOYWs4RVFDQUNJQkVnRFJBS0dnd0NDeUFESUExcUlRMGdBaUFSUVFBZ0Eyc1FDaUFEYXlFQ0lCSWhBd3NnQmtFUVR3UkFJQUlnQXlrQUFEY0FBQ0FDSUFNcEFBZzNBQWdnRFVFUlNBMEJJQUlnRFdvaEJpQUNRUkJxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQUdTUTBBQ3d3QkN3SkFJQVpCQjAwRVFDQUNJQU10QUFBNkFBQWdBaUFETFFBQk9nQUJJQUlnQXkwQUFqb0FBaUFDSUFNdEFBTTZBQU1nQWlBRElBWkJBblFpQmtIQUhtb29BZ0JxSWdNb0FBQTJBQVFnQXlBR1FlQWVhaWdDQUdzaEF3d0JDeUFDSUFNcEFBQTNBQUFMSUExQkNVa05BQ0FDSUExcUlSRWdBa0VJYWlJR0lBTkJDR29pQTJ0QkQwd0VRQU5BSUFZZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQmtFSWFpSUdJQkZKRFFBTUFnc0FDeUFHSUFNcEFBQTNBQUFnQmlBREtRQUlOd0FJSUExQkdVZ05BQ0FDUVJocUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFSU1EwQUN3c2dDa0dJZjBzRVFDQUtJUWtNQmdVZ0V5QVFOZ0lJSUJNZ0REWUNCQ0FUSUFzMkFnQWdDRUVCYWlFSUlBY2dDbW9oQnlBTElCbHFJQXhxSVJrTUFnc0FDd3NnQ0NBUFNBMERJQWdnSDJzaEJnTkFBa0FnQmlBUFRnUkFRUUFoQXdOQUlBTkJBMFlOQWlBRklBTkJBblFpQW1wQnJOQUJhaUFDSUFScUtBSmtOZ0lBSUFOQkFXb2hBd3dBQ3dBTEFrQUNRQUpBSUFRb0F0d0JJZ01nQkVId0FHb2dCa0VIY1VFTWJHb2lDQ2dDQUNJTWFpSVFJQmRMRFFBZ0J5QUlLQUlFSWdzZ0RHb2lDbW9nSVVzTkFDQUtRU0JxSUJZZ0IydE5EUUVMSUFRZ0NDZ0NDRFlDS0NBRUlBZ3BBZ0EzQXlBZ0J5QVdJQVJCSUdvZ0JFSGNBV29nRnlBU0lCZ2dHaEFmSVFvTUFRc2dCeUFNYWlFQ0lBZ29BZ2doQ0NBSElBTXBBQUEzQUFBZ0J5QURLUUFJTndBSUFrQWdERUVSU1EwQUlBY2dBeWtBRURjQUVDQUhJQU1wQUJnM0FCZ2dERUVRYTBFUlNBMEFJQU5CRUdvaEF5QUhRU0JxSVF3RFFDQU1JQU1wQUJBM0FBQWdEQ0FES1FBWU53QUlJQXdnQXlrQUlEY0FFQ0FNSUFNcEFDZzNBQmdnQTBFZ2FpRURJQXhCSUdvaURDQUNTUTBBQ3dzZ0FpQUlheUVESUFRZ0VEWUMzQUVnQWlBU2F5QUlTUVJBSUFnZ0FpQVlhMHNOQnlBYUlCb2dBeUFTYXlJRGFpSU1JQXRxVHdSQUlBSWdEQ0FMRUFvYURBSUxJQU1nQzJvaEN5QUNJQXhCQUNBRGF4QUtJQU5ySVFJZ0VpRURDeUFJUVJCUEJFQWdBaUFES1FBQU53QUFJQUlnQXlrQUNEY0FDQ0FMUVJGSURRRWdBaUFMYWlFSUlBSkJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBSWdBeTBBQURvQUFDQUNJQU10QUFFNkFBRWdBaUFETFFBQ09nQUNJQUlnQXkwQUF6b0FBeUFDSUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQUlnQXlrQUFEY0FBQXNnQzBFSlNRMEFJQUlnQzJvaERDQUNRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dERWtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQzBFWlNBMEFJQUpCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXhKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdHQlNBR1FRRnFJUVlnQnlBS2FpRUhEQUlMQUFzTElBUW9BdHdCSVFNTFFicC9JUWtnRnlBRGF5SUNJQllnQjJ0TERRSWdCd1IvSUFjZ0F5QUNFQUlnQW1vRlFRQUxJQTVySVFrTUFnc2dCVUVBTmdLYzZ3RUxJQVFnQlNnQzhPb0JJZ00yQXR3QklBa2dEbW9oRENBRElBVW9Bb0RyQVdvaEVBSkFJQTlGQkVBZ0RpRUdEQUVMSUFVb0FyanBBU0VOSUFVb0FyVHBBU0VUSUFVb0FyRHBBU0VTSUFWQkFUWUNoT29CUVFBaEF3TkFJQU5CQTBjRVFDQUVJQU5CQW5RaUFtb2dBaUFGYWtHczBBRnFLQUlBTmdLY0FTQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFmQUFhaUlDSUFjZ0JoQU5RWWgvU3cwQklERWdBaUFGS0FJQUVCNGdNQ0FDSUFVb0FnZ1FIaUF2SUFJZ0JTZ0NCQkFlSUF4QklHc2hHQ0FPSVFZRFFDQUVLQUtJQVNBRUtBS0VBVUVEZEdvcEFnQWlRS2NpQ2tFUWRpSVpRZjhCY1NFTElBUW9BcGdCSUFRb0FwUUJRUU4wYWlrQ0FDSkJweUlXUVJCMkloOUIvd0Z4SVJvZ0JDZ0NrQUVnQkNnQ2pBRkJBM1JxS1FJQUlrSkNJSWluSVFjZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDRUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDZENJSWF5SVJJQUlnQWlBUlN4c2lGeUFJYWpZQ2RDQUhJQVFvQW5BZ0NIUkJBQ0FYYTNZZ0FpQVhheUlYZEdvaENDQUVRZkFBYWhBUEdpQUNJQkZORFFFZ0JDQUVLQUowSWdJZ0YybzJBblFnQkNnQ2NDQUNkRUVBSUJkcmRpQUlhaUVJREFFTElBUWdBaUFFS0FKMEloRnFOZ0owSUFRb0FuQWdFWFJCQUNBSWEzWWdCMm9oQ0NBRVFmQUFhaEFQR2dzZ0JDa0NuQUVoUkNBRUlBZzJBcHdCSUFRZ1JEY0NvQUVNQVFzQ1FDQUNSUVJBSUFNRVFDQUVLQUtjQVNFSURBTUxJQVFvQXFBQklRZ01BUXNnQkNBRUtBSjBJZ0pCQVdvMkFuUUNmeUFISUFORmFpQUVLQUp3SUFKMFFSOTJhaUlDUVFOR0JFQWdCQ2dDbkFGQkFXc01BUXNnQWtFQ2RDQUVhaWdDbkFFTElnZEZJQWRxSVFnZ0FrRUJSd1JBSUFRZ0JDZ0NvQUUyQXFRQkN3c2dCQ0FFS0FLY0FUWUNvQUVnQkNBSU5nS2NBUXVuSVFJZ1FVS0FnUHdIZzFCRkJFQWdCQ0FFS0FKMElnY2dHbW8yQW5RZ0JDZ0NjQ0FIZEVFQUlCOXJkaUFDYWlFQ0N5QUxJQnBxUVJSUEJFQWdCRUh3QUdvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NkQ0lISUF0cU5nSjBJQVFvQW5BZ0IzUkJBQ0FaYTNZZ0Eyb2hBd3NnQkVId0FHb1FEeG9nQkNBRUtBSndJZ2RCQUNBS1FSaDJJZ3NnQkNnQ2RHb2lHbXQySUF0QkFuUkJvQjFxS0FJQWNTQUtRZi8vQTNGcU5nS0VBU0FFSUJvZ0ZrRVlkaUlLYWlJTE5nSjBJQVFnQ2tFQ2RFR2dIV29vQWdBZ0IwRUFJQXRyZG5FZ0ZrSC8vd054YWpZQ2xBRWdCRUh3QUdvUUR4b2dCQ0JDcHlJSFFSaDJJZ29nQkNnQ2RHb2lDellDZENBRUlBcEJBblJCb0IxcUtBSUFJQVFvQW5CQkFDQUxhM1p4SUFkQi8vOERjV28yQW93QklBUWdBellDT0NBRUlBSTJBandnQkNBSU5nSkFBa0FDUUFKQUlBUW9BdHdCSWdzZ0Eyb2lGaUFRU3cwQUlBWWdBaUFEYWlJS2FpQVlTdzBBSUFwQklHb2dEQ0FHYTAwTkFRc2dCQ0FFUVVCcktBSUFOZ0lJSUFRZ0JDa0RPRGNEQUNBR0lBd2dCQ0FFUWR3QmFpQVFJQklnRXlBTkVCOGhDZ3dCQ3lBRElBWnFJUWNnQmlBTEtRQUFOd0FBSUFZZ0N5a0FDRGNBQ0FKQUlBTkJFVWtOQUNBR0lBc3BBQkEzQUJBZ0JpQUxLUUFZTndBWUlBTkJFR3RCRVVnTkFDQUxRUkJxSVFNZ0JrRWdhaUVMQTBBZ0N5QURLUUFRTndBQUlBc2dBeWtBR0RjQUNDQUxJQU1wQUNBM0FCQWdDeUFES1FBb053QVlJQU5CSUdvaEF5QUxRU0JxSWdzZ0Iwa05BQXNMSUFjZ0NHc2hBeUFFSUJZMkF0d0JJQWNnRW1zZ0NFa0VRQ0FJSUFjZ0UydExEUVFnRFNBTklBTWdFbXNpQTJvaUN5QUNhazhFUUNBSElBc2dBaEFLR2d3Q0N5QUhJQXRCQUNBRGF4QUtJQVFnQWlBRGFpSUNOZ0k4SUFOcklRY2dFaUVEQ3lBSVFSQlBCRUFnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0NBQ1FSRklEUUVnQWlBSGFpRUlJQWRCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQWNnQXkwQUFEb0FBQ0FISUFNdEFBRTZBQUVnQnlBRExRQUNPZ0FDSUFjZ0F5MEFBem9BQXlBSElBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFjZ0F5a0FBRGNBQUFzZ0FrRUpTUTBBSUFJZ0Iyb2hDeUFIUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnQzBrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0FrRVpTQTBBSUFkQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF0SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3REN5QUdJQXBxSVFZZ0JFSHdBR29RRHlFRElBOUJBV3NpRHcwQUMwRUFJUUlnQTBFQ1NRMEJBMEFnQWtFRFJ3UkFJQVVnQWtFQ2RDSURha0dzMEFGcUlBTWdCR29vQXB3Qk5nSUFJQUpCQVdvaEFnd0JDd3NnQkNnQzNBRWhBd3RCdW44aENTQVFJQU5ySWdJZ0RDQUdhMHNOQUNBR0JIOGdCaUFESUFJUUFpQUNhZ1ZCQUFzZ0Rtc2hDUXNnQ1VHSWYwc05CZ3NDUUNBRktBTHM2Z0ZGRFFBZ0JTQUZLUU9JNmdFZ0NhMThOd09JNmdFQ1FDQUZLQUxRNmdFaUFpQUphaUlJUVI5TkJFQWdEa1VOQVNBQ0lDSnFJQTRnQ1JBQ0dpQUZLQUxRNmdFZ0NXb2hDQXdCQ3lBT0lRTWdBZ1JBSUFJZ0ltb2dBMEVnSUFKckVBSWFJQVVvQXREcUFTRUNJQVZCQURZQzBPb0JJQVVnQlNrRGtPb0JJQVVwQUxEcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RrT29CSUFVZ0JTa0RtT29CSUFVcEFManFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEbU9vQklBVWdCU2tEb09vQklBVXBBTURxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG9Pb0JJQVVnQlNrRHFPb0JJQVVwQU1qcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RxT29CSUFNZ0FtdEJJR29oQXdzZ0NTQU9haUlDSUFOQklHcFBCRUFnQWtFZ2F5RUdJQVVwQTZqcUFTRS9JQVVwQTZEcUFTRkFJQVVwQTVqcUFTRkJJQVVwQTVEcUFTRkNBMEFnQXlrQUdFTFAxdE8rMHNlcjJVSitJRDk4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVDhnQXlrQUVFTFAxdE8rMHNlcjJVSitJRUI4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUFnQXlrQUNFTFAxdE8rMHNlcjJVSitJRUY4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUVnQXlrQUFFTFAxdE8rMHNlcjJVSitJRUo4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUlnQTBFZ2FpSURJQVpORFFBTElBVWdQemNEcU9vQklBVWdRRGNEb09vQklBVWdRVGNEbU9vQklBVWdRamNEa09vQkN5QUNJQU5ORFFFZ0lpQURJQUlnQTJzaUNCQUNHZ3NnQlNBSU5nTFE2Z0VMSURVZ0ZXc2hBeUFWSUJ0cUlRSWdDU0FPYWlFT0lBUW9BakJGRFFBTElDa3BBd0FpUDBKL1VTQS9JQTRnSFd1c1VYSkZCRUJCYkNFSkRBWUxJQVVvQXVEcEFRUkFRV29oQ1NBRFFRUkpEUVlnQlNnQzZPb0JSUVJBSUNJZ0JTZ0MwT29CYWlFS0FuNGdCU2tEaU9vQklqOUNJRm9FUUNBRktRT1k2Z0VpUUVJSGlTQUZLUU9RNmdFaVFVSUJpWHdnQlNrRG9Pb0JJa0pDRElsOElBVXBBNmpxQVNKRFFoS0pmQ0JCUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlJRUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9mb1ZDaDVXdnI1aTIzcHVlZjM1Q25hTzE2b094allyNkFIMGdRa0xQMXRPKzBzZXIyVUorUWgrSlFvZVZyNitZdHQ2Ym5uOStoVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTQkRRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOURBRUxJQVVwQTZEcUFVTEZ6OW15OGVXNjZpZDhDeUEvZkNFL0lDSWhCZ05BSUFvZ0JrRUlhaUlIVHdSQUlBWXBBQUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9maUEvaFVJYmlVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNFL0lBY2hCZ3dCQ3dzQ1FDQUtJQVpCQkdvaUNFa0VRQ0FHSVFnTUFRc2dCalVBQUVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUlYaVVMUDF0Tyswc2VyMlVKK1F2bnozZkdaOXBtckZud2hQd3NEUUNBSUlBcEpCRUFnQ0RFQUFFTEZ6OW15OGVXNjZpZCtJRCtGUWd1SlFvZVZyNitZdHQ2Ym5uOStJVDhnQ0VFQmFpRUlEQUVMQ3lBQ0tBQUFJRDlDSVlnZ1A0VkN6OWJUdnRMSHE5bENmaUkvUWgySUlEK0ZRdm56M2ZHWjlwbXJGbjRpUDBJZ2lDQS9oYWRIRFFjTElBTkJCR3NoQXlBQ1FRUnFJUUlMSUE0Z0hXc2lDVUdKZjA4TkJDQUJJQWxySVFFZ0NTQWRhaUVkUVFFaFBnd0JDd3RCdUg4aEJ5QUREUVFnSFNBQWF5RUhEQVFMUVd3aENRd0JDMEc0ZnlFSkMwRzRmeUVISUFsQmRrWWdQbkVOQVFzZ0NTRUhDeWdDQUEwQUlBVkIvT29CYWlnQ0FDRUJJQVZCK09vQmFpZ0NBQ0VBSUFVUUdDQUZLQUt3NndFZ0FDQUJFQk1nQlVFQU5nS3c2d0VnQlNnQ3BPc0JJZ0lFUUFKQUFrQUNRQUpBSUFJb0FnQWlBd1JBSUFCRkRRSWdBU0FESUFBUkFnQU1BUXNnQUVVTkFnc2dBU0FDSUFBUkFnQU1BZ3NnQXhBR0N5QUNFQVlMSUFWQkFEWUNwT3NCQ3lBQUJFQWdBU0FGSUFBUkFnQU1BUXNnQlJBR0N5QUVRZUFCYWlRQUlBY0xDNmdWQ1FCQmlBZ0xEUUVBQUFBQkFBQUFBZ0FBQUFJQVFhQUlDN01HQVFBQUFBRUFBQUFDQUFBQUFnQUFBQ1lBQUFDQ0FBQUFJUVVBQUVvQUFBQm5DQUFBSmdBQUFNQUJBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFLUUFBQUN3Q0FBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUx3QUFBTW9DQUFDQUFBQUFpZ1VBQUVvQUFBQ0VDUUFBTlFBQUFITURBQUNBQUFBQW5RVUFBRW9BQUFDZ0NRQUFQUUFBQUlFREFBQ0FBQUFBNndVQUFFc0FBQUErQ2dBQVJBQUFBSjREQUFDQUFBQUFUUVlBQUVzQUFBQ3FDZ0FBU3dBQUFMTURBQUNBQUFBQXdRWUFBRTBBQUFBZkRRQUFUUUFBQUZNRUFBQ0FBQUFBSXdnQUFGRUFBQUNtRHdBQVZBQUFBSmtFQUFDQUFBQUFTd2tBQUZjQUFBQ3hFZ0FBV0FBQUFOb0VBQUNBQUFBQWJ3a0FBRjBBQUFBakZBQUFWQUFBQUVVRkFBQ0FBQUFBVkFvQUFHb0FBQUNNRkFBQWFnQUFBSzhGQUFDQUFBQUFkZ2tBQUh3QUFBQk9FQUFBZkFBQUFOSUNBQUNBQUFBQVl3Y0FBSkVBQUFDUUJ3QUFrZ0FBQUFBQUFBQUJBQUFBQVFBQUFBVUFBQUFOQUFBQUhRQUFBRDBBQUFCOUFBQUEvUUFBQVAwQkFBRDlBd0FBL1FjQUFQMFBBQUQ5SHdBQS9UOEFBUDEvQUFEOS93QUEvZjhCQVAzL0F3RDkvd2NBL2Y4UEFQMy9Id0Q5L3o4QS9mOS9BUDMvL3dEOS8vOEIvZi8vQS8zLy93ZjkvLzhQL2YvL0gvMy8vei85Ly85L0FBQUFBQUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFSQUFBQUVnQUFBQk1BQUFBVUFBQUFGUUFBQUJZQUFBQVhBQUFBR0FBQUFCa0FBQUFhQUFBQUd3QUFBQndBQUFBZEFBQUFIZ0FBQUI4QUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQkVBQUFBU0FBQUFFd0FBQUJRQUFBQVZBQUFBRmdBQUFCY0FBQUFZQUFBQUdRQUFBQm9BQUFBYkFBQUFIQUFBQUIwQUFBQWVBQUFBSHdBQUFDQUFBQUFoQUFBQUlnQUFBQ01BQUFBbEFBQUFKd0FBQUNrQUFBQXJBQUFBTHdBQUFETUFBQUE3QUFBQVF3QUFBRk1BQUFCakFBQUFnd0FBQUFNQkFBQURBZ0FBQXdRQUFBTUlBQUFERUFBQUF5QUFBQU5BQUFBRGdBQUFBd0FCQUVIZ0R3dFJBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFVQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QUFBQXdBQUFBTkFBQUFEZ0FBQUE4QUFBQVFBRUhFRUF1TEFRRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVNBQUFBRkFBQUFCWUFBQUFZQUFBQUhBQUFBQ0FBQUFBb0FBQUFNQUFBQUVBQUFBQ0FBQUFBQUFFQUFBQUNBQUFBQkFBQUFBZ0FBQUFRQUFBQUlBQUFBRUFBQUFDQUFBQUFBQUVBUVpBU0MrWUVBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQUJBQUFBQkFBQUFBZ0FBQUFBQUFBQUFRQUJBUVlBQUFBQUFBQUVBQUFBQUJBQUFBUUFBQUFBSUFBQUJRRUFBQUFBQUFBRkF3QUFBQUFBQUFVRUFBQUFBQUFBQlFZQUFBQUFBQUFGQndBQUFBQUFBQVVKQUFBQUFBQUFCUW9BQUFBQUFBQUZEQUFBQUFBQUFBWU9BQUFBQUFBQkJSQUFBQUFBQUFFRkZBQUFBQUFBQVFVV0FBQUFBQUFDQlJ3QUFBQUFBQU1GSUFBQUFBQUFCQVV3QUFBQUlBQUdCVUFBQUFBQUFBY0ZnQUFBQUFBQUNBWUFBUUFBQUFBS0JnQUVBQUFBQUF3R0FCQUFBQ0FBQUFRQUFBQUFBQUFBQkFFQUFBQUFBQUFGQWdBQUFDQUFBQVVFQUFBQUFBQUFCUVVBQUFBZ0FBQUZCd0FBQUFBQUFBVUlBQUFBSUFBQUJRb0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFJQUFCQlJBQUFBQUFBQUVGRWdBQUFDQUFBUVVXQUFBQUFBQUNCUmdBQUFBZ0FBTUZJQUFBQUFBQUF3VW9BQUFBQUFBR0JFQUFBQUFRQUFZRVFBQUFBQ0FBQndXQUFBQUFBQUFKQmdBQ0FBQUFBQXNHQUFnQUFEQUFBQVFBQUFBQUVBQUFCQUVBQUFBZ0FBQUZBZ0FBQUNBQUFBVURBQUFBSUFBQUJRVUFBQUFnQUFBRkJnQUFBQ0FBQUFVSUFBQUFJQUFBQlFrQUFBQWdBQUFGQ3dBQUFDQUFBQVVNQUFBQUFBQUFCZzhBQUFBZ0FBRUZFZ0FBQUNBQUFRVVVBQUFBSUFBQ0JSZ0FBQUFnQUFJRkhBQUFBQ0FBQXdVb0FBQUFJQUFFQlRBQUFBQUFBQkFHQUFBQkFBQUFEd1lBZ0FBQUFBQU9CZ0JBQUFBQUFBMEdBQ0FBUVlBWEM0Y0NBUUFCQVFVQUFBQUFBQUFGQUFBQUFBQUFCZ1E5QUFBQUFBQUpCZjBCQUFBQUFBOEYvWDhBQUFBQUZRWDkveDhBQUFBREJRVUFBQUFBQUFjRWZRQUFBQUFBREFYOUR3QUFBQUFTQmYzL0F3QUFBQmNGL2Y5L0FBQUFCUVVkQUFBQUFBQUlCUDBBQUFBQUFBNEYvVDhBQUFBQUZBWDkvdzhBQUFBQ0JRRUFBQUFRQUFjRWZRQUFBQUFBQ3dYOUJ3QUFBQUFSQmYzL0FRQUFBQllGL2Y4L0FBQUFCQVVOQUFBQUVBQUlCUDBBQUFBQUFBMEYvUjhBQUFBQUV3WDkvd2NBQUFBQkJRRUFBQUFRQUFZRVBRQUFBQUFBQ2dYOUF3QUFBQUFRQmYzL0FBQUFBQndGL2YvL0R3QUFHd1g5Ly84SEFBQWFCZjMvL3dNQUFCa0YvZi8vQVFBQUdBWDkvLzhBUVpBWkM0WUVBUUFCQVFZQUFBQUFBQUFHQXdBQUFBQUFBQVFFQUFBQUlBQUFCUVVBQUFBQUFBQUZCZ0FBQUFBQUFBVUlBQUFBQUFBQUJRa0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFBQUFBQmhBQUFBQUFBQUFHRXdBQUFBQUFBQVlXQUFBQUFBQUFCaGtBQUFBQUFBQUdIQUFBQUFBQUFBWWZBQUFBQUFBQUJpSUFBQUFBQUFFR0pRQUFBQUFBQVFZcEFBQUFBQUFDQmk4QUFBQUFBQU1HT3dBQUFBQUFCQVpUQUFBQUFBQUhCb01BQUFBQUFBa0dBd0lBQUJBQUFBUUVBQUFBQUFBQUJBVUFBQUFnQUFBRkJnQUFBQUFBQUFVSEFBQUFJQUFBQlFrQUFBQUFBQUFGQ2dBQUFBQUFBQVlNQUFBQUFBQUFCZzhBQUFBQUFBQUdFZ0FBQUFBQUFBWVZBQUFBQUFBQUJoZ0FBQUFBQUFBR0d3QUFBQUFBQUFZZUFBQUFBQUFBQmlFQUFBQUFBQUVHSXdBQUFBQUFBUVluQUFBQUFBQUNCaXNBQUFBQUFBTUdNd0FBQUFBQUJBWkRBQUFBQUFBRkJtTUFBQUFBQUFnR0F3RUFBQ0FBQUFRRUFBQUFNQUFBQkFRQUFBQVFBQUFFQlFBQUFDQUFBQVVIQUFBQUlBQUFCUWdBQUFBZ0FBQUZDZ0FBQUNBQUFBVUxBQUFBQUFBQUJnNEFBQUFBQUFBR0VRQUFBQUFBQUFZVUFBQUFBQUFBQmhjQUFBQUFBQUFHR2dBQUFBQUFBQVlkQUFBQUFBQUFCaUFBQUFBQUFCQUdBd0FCQUFBQUR3WURnQUFBQUFBT0JnTkFBQUFBQUEwR0F5QUFBQUFBREFZREVBQUFBQUFMQmdNSUFBQUFBQW9HQXdRQVFhUWRDOWtCQVFBQUFBTUFBQUFIQUFBQUR3QUFBQjhBQUFBL0FBQUFmd0FBQVA4QUFBRC9BUUFBL3dNQUFQOEhBQUQvRHdBQS94OEFBUDgvQUFEL2Z3QUEvLzhBQVAvL0FRRC8vd01BLy84SEFQLy9Ed0QvL3g4QS8vOC9BUC8vZndELy8vOEEvLy8vQWYvLy93UC8vLzhILy8vL0QvLy8veC8vLy84Ly8vLy9md0FBQUFBQkFBQUFBZ0FBQUFRQUFBQUFBQUFBQWdBQUFBUUFBQUFJQUFBQUFBQUFBQUVBQUFBQ0FBQUFBUUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQWdBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dCQmdCOExBNEFSQVE9PSI7dmFyIG9lPW5ldyBKQSxnZT0hMTthc3luYyBmdW5jdGlvbiBqSShBLHQsZSl7bGV0IEk9bnVsbDt0eXBlb2YgQSE9InN0cmluZyI/ST1BLmhyZWY6QS5zdGFydHNXaXRoKCJodHRwIik/ST1BOkk9YCR7dH0vJHtBfWAsSS5lbmRzV2l0aCgiLmpzIikmJihJPUkuc3Vic3RyaW5nKDAsSS5sZW5ndGgtMykpLEkuZW5kc1dpdGgoIi53YXNtIikmJihJPUkuc3Vic3RyaW5nKDAsSS5sZW5ndGgtNSkpLEkuZW5kc1dpdGgoIi53YXNtLnpzdCIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTkpKTtsZXQgcj1gJHtJfS53YXNtYCxvPWF3YWl0IGJBLmdldChgJHtyfS56c3RgLHtyZXNwb25zZVR5cGU6ImFycmF5YnVmZmVyIixwYXJhbXM6ZX0pO2dlfHwoYXdhaXQgb2UuaW5pdCgpLGdlPSEwKTtsZXQgQz1vZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoby5kYXRhKSkuYnVmZmVyO3JldHVybihhd2FpdCBpbXBvcnQoYCR7SX0uanNgKSkuZGVmYXVsdCh7d2FzbUJpbmFyeTpDfSl9dmFyIGllPWpJO3ZhciBIQT1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIFpJKEEsdCxlKXtsZXQgST1BLHI9QSxvPW51bGw7cmV0dXJuIHR5cGVvZiBBIT0ic3RyaW5nIiYmKEk9bmV3IFVSTChBLmhyZWYpLHI9SS5ocmVmKSxIQS5oYXMocik/bz1hd2FpdCBIQS5nZXQocik6KEhBLnNldChyLGllKEksdCxlKSksbz1hd2FpdCBIQS5nZXQocikpLG99dmFyIHNlPVpJO3ZhciBWST17VGV4dEZpbGU6IlRleHRGaWxlIixCaW5hcnlGaWxlOiJCaW5hcnlGaWxlIixUZXh0U3RyZWFtOiJUZXh0U3RyZWFtIixCaW5hcnlTdHJlYW06IkJpbmFyeVN0cmVhbSIsSW1hZ2U6IkltYWdlIixQb2ludFNldDoiUG9pbnRTZXQiLE1lc2g6Ik1lc2giLFBvbHlEYXRhOiJQb2x5RGF0YSIsVHJhbnNmb3JtTGlzdDoiVHJhbnNmb3JtTGlzdCIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0sRD1WSTt2YXIgWEk9e0ludDg6ImludDgiLFVJbnQ4OiJ1aW50OCIsSW50MTY6ImludDE2IixVSW50MTY6InVpbnQxNiIsSW50MzI6ImludDMyIixVSW50MzI6InVpbnQzMiIsSW50NjQ6ImludDY0IixVSW50NjQ6InVpbnQ2NCIsU2l6ZVZhbHVlVHlwZToidWludDY0IixJZGVudGlmaWVyVHlwZToidWludDY0IixJbmRleFZhbHVlVHlwZToiaW50NjQiLE9mZnNldFZhbHVlVHlwZToiaW50NjQifSxOPVhJO3ZhciBfST17RmxvYXQzMjoiZmxvYXQzMiIsRmxvYXQ2NDoiZmxvYXQ2NCIsU3BhY2VQcmVjaXNpb25UeXBlOiJmbG9hdDY0In0sUD1fSTtmdW5jdGlvbiB6SShBLHQpe2xldCBlPW51bGw7c3dpdGNoKEEpe2Nhc2UgTi5VSW50ODp7ZT1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIE4uSW50ODp7ZT1uZXcgSW50OEFycmF5KHQpO2JyZWFrfWNhc2UgTi5VSW50MTY6e2U9bmV3IFVpbnQxNkFycmF5KHQpO2JyZWFrfWNhc2UgTi5JbnQxNjp7ZT1uZXcgSW50MTZBcnJheSh0KTticmVha31jYXNlIE4uVUludDMyOntlPW5ldyBVaW50MzJBcnJheSh0KTticmVha31jYXNlIE4uSW50MzI6e2U9bmV3IEludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBOLlVJbnQ2NDp7dHlwZW9mIGdsb2JhbFRoaXMuQmlnVWludDY0QXJyYXk9PSJmdW5jdGlvbiI/ZT1uZXcgQmlnVWludDY0QXJyYXkodCk6ZT1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIE4uSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ0ludDY0QXJyYXk9PSJmdW5jdGlvbiI/ZT1uZXcgQmlnSW50NjRBcnJheSh0KTplPW5ldyBVaW50OEFycmF5KHQpO2JyZWFrfWNhc2UgUC5GbG9hdDMyOntlPW5ldyBGbG9hdDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBQLkZsb2F0NjQ6e2U9bmV3IEZsb2F0NjRBcnJheSh0KTticmVha31jYXNlIm51bGwiOntlPW51bGw7YnJlYWt9Y2FzZSBudWxsOntlPW51bGw7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlR5cGUgaXMgbm90IHN1cHBvcnRlZCBhcyBhIFR5cGVkQXJyYXkiKX1yZXR1cm4gZX12YXIgSj16STt2YXIgQmU9dHlwZW9mIGdsb2JhbFRoaXMuU2hhcmVkQXJyYXlCdWZmZXI9PSJmdW5jdGlvbiIsbmU9bmV3IFRleHRFbmNvZGVyLENlPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTtmdW5jdGlvbiB2SShBLHQpe2xldCBlPXtmbGFnczoiciIsZW5jb2Rpbmc6ImJpbmFyeSJ9LEk9QS5mc19vcGVuKHQsZS5mbGFncyksbz1BLmZzX3N0YXQodCkuc2l6ZSxnPW51bGw7QmU/Zz1uZXcgU2hhcmVkQXJyYXlCdWZmZXIobyk6Zz1uZXcgQXJyYXlCdWZmZXIobyk7bGV0IEM9bmV3IFVpbnQ4QXJyYXkoZyk7cmV0dXJuIEEuZnNfcmVhZChJLEMsMCxvLDApLEEuZnNfY2xvc2UoSSksQ31mdW5jdGlvbiBhZShBLHQsZSl7bGV0IEk9bnVsbDtCZT9JPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKTpJPW5ldyBBcnJheUJ1ZmZlcihlKTtsZXQgcj1uZXcgVWludDhBcnJheShJKSxvPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcix0LGUpO3JldHVybiByLnNldChvKSxyfWZ1bmN0aW9uIHAoQSx0LGUsSSl7bGV0IHI9MDtyZXR1cm4gdCE9PW51bGwmJihyPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2FycmF5X2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsSSx0LmJ1ZmZlci5ieXRlTGVuZ3RoXSksQS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxyKSkscn1mdW5jdGlvbiBLKEEsdCxlKXtsZXQgST1KU09OLnN0cmluZ2lmeSh0KSxyPUEubGVuZ3RoQnl0ZXNVVEY4KEkpKzEsbz1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9qc29uX2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUscl0pO0Euc3RyaW5nVG9VVEY4KEksbyxyKX1mdW5jdGlvbiBGKEEsdCxlLEkpe2xldCByPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsZV0pLG89QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxlXSksZz1hZShBLHIsbyk7cmV0dXJuIEooSSxnLmJ1ZmZlcil9ZnVuY3Rpb24gQ0EoQSx0KXtsZXQgZT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfanNvbl9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciJdLFswLHRdKSxJPUEuVVRGOFRvU3RyaW5nKGUpO3JldHVybiBKU09OLnBhcnNlKEkpfWZ1bmN0aW9uICRJKEEsdCxlLEkpe0khPW51bGwmJkkubGVuZ3RoPjAmJkkuZm9yRWFjaChmdW5jdGlvbihhLHMpe3N3aXRjaChhLnR5cGUpe2Nhc2UgRC5UZXh0U3RyZWFtOntsZXQgbj1uZS5lbmNvZGUoYS5kYXRhLmRhdGEpLGY9cChBLG4scywwKSxCPXtzaXplOm4uYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07SyhBLEIscyk7YnJlYWt9Y2FzZSBELkpzb25Db21wYXRpYmxlOntsZXQgbj1uZS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoYS5kYXRhKSksZj1wKEEsbixzLDApLEI9e3NpemU6bi5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtLKEEsQixzKTticmVha31jYXNlIEQuQmluYXJ5U3RyZWFtOntsZXQgbj1hLmRhdGEuZGF0YSxmPXAoQSxuLHMsMCksQj17c2l6ZTpuLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O0soQSxCLHMpO2JyZWFrfWNhc2UgRC5UZXh0RmlsZTp7QS5mc193cml0ZUZpbGUoYS5kYXRhLnBhdGgsYS5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgRC5CaW5hcnlGaWxlOntBLmZzX3dyaXRlRmlsZShhLmRhdGEucGF0aCxhLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBELkltYWdlOntsZXQgbj1hLmRhdGEsZj1wKEEsbi5kYXRhLHMsMCksQj1wKEEsbi5kaXJlY3Rpb24scywxKSxRPXR5cGVvZiBuLm1ldGFkYXRhPy5lbnRyaWVzPCJ1Ij9BcnJheS5mcm9tKG4ubWV0YWRhdGEuZW50cmllcygpKTpbXSxsPXtpbWFnZVR5cGU6bi5pbWFnZVR5cGUsbmFtZTpuLm5hbWUsb3JpZ2luOm4ub3JpZ2luLHNwYWNpbmc6bi5zcGFjaW5nLGRpcmVjdGlvbjpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YCxzaXplOm4uc2l6ZSxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG1ldGFkYXRhOlF9O0soQSxsLHMpO2JyZWFrfWNhc2UgRC5NZXNoOntsZXQgbj1hLmRhdGEsZj1wKEEsbi5wb2ludHMscywwKSxCPXAoQSxuLmNlbGxzLHMsMSksUT1wKEEsbi5wb2ludERhdGEscywyKSxsPXAoQSxuLmNlbGxEYXRhLHMsMyksYz17bWVzaFR5cGU6bi5tZXNoVHlwZSxuYW1lOm4ubmFtZSxudW1iZXJPZlBvaW50czpuLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxudW1iZXJPZkNlbGxzOm4ubnVtYmVyT2ZDZWxscyxjZWxsczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YCxjZWxsQnVmZmVyU2l6ZTpuLmNlbGxCdWZmZXJTaXplLG51bWJlck9mUG9pbnRQaXhlbHM6bi5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke1F9YCxudW1iZXJPZkNlbGxQaXhlbHM6bi5udW1iZXJPZkNlbGxQaXhlbHMsY2VsbERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWB9O0soQSxjLHMpO2JyZWFrfWNhc2UgRC5Qb2ludFNldDp7bGV0IG49YS5kYXRhLGY9cChBLG4ucG9pbnRzLHMsMCksQj1wKEEsbi5wb2ludERhdGEscywxKSxRPXtwb2ludFNldFR5cGU6bi5wb2ludFNldFR5cGUsbmFtZTpuLm5hbWUsbnVtYmVyT2ZQb2ludHM6bi5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbnVtYmVyT2ZQb2ludFBpeGVsczpuLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gfTtLKEEsUSxzKTticmVha31jYXNlIEQuVHJhbnNmb3JtTGlzdDp7bGV0IG49YS5kYXRhLGY9W10sQj0wO24uZm9yRWFjaChRPT57bGV0IGw9IiIsYz0iIjtRLnRyYW5zZm9ybVR5cGUudHJhbnNmb3JtUGFyYW1ldGVyaXphdGlvbiE9PSJDb21wb3NpdGUiJiYobD1gZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3AoQSxRLmZpeGVkUGFyYW1ldGVycyxzLEIpfWAsQis9MSxjPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7cChBLFEucGFyYW1ldGVycyxzLEIpfWAsQis9MSk7bGV0IGQ9e3RyYW5zZm9ybVR5cGU6US50cmFuc2Zvcm1UeXBlLG51bWJlck9mRml4ZWRQYXJhbWV0ZXJzOlEubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnMsbnVtYmVyT2ZQYXJhbWV0ZXJzOlEubnVtYmVyT2ZQYXJhbWV0ZXJzLG5hbWU6US5uYW1lLGlucHV0U3BhY2VOYW1lOlEuaW5wdXRTcGFjZU5hbWUsb3V0cHV0U3BhY2VOYW1lOlEub3V0cHV0U3BhY2VOYW1lLHBhcmFtZXRlcnM6YyxmaXhlZFBhcmFtZXRlcnM6bH07Zi5wdXNoKGQpfSksSyhBLGYscyk7YnJlYWt9Y2FzZSBELlBvbHlEYXRhOntsZXQgbj1hLmRhdGEsZj1wKEEsbi5wb2ludHMscywwKSxCPXAoQSxuLnZlcnRpY2VzLHMsMSksUT1wKEEsbi5saW5lcyxzLDIpLGw9cChBLG4ucG9seWdvbnMscywzKSxjPXAoQSxuLnRyaWFuZ2xlU3RyaXBzLHMsNCksZD1wKEEsbi5wb2ludERhdGEscyw1KSx5PXAoQSxuLnBvaW50RGF0YSxzLDYpLG09e3BvbHlEYXRhVHlwZTpuLnBvbHlEYXRhVHlwZSxuYW1lOm4ubmFtZSxudW1iZXJPZlBvaW50czpuLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6bi52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWAsbGluZXNCdWZmZXJTaXplOm4ubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gLHBvbHlnb25zQnVmZmVyU2l6ZTpuLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6bi50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsbnVtYmVyT2ZQb2ludFBpeGVsczpuLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7ZH1gLG51bWJlck9mQ2VsbFBpeGVsczpuLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3l9YH07SyhBLG0scyk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IHI9QS5zdGFja1NhdmUoKSxvPTA7dHJ5e289QS5jYWxsTWFpbih0LnNsaWNlKCkpfWNhdGNoKGEpe3Rocm93IHR5cGVvZiBhPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKGEpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLGF9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShyKX1sZXQgZz1BLmdldE1vZHVsZVN0ZG91dCgpLEM9QS5nZXRNb2R1bGVTdGRlcnIoKSxFPVtdO3JldHVybiBlIT1udWxsJiZlLmxlbmd0aD4wJiZvPT09MCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGEscyl7bGV0IG49bnVsbDtzd2l0Y2goYS50eXBlKXtjYXNlIEQuVGV4dFN0cmVhbTp7bGV0IEI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSksUT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKSxsPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixCLFEpO249e2RhdGE6Q2UuZGVjb2RlKGwpfTticmVha31jYXNlIEQuSnNvbkNvbXBhdGlibGU6e2xldCBCPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pLFE9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSksbD1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQixRKTtuPUpTT04ucGFyc2UoQ2UuZGVjb2RlKGwpKTticmVha31jYXNlIEQuQmluYXJ5U3RyZWFtOntsZXQgQj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKSxRPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pO249e2RhdGE6YWUoQSxCLFEpfTticmVha31jYXNlIEQuVGV4dEZpbGU6e249e3BhdGg6YS5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKGEuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBELkJpbmFyeUZpbGU6e249e3BhdGg6YS5kYXRhLnBhdGgsZGF0YTp2SShBLGEuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBELkltYWdlOntsZXQgQj1DQShBLHMpO0IuZGF0YT1GKEEscywwLEIuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEIuZGlyZWN0aW9uPUYoQSxzLDEsUC5GbG9hdDY0KSxCLm1ldGFkYXRhPW5ldyBNYXAoQi5tZXRhZGF0YSksbj1CO2JyZWFrfWNhc2UgRC5NZXNoOntsZXQgQj1DQShBLHMpO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1GKEEscywwLEIubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpCLnBvaW50cz1KKEIubWVzaFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZkNlbGxzPjA/Qi5jZWxscz1GKEEscywxLEIubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUpOkIuY2VsbHM9SihCLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qi5wb2ludERhdGE9RihBLHMsMixCLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpCLnBvaW50RGF0YT1KKEIubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbFBpeGVscz4wP0IuY2VsbERhdGE9RihBLHMsMyxCLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkIuY2VsbERhdGE9SihCLm1lc2hUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxuPUI7YnJlYWt9Y2FzZSBELlBvaW50U2V0OntsZXQgQj1DQShBLHMpO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1GKEEscywwLEIucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qi5wb2ludHM9SihCLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mUG9pbnRQaXhlbHM+MD9CLnBvaW50RGF0YT1GKEEscywxLEIucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTpCLnBvaW50RGF0YT1KKEIucG9pbnRTZXRUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksbj1CO2JyZWFrfWNhc2UgRC5UcmFuc2Zvcm1MaXN0OntsZXQgQj1DQShBLHMpLFE9MDtCLmZvckVhY2goKGwsYyk9PntsLnRyYW5zZm9ybVR5cGUudHJhbnNmb3JtUGFyYW1ldGVyaXphdGlvbiE9PSJDb21wb3NpdGUiJiYobC5udW1iZXJPZkZpeGVkUGFyYW1ldGVycz4wJiYoQltjXS5maXhlZFBhcmFtZXRlcnM9RihBLHMsUSxQLkZsb2F0NjQpKSxRKz0xLGwubnVtYmVyT2ZQYXJhbWV0ZXJzPjAmJihCW2NdLnBhcmFtZXRlcnM9RihBLHMsUSxsLnRyYW5zZm9ybVR5cGUucGFyYW1ldGVyc1ZhbHVlVHlwZSkpLFErPTEpfSksbj1CO2JyZWFrfWNhc2UgRC5Qb2x5RGF0YTp7bGV0IEI9Q0EoQSxzKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9RihBLHMsMCxQLkZsb2F0MzIpOkIucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksQi52ZXJ0aWNlc0J1ZmZlclNpemU+MD9CLnZlcnRpY2VzPUYoQSxzLDEsTi5VSW50MzIpOkIudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEIubGluZXNCdWZmZXJTaXplPjA/Qi5saW5lcz1GKEEscywyLE4uVUludDMyKTpCLmxpbmVzPW5ldyBVaW50MzJBcnJheSxCLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0IucG9seWdvbnM9RihBLHMsMyxOLlVJbnQzMik6Qi5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksQi50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9CLnRyaWFuZ2xlU3RyaXBzPUYoQSxzLDQsTi5VSW50MzIpOkIudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPUYoQSxzLDUsQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkIucG9pbnREYXRhPUooQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbFBpeGVscz4wP0IuY2VsbERhdGE9RihBLHMsNixCLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpCLmNlbGxEYXRhPUooQi5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLG49QjticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBmPXt0eXBlOmEudHlwZSxkYXRhOm59O0UucHVzaChmKX0pLHtyZXR1cm5WYWx1ZTpvLHN0ZG91dDpnLHN0ZGVycjpDLG91dHB1dHM6RX19dmFyIFFlPSRJO3ZhciBBcj10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gdHIoQSx0KXtpZihBPT1udWxsKXJldHVybltdO2xldCBlPVtdO2ZvcihsZXQgST0wO0k8QS5sZW5ndGg7SSsrKXtsZXQgcj1lcihBW0ldLHQpO3IhPT1udWxsJiZlLnB1c2gocil9cmV0dXJuIGV9ZnVuY3Rpb24gZXIoQSx0KXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCBlPW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP2U9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYoZT1BKSxBciYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6dD9lOmUuc2xpY2UoMCl9dmFyIEVlPXRyO2Z1bmN0aW9uIElyKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBjZT1JcjtmdW5jdGlvbiBycihBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgZmU9cnI7ZnVuY3Rpb24gb3IoQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGxlPW9yO2FzeW5jIGZ1bmN0aW9uIGdyKEEsdCxlLEkpe2xldCByPVFlKEEsdCxlLEkpLG89W107cmV0dXJuIHIub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2lmKGcudHlwZT09PUQuQmluYXJ5U3RyZWFtfHxnLnR5cGU9PT1ELkJpbmFyeUZpbGUpe2xldCBDPWcuZGF0YTtvLnB1c2goQyl9ZWxzZSBpZihnLnR5cGU9PT1ELkltYWdlKXtsZXQgQz1nLmRhdGE7by5wdXNoKC4uLmNlKEMpKX1lbHNlIGlmKGcudHlwZT09PUQuTWVzaCl7bGV0IEM9Zy5kYXRhO28ucHVzaCguLi5mZShDKSl9ZWxzZSBpZihnLnR5cGU9PT1ELlBvbHlEYXRhKXtsZXQgQz1nLmRhdGE7by5wdXNoKC4uLmxlKEMpKX19KSxNQShyLEVlKG8sITApKX12YXIgdWU9Z3I7dmFyIGlyPXtydW5QaXBlbGluZTphc3luYyBmdW5jdGlvbihBLHQsZSxJLHIsbyl7bGV0IGc9YXdhaXQgc2UoQSx0LG8pO3JldHVybiBhd2FpdCB1ZShnLGUsSSxyKX19O2xBKGlyKTslMEEvKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOiUwQSUwQWNvbWxpbmsvZGlzdC9lc20vY29tbGluay5tanM6JTBBICAoKiolMEEgICAqIEBsaWNlbnNlJTBBICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDJTBBICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCUwQSAgICopJTBBKi8lMEEnO090KEt0KTtleHBvcnR7eHIgYXMgZGVmYXVsdFBhcmFtZXRlck1hcCxXciBhcyBlbGFzdGl4LHEgYXMgZ2V0RGVmYXVsdFdlYldvcmtlcixOIGFzIGdldFBpcGVsaW5lV29ya2VyVXJsLEggYXMgZ2V0UGlwZWxpbmVzQmFzZVVybCx2ciBhcyByZWFkUGFyYW1ldGVyRmlsZXMsVWEgYXMgc2V0RGVmYXVsdFdlYldvcmtlcixPdCBhcyBzZXRQaXBlbGluZVdvcmtlclVybCxEYSBhcyBzZXRQaXBlbGluZXNCYXNlVXJsLFZyIGFzIHRyYW5zZm9ybWl4LGp0IGFzIHZlcnNpb24senIgYXMgd3JpdGVQYXJhbWV0ZXJGaWxlc307Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246Cgpjb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAgICopCiovCg==""" default_config = JsPackageConfig(default_js_module) js_package = JsPackage(default_config) diff --git a/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/transformix_async.py b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/transformix_async.py new file mode 100644 index 0000000..7d81d90 --- /dev/null +++ b/wasm/python/itkwasm-elastix-emscripten/itkwasm_elastix_emscripten/transformix_async.py @@ -0,0 +1,78 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path +import os +from typing import Dict, Tuple, Optional, List, Any + +from .js_package import js_package + +from itkwasm.pyodide import ( + to_js, + to_py, + js_resources +) +from itkwasm import ( + InterfaceTypes, + Image, +) + +async def transformix_async( + moving: Image, + transform_parameter_object: Any, + output_origin: Optional[List[float]] = None, + output_spacing: Optional[List[float]] = None, + output_size: Optional[List[int]] = None, + output_direction: Optional[List[float]] = None, +) -> Image: + """Apply an elastix transform parameter object to an image. + + :param moving: Moving image + :type moving: Image + + :param transform_parameter_object: Elastix transform parameter object to apply. Only provide this or an initial transform. + :type transform_parameter_object: Any + + :param output_origin: Output image origin. + :type output_origin: float + + :param output_spacing: Output image spacing. + :type output_spacing: float + + :param output_size: Output image size. + :type output_size: int + + :param output_direction: Output image orientation direction matrix. + :type output_direction: float + + :return: Resampled moving image + :rtype: Image + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if output_origin: + kwargs["outputOrigin"] = to_js(output_origin) + if output_spacing: + kwargs["outputSpacing"] = to_js(output_spacing) + if output_size: + kwargs["outputSize"] = to_js(output_size) + if output_direction: + kwargs["outputDirection"] = to_js(output_direction) + + outputs = await js_module.transformix(to_js(moving), to_js(transform_parameter_object), webWorker=web_worker, noCopy=True, **kwargs) + + output_web_worker = None + output_list = [] + outputs_object_map = outputs.as_object_map() + for output_name in outputs.object_keys(): + if output_name == 'webWorker': + output_web_worker = outputs_object_map[output_name] + else: + output_list.append(to_py(outputs_object_map[output_name])) + + js_resources.web_worker = output_web_worker + + if len(output_list) == 1: + return output_list[0] + return tuple(output_list) diff --git a/wasm/python/itkwasm-elastix-emscripten/pixi.lock b/wasm/python/itkwasm-elastix-emscripten/pixi.lock index 6326485..5598914 100644 --- a/wasm/python/itkwasm-elastix-emscripten/pixi.lock +++ b/wasm/python/itkwasm-elastix-emscripten/pixi.lock @@ -29,7 +29,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - pypi: https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/54/0fc399d374f1ee6e8494548419fe924188c7c7a04b646018c9818a6509e1/itkwasm-1.0b189-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/b4/a033892666fdafb6f7b054249abc6c3b1b093697a36b47be252677d99525/itkwasm-1.0b191-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/f3/61eeef119beb37decb58e7cb29940f19a1464b8608f2cab8a8616aba75fd/numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl @@ -69,11 +69,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tar-1.34-hb2e2bae_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - pypi: https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl @@ -95,7 +98,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/54/0fc399d374f1ee6e8494548419fe924188c7c7a04b646018c9818a6509e1/itkwasm-1.0b189-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d5/b4/a033892666fdafb6f7b054249abc6c3b1b093697a36b47be252677d99525/itkwasm-1.0b191-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/d2/40/11b7bc1898cf1dcb87ccbe09b39f5088634ac78bb25f3383ff541c2b40aa/jaraco.context-5.3.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b1/54/7623e24ffc63730c3a619101361b08860c6b7c7cfc1aef6edb66d80ed708/jaraco.functools-4.0.2-py3-none-any.whl @@ -516,10 +519,10 @@ packages: version: 2.0.0 sha256: b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/fc/54/0fc399d374f1ee6e8494548419fe924188c7c7a04b646018c9818a6509e1/itkwasm-1.0b189-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/d5/b4/a033892666fdafb6f7b054249abc6c3b1b093697a36b47be252677d99525/itkwasm-1.0b191-py3-none-any.whl name: itkwasm - version: 1.0b189 - sha256: 2ae8d05bfb4e4d86edc73887fa03503e20cc5f24287284cc65e493eefe987828 + version: 1.0b191 + sha256: 99c085683f0e53f5474b2c861f5446447299bf52a14cdabdf0b24e93a8d4d525 requires_dist: - importlib-metadata ; python_full_version < '3.10' - numpy @@ -530,9 +533,9 @@ packages: - pypi: ./ name: itkwasm-elastix-emscripten version: 1.0.0 - sha256: 0abbb9c8283d4ba8ba2e87f118bf18fe6c4b94bb9f7ecd98a11e4bb3cd356bb3 + sha256: 5554202d376003169833504e9ff583cfce632d5ff6d347e23eac0fb9a1efba66 requires_dist: - - itkwasm>=1.0b189 + - itkwasm>=1.0b191 - hatch>=1.12.0,<2 ; extra == 'test' - pyodide-py>=0.26.2,<0.27 ; extra == 'test' - pytest ; extra == 'test' @@ -946,6 +949,19 @@ packages: sha256: 7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 requires_dist: - ptyprocess>=0.5 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.1.1-pyh8b19718_0.conda + sha256: ebfa591d39092b111b9ebb3210eb42251be6da89e26c823ee03e5e838655a43e + md5: 32d0781ace05105cc99af55d36cbec7c + depends: + - python >=3.9,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT + purls: + - pkg:pypi/pip?source=hash-mapping + size: 1242995 + timestamp: 1746249983238 - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl name: platformdirs version: 4.2.2 @@ -1149,6 +1165,17 @@ packages: - typing-extensions~=4.9 - websocket-client~=1.8 requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + sha256: 972560fcf9657058e3e1f97186cc94389144b46dbdf58c807ce62e83f977e863 + md5: 4de79c071274a53dcaf2a8c749d1499e + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 748788 + timestamp: 1748804951958 - pypi: https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl name: shellingham version: 1.5.4 @@ -1314,6 +1341,17 @@ packages: - wsaccel ; extra == 'optional' - websockets ; extra == 'test' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + md5: 75cb7132eb58d97896e173ef12ac9986 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/wheel?source=hash-mapping + size: 62931 + timestamp: 1733130309598 - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl name: wsproto version: 1.2.0 diff --git a/wasm/python/itkwasm-elastix-emscripten/pyproject.toml b/wasm/python/itkwasm-elastix-emscripten/pyproject.toml index 1dc069f..ba920a7 100644 --- a/wasm/python/itkwasm-elastix-emscripten/pyproject.toml +++ b/wasm/python/itkwasm-elastix-emscripten/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] keywords = [ "itkwasm", @@ -31,7 +32,7 @@ keywords = [ requires-python = ">=3.9" dependencies = [ - "itkwasm >= 1.0.b178", + "itkwasm >= 1.0.b195", ] [project.urls] @@ -88,6 +89,7 @@ test = {features = ["test"], solve-group = "default"} [tool.pixi.feature.test.dependencies] curl = ">=8.9.1,<9" tar = ">=1.34,<2" +pip = ">=25.1.1,<26" [tool.pixi.feature.test.tasks] download-pyodide = { cmd = "curl -L https://github.com/pyodide/pyodide/releases/download/0.26.2/pyodide-0.26.2.tar.bz2 -o pyodide.tar.bz2 && tar xjf pyodide.tar.bz2 && rm -rf dist/pyodide && mkdir -p dist && mv pyodide dist", description = "Download Pyodide", outputs = ["pyodide.tar.bz2"] } diff --git a/wasm/python/itkwasm-elastix-emscripten/tests/test_transformix_async.py b/wasm/python/itkwasm-elastix-emscripten/tests/test_transformix_async.py new file mode 100644 index 0000000..4a36da9 --- /dev/null +++ b/wasm/python/itkwasm-elastix-emscripten/tests/test_transformix_async.py @@ -0,0 +1,18 @@ +import pytest +import sys + +if sys.version_info < (3,10): + pytest.skip("Skipping pyodide tests on older Python", allow_module_level=True) + +from pytest_pyodide import run_in_pyodide + +from .fixtures import package_wheel, input_data + +@run_in_pyodide(packages=['micropip']) +async def test_transformix_async(selenium, package_wheel): + import micropip + await micropip.install(package_wheel) + + from itkwasm_elastix_emscripten import transformix_async + + # Write your test code here diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/__init__.py b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/__init__.py index 3664688..5fc690a 100644 --- a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/__init__.py +++ b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/__init__.py @@ -5,6 +5,7 @@ from .default_parameter_map import default_parameter_map from .elastix import elastix from .read_parameter_files import read_parameter_files +from .transformix import transformix from .write_parameter_files import write_parameter_files from ._version import __version__ diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/_version.py b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/_version.py index 260c070..7863915 100644 --- a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/_version.py +++ b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/_version.py @@ -1 +1 @@ -__version__ = "0.3.1" +__version__ = "1.0.2" diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/elastix.py b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/elastix.py index 48537ef..46e776f 100644 --- a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/elastix.py +++ b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/elastix.py @@ -14,25 +14,21 @@ PipelineInput, Pipeline, Image, - BinaryFile, + TransformList, ) def elastix( parameter_object: Any, - transform: str, fixed: Optional[Image] = None, moving: Optional[Image] = None, - initial_transform: Optional[os.PathLike] = None, + initial_transform: Optional[TransformList] = None, initial_transform_parameter_object: Optional[Any] = None, -) -> Tuple[Image, Any]: +) -> Tuple[Image, TransformList, Any]: """Rigid and non-rigid registration of images. :param parameter_object: Elastix parameter object representation :type parameter_object: Any - :param transform: Fixed-to-moving transform file - :type transform: str - :param fixed: Fixed image :type fixed: Image @@ -40,7 +36,7 @@ def elastix( :type moving: Image :param initial_transform: Initial transform to apply before registration - :type initial_transform: os.PathLike + :type initial_transform: TransformList :param initial_transform_parameter_object: Initial elastix transform parameter object to apply before registration. Only provide this or an initial transform. :type initial_transform_parameter_object: Any @@ -48,6 +44,9 @@ def elastix( :return: Resampled moving image :rtype: Image + :return: Fixed-to-moving transform file + :rtype: TransformList + :return: Elastix optimized transform parameter object representation :rtype: Any """ @@ -57,7 +56,7 @@ def elastix( pipeline_outputs: List[PipelineOutput] = [ PipelineOutput(InterfaceTypes.Image), - PipelineOutput(InterfaceTypes.BinaryFile, BinaryFile(PurePosixPath(transform))), + PipelineOutput(InterfaceTypes.TransformList), PipelineOutput(InterfaceTypes.JsonCompatible), ] @@ -72,7 +71,7 @@ def elastix( result_name = '0' args.append(result_name) - transform_name = str(PurePosixPath(transform)) + transform_name = '1' args.append(transform_name) transform_parameter_object_name = '2' @@ -93,10 +92,10 @@ def elastix( input_count += 1 if initial_transform is not None: - input_file = str(PurePosixPath(initial_transform)) - pipeline_inputs.append(PipelineInput(InterfaceTypes.BinaryFile, BinaryFile(initial_transform))) + pipeline_inputs.append(PipelineInput(InterfaceTypes.TransformList, initial_transform)) args.append('--initial-transform') - args.append(input_file) + args.append(str(input_count)) + input_count += 1 if initial_transform_parameter_object is not None: pipeline_inputs.append(PipelineInput(InterfaceTypes.JsonCompatible, initial_transform_parameter_object)) @@ -109,6 +108,7 @@ def elastix( result = ( outputs[0].data, + outputs[1].data, outputs[2].data, ) return result diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/transformix.py b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/transformix.py new file mode 100644 index 0000000..a9b1497 --- /dev/null +++ b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/transformix.py @@ -0,0 +1,106 @@ +# Generated file. To retain edits, remove this comment. + +from pathlib import Path, PurePosixPath +import os +from typing import Dict, Tuple, Optional, List, Any + +from importlib_resources import files as file_resources + +_pipeline = None + +from itkwasm import ( + InterfaceTypes, + PipelineOutput, + PipelineInput, + Pipeline, + Image, +) + +def transformix( + moving: Image, + transform_parameter_object: Any, + output_origin: Optional[List[float]] = None, + output_spacing: Optional[List[float]] = None, + output_size: Optional[List[int]] = None, + output_direction: Optional[List[float]] = None, +) -> Image: + """Apply an elastix transform parameter object to an image. + + :param moving: Moving image + :type moving: Image + + :param transform_parameter_object: Elastix transform parameter object to apply. Only provide this or an initial transform. + :type transform_parameter_object: Any + + :param output_origin: Output image origin. + :type output_origin: float + + :param output_spacing: Output image spacing. + :type output_spacing: float + + :param output_size: Output image size. + :type output_size: int + + :param output_direction: Output image orientation direction matrix. + :type output_direction: float + + :return: Resampled moving image + :rtype: Image + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_elastix_wasi').joinpath(Path('wasm_modules') / Path('transformix.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.Image), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Image, moving), + PipelineInput(InterfaceTypes.JsonCompatible, transform_parameter_object), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + args.append('1') + # Outputs + result_name = '0' + args.append(result_name) + + # Options + input_count = len(pipeline_inputs) + if output_origin is not None and len(output_origin) < 1: + raise ValueError('"output-origin" kwarg must have a length > 1') + if output_origin is not None and len(output_origin) > 0: + args.append('--output-origin') + for value in output_origin: + args.append(str(value)) + + if output_spacing is not None and len(output_spacing) < 1: + raise ValueError('"output-spacing" kwarg must have a length > 1') + if output_spacing is not None and len(output_spacing) > 0: + args.append('--output-spacing') + for value in output_spacing: + args.append(str(value)) + + if output_size is not None and len(output_size) < 1: + raise ValueError('"output-size" kwarg must have a length > 1') + if output_size is not None and len(output_size) > 0: + args.append('--output-size') + for value in output_size: + args.append(str(value)) + + if output_direction is not None and len(output_direction) < 1: + raise ValueError('"output-direction" kwarg must have a length > 1') + if output_direction is not None and len(output_direction) > 0: + args.append('--output-direction') + for value in output_direction: + args.append(str(value)) + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/default-parameter-map.wasi.wasm b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/default-parameter-map.wasi.wasm index b4157f2..d768c32 100644 Binary files a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/default-parameter-map.wasi.wasm and b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/default-parameter-map.wasi.wasm differ diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/elastix.wasi.wasm b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/elastix.wasi.wasm index b5deb40..539efb9 100644 Binary files a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/elastix.wasi.wasm and b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/elastix.wasi.wasm differ diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/read-parameter-files.wasi.wasm b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/read-parameter-files.wasi.wasm index d344fde..a456aa4 100644 Binary files a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/read-parameter-files.wasi.wasm and b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/read-parameter-files.wasi.wasm differ diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/transformix.wasi.wasm b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/transformix.wasi.wasm new file mode 100644 index 0000000..7d4a806 Binary files /dev/null and b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/transformix.wasi.wasm differ diff --git a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/write-parameter-files.wasi.wasm b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/write-parameter-files.wasi.wasm index a366dc6..014a516 100644 Binary files a/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/write-parameter-files.wasi.wasm and b/wasm/python/itkwasm-elastix-wasi/itkwasm_elastix_wasi/wasm_modules/write-parameter-files.wasi.wasm differ diff --git a/wasm/python/itkwasm-elastix-wasi/pixi.lock b/wasm/python/itkwasm-elastix-wasi/pixi.lock index 884a686..f8e1b54 100644 --- a/wasm/python/itkwasm-elastix-wasi/pixi.lock +++ b/wasm/python/itkwasm-elastix-wasi/pixi.lock @@ -29,12 +29,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - pypi: https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/7d/a16029720cfa5a3a19e44cdeabc96c078555890a6ffd08fdc0e8f96b77c5/itkwasm-1.0b178-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/f3/61eeef119beb37decb58e7cb29940f19a1464b8608f2cab8a8616aba75fd/numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/cc/3af9cf587abab041fc757c8b2cce40381512d600900f30c017cc6ed58327/wasmtime-23.0.0-py3-none-manylinux1_x86_64.whl - - pypi: . + - pypi: https://files.pythonhosted.org/packages/02/49/91feda2f5a0c69a80fa0b72d47493316b3c11bc9b840c50288ab762facf5/wasmtime-34.0.0-py3-none-manylinux1_x86_64.whl + - pypi: ./ test: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -46,9 +46,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -61,26 +58,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - pypi: https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bf/7d/a16029720cfa5a3a19e44cdeabc96c078555890a6ffd08fdc0e8f96b77c5/itkwasm-1.0b178-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/52/05/8c42705a563e74fe42d2bb31fd7e0e1d887cbb43106f121d3b8e1c8a43f2/itkwasm_compare_images-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/a0/91/ab9c4ed1e095f218c7f17ccf691d1ebe0991250d0c55d64fa7ef5e3ce070/itkwasm_compare_images_wasi-5.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b7/88/ba401afcad17f46630996e0a853930f582b6c4b420b1dc30aed800849b0b/itkwasm_image_io-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6b/48/8ee098d13a3f4bb61307d6223718ba93f64257602b701beddd85f4a8bd59/itkwasm_image_io_wasi-1.2.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/2c/f3/61eeef119beb37decb58e7cb29940f19a1464b8608f2cab8a8616aba75fd/numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cf/cc/3af9cf587abab041fc757c8b2cce40381512d600900f30c017cc6ed58327/wasmtime-23.0.0-py3-none-manylinux1_x86_64.whl - - pypi: . + - pypi: https://files.pythonhosted.org/packages/02/49/91feda2f5a0c69a80fa0b72d47493316b3c11bc9b840c50288ab762facf5/wasmtime-34.0.0-py3-none-manylinux1_x86_64.whl + - pypi: ./ packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -121,27 +119,6 @@ packages: purls: [] size: 154853 timestamp: 1720077432978 -- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 - sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 - md5: 3faab06a954c2a04039983f2c4a50d99 - depends: - - python >=3.7 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/colorama?source=hash-mapping - size: 25170 - timestamp: 1666700778190 -- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 - md5: d02ae936e42063ca46af6cdad2dbd1e0 - depends: - - python >=3.7 - license: MIT and PSF-2.0 - purls: - - pkg:pypi/exceptiongroup?source=hash-mapping - size: 20418 - timestamp: 1720869435725 - pypi: https://files.pythonhosted.org/packages/75/06/4df55e1b7b112d183f65db9503bff189e97179b256e1ea450a3c365241e0/importlib_resources-6.4.0-py3-none-any.whl name: importlib-resources version: 6.4.0 @@ -164,28 +141,22 @@ packages: - jaraco-test>=5.4 ; extra == 'testing' - pytest-mypy ; platform_python_implementation != 'PyPy' and extra == 'testing' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 - md5: f800d2da156d08e289b14e87e43c1ae5 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/iniconfig?source=hash-mapping - size: 11101 - timestamp: 1673103208955 -- pypi: https://files.pythonhosted.org/packages/bf/7d/a16029720cfa5a3a19e44cdeabc96c078555890a6ffd08fdc0e8f96b77c5/itkwasm-1.0b178-py3-none-any.whl +- pypi: https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl + name: iniconfig + version: 2.1.0 + sha256: 9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl name: itkwasm - version: 1.0b178 - sha256: c6e77b76492ef5d6d20fc822934aee230a438ab752b8ebc93fd63944e7832915 + version: 1.0b195 + sha256: c98eaf4263a89cd3e639f40da0c1e0b021f85903fdfad54606b994c42e0d057a requires_dist: - importlib-metadata ; python_full_version < '3.10' - numpy - platformdirs ; sys_platform != 'emscripten' - typing-extensions - - wasmtime>=13.0.2 ; sys_platform != 'emscripten' - requires_python: '>=3.8' + - wasmtime>=28.0.0 ; sys_platform != 'emscripten' + requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/52/05/8c42705a563e74fe42d2bb31fd7e0e1d887cbb43106f121d3b8e1c8a43f2/itkwasm_compare_images-5.2.0-py3-none-any.whl name: itkwasm-compare-images version: 5.2.0 @@ -203,13 +174,13 @@ packages: - importlib-resources - itkwasm>=1.0b171 requires_python: '>=3.8' -- pypi: . +- pypi: ./ name: itkwasm-elastix-wasi - version: 0.3.1 - sha256: d02296b68a49a62169dc2dccb91f6d3972b28895222b9a53425c553f185e3894 + version: 1.0.1 + sha256: 19b6f3bf46885c0977b29971e6871d5dbc392a7cdf2bc35abd1b130a975dee2d requires_dist: - importlib-resources - - itkwasm>=1.0b177 + - itkwasm>=1.0b195 - itkwasm-compare-images>=5.2.0,<6 ; extra == 'test' - itkwasm-image-io>=1.2.1,<2 ; extra == 'test' - pytest ; extra == 'test' @@ -366,17 +337,11 @@ packages: purls: [] size: 2895213 timestamp: 1721194688955 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - sha256: 36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81 - md5: cbe1bb1f21567018ce595d9c2be0f0db - depends: - - python >=3.8 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/packaging?source=hash-mapping - size: 50290 - timestamp: 1718189540074 +- pypi: https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl + name: packaging + version: '25.0' + sha256: 29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 + requires_python: '>=3.8' - pypi: https://files.pythonhosted.org/packages/68/13/2aa1f0e1364feb2c9ef45302f387ac0bd81484e9c9a4c5688a322fbdfd08/platformdirs-4.2.2-py3-none-any.whl name: platformdirs version: 4.2.2 @@ -393,36 +358,44 @@ packages: - pytest>=7.4.3 ; extra == 'test' - mypy>=1.8 ; extra == 'type' requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 - md5: d3483c8fc2dc2cc3f5cf43e26d60cabf - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pluggy?source=hash-mapping - size: 23815 - timestamp: 1713667175451 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.2-pyhd8ed1ab_0.conda - sha256: 72c84a3cd9fe82835a88e975fd2a0dbf2071d1c423ea4f79e7930578c1014873 - md5: e010a224b90f1f623a917c35addbb924 - depends: - - colorama - - exceptiongroup >=1.0.0rc8 - - iniconfig - - packaging - - pluggy <2,>=1.5 - - python >=3.8 - - tomli >=1 - constrains: - - pytest-faulthandler >=2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pytest?source=compressed-mapping - size: 257671 - timestamp: 1721923749407 +- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + name: pluggy + version: 1.6.0 + sha256: e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + requires_dist: + - pre-commit ; extra == 'dev' + - tox ; extra == 'dev' + - pytest ; extra == 'testing' + - pytest-benchmark ; extra == 'testing' + - coverage ; extra == 'testing' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl + name: pygments + version: 2.19.2 + sha256: 86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl + name: pytest + version: 8.4.1 + sha256: 539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 + requires_dist: + - colorama>=0.4 ; sys_platform == 'win32' + - exceptiongroup>=1 ; python_full_version < '3.11' + - iniconfig>=1 + - packaging>=20 + - pluggy>=1.5,<2 + - pygments>=2.7.2 + - tomli>=1 ; python_full_version < '3.11' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.5-h2ad013b_0_cpython.conda sha256: e2aad83838988725d4ffba4e9717b9328054fd18a668cff3377e0c50f109e8bd md5: 9c56c4df45f6571b13111d8df2448692 @@ -472,17 +445,6 @@ packages: purls: [] size: 3318875 timestamp: 1699202167581 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 - sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f - md5: 5844808ffab9ebdb694585b50ba02a96 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli?source=hash-mapping - size: 15940 - timestamp: 1644342331069 - pypi: https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl name: typing-extensions version: 4.12.2 @@ -495,18 +457,18 @@ packages: purls: [] size: 119815 timestamp: 1706886945727 -- pypi: https://files.pythonhosted.org/packages/cf/cc/3af9cf587abab041fc757c8b2cce40381512d600900f30c017cc6ed58327/wasmtime-23.0.0-py3-none-manylinux1_x86_64.whl +- pypi: https://files.pythonhosted.org/packages/02/49/91feda2f5a0c69a80fa0b72d47493316b3c11bc9b840c50288ab762facf5/wasmtime-34.0.0-py3-none-manylinux1_x86_64.whl name: wasmtime - version: 23.0.0 - sha256: 4144847d89a133a25783e9ee11126dd3e1accea52ee20ed91e2d0315fda3abf2 + version: 34.0.0 + sha256: 735a30599f98d92d9d631615651ef4b964f3e32f5f0ab80e4e68c00633789726 requires_dist: - importlib-resources>=5.10 - coverage ; extra == 'testing' - - pytest ; extra == 'testing' - pycparser ; extra == 'testing' - pytest-mypy ; extra == 'testing' - - componentize-py ; extra == 'testing' - requires_python: '>=3.8' + - pytest ; extra == 'testing' + - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') + requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 md5: 2161070d867d1b1204ea749c8eec4ef0 diff --git a/wasm/python/itkwasm-elastix-wasi/pyproject.toml b/wasm/python/itkwasm-elastix-wasi/pyproject.toml index c237ce6..389aad9 100644 --- a/wasm/python/itkwasm-elastix-wasi/pyproject.toml +++ b/wasm/python/itkwasm-elastix-wasi/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] keywords = [ "itkwasm", @@ -31,7 +32,7 @@ keywords = [ requires-python = ">=3.9" dependencies = [ - "itkwasm >= 1.0.b177", + "itkwasm >= 1.0.b195", "importlib_resources", ] diff --git a/wasm/python/itkwasm-elastix-wasi/tests/test_elastix_wasm.py b/wasm/python/itkwasm-elastix-wasi/tests/test_elastix_wasm.py index f465093..0af664d 100644 --- a/wasm/python/itkwasm-elastix-wasi/tests/test_elastix_wasm.py +++ b/wasm/python/itkwasm-elastix-wasi/tests/test_elastix_wasm.py @@ -17,7 +17,6 @@ def test_elastix_wasm(): test_data_output_dir = Path(__file__).parent.parent.parent.parent / 'test' / 'data' / 'output' test_data_output_dir.mkdir(parents=True, exist_ok=True) - transform = test_data_output_dir / 'transform.txt' fixed_filename = 'CT_2D_head_fixed.mha' fixed_filepath = Path(__file__).parent.parent.parent.parent / 'test' / 'data' / 'input' / fixed_filename @@ -27,7 +26,7 @@ def test_elastix_wasm(): moving_filepath = Path(__file__).parent.parent.parent.parent / 'test' / 'data' / 'input' / moving_filename moving_image = imread(moving_filepath) - result_image, transform_parameter_object = elastix(parameter_object, transform, fixed_image, moving_image) + result_image, _transform, _transform_parameter_object = elastix(parameter_object, fixed_image, moving_image) output_dir = Path(__file__).parent.parent.parent.parent / 'test' / 'data' / 'output' output_dir.mkdir(parents=True, exist_ok=True) diff --git a/wasm/python/itkwasm-elastix-wasi/tests/test_transformix.py b/wasm/python/itkwasm-elastix-wasi/tests/test_transformix.py new file mode 100644 index 0000000..20ecfec --- /dev/null +++ b/wasm/python/itkwasm-elastix-wasi/tests/test_transformix.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_elastix_wasi import transformix + +from .common import test_input_path, test_output_path + +def test_transformix(): + pass diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/__init__.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/__init__.py index 8ff42cb..68f8013 100644 --- a/wasm/python/itkwasm-elastix/itkwasm_elastix/__init__.py +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/__init__.py @@ -8,6 +8,8 @@ from .elastix import elastix from .read_parameter_files_async import read_parameter_files_async from .read_parameter_files import read_parameter_files +from .transformix_async import transformix_async +from .transformix import transformix from .write_parameter_files_async import write_parameter_files_async from .write_parameter_files import write_parameter_files diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/_version.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/_version.py index 260c070..7863915 100644 --- a/wasm/python/itkwasm-elastix/itkwasm_elastix/_version.py +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/_version.py @@ -1 +1 @@ -__version__ = "0.3.1" +__version__ = "1.0.2" diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix.py index 19c4623..6915f3d 100644 --- a/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix.py +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix.py @@ -6,25 +6,21 @@ from itkwasm import ( environment_dispatch, Image, - BinaryFile, + TransformList, ) def elastix( parameter_object: Any, - transform: str, fixed: Optional[Image] = None, moving: Optional[Image] = None, - initial_transform: Optional[os.PathLike] = None, + initial_transform: Optional[TransformList] = None, initial_transform_parameter_object: Optional[Any] = None, -) -> Tuple[Image, Any]: +) -> Tuple[Image, TransformList, Any]: """Rigid and non-rigid registration of images. :param parameter_object: Elastix parameter object representation :type parameter_object: Any - :param transform: Fixed-to-moving transform file - :type transform: str - :param fixed: Fixed image :type fixed: Image @@ -32,7 +28,7 @@ def elastix( :type moving: Image :param initial_transform: Initial transform to apply before registration - :type initial_transform: os.PathLike + :type initial_transform: TransformList :param initial_transform_parameter_object: Initial elastix transform parameter object to apply before registration. Only provide this or an initial transform. :type initial_transform_parameter_object: Any @@ -40,9 +36,12 @@ def elastix( :return: Resampled moving image :rtype: Image + :return: Fixed-to-moving transform file + :rtype: TransformList + :return: Elastix optimized transform parameter object representation :rtype: Any """ func = environment_dispatch("itkwasm_elastix", "elastix") - output = func(parameter_object, transform, fixed=fixed, moving=moving, initial_transform=initial_transform, initial_transform_parameter_object=initial_transform_parameter_object) + output = func(parameter_object, fixed=fixed, moving=moving, initial_transform=initial_transform, initial_transform_parameter_object=initial_transform_parameter_object) return output diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix_async.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix_async.py index 290382f..144cb2e 100644 --- a/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix_async.py +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/elastix_async.py @@ -6,25 +6,21 @@ from itkwasm import ( environment_dispatch, Image, - BinaryFile, + TransformList, ) async def elastix_async( parameter_object: Any, - transform: str, fixed: Optional[Image] = None, moving: Optional[Image] = None, - initial_transform: Optional[os.PathLike] = None, + initial_transform: Optional[TransformList] = None, initial_transform_parameter_object: Optional[Any] = None, -) -> Tuple[Image, Any]: +) -> Tuple[Image, TransformList, Any]: """Rigid and non-rigid registration of images. :param parameter_object: Elastix parameter object representation :type parameter_object: Any - :param transform: Fixed-to-moving transform file - :type transform: str - :param fixed: Fixed image :type fixed: Image @@ -32,7 +28,7 @@ async def elastix_async( :type moving: Image :param initial_transform: Initial transform to apply before registration - :type initial_transform: os.PathLike + :type initial_transform: TransformList :param initial_transform_parameter_object: Initial elastix transform parameter object to apply before registration. Only provide this or an initial transform. :type initial_transform_parameter_object: Any @@ -40,9 +36,12 @@ async def elastix_async( :return: Resampled moving image :rtype: Image + :return: Fixed-to-moving transform file + :rtype: TransformList + :return: Elastix optimized transform parameter object representation :rtype: Any """ func = environment_dispatch("itkwasm_elastix", "elastix_async") - output = await func(parameter_object, transform, fixed=fixed, moving=moving, initial_transform=initial_transform, initial_transform_parameter_object=initial_transform_parameter_object) + output = await func(parameter_object, fixed=fixed, moving=moving, initial_transform=initial_transform, initial_transform_parameter_object=initial_transform_parameter_object) return output diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix.py new file mode 100644 index 0000000..7b4b7a5 --- /dev/null +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix.py @@ -0,0 +1,44 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Image, +) + +def transformix( + moving: Image, + transform_parameter_object: Any, + output_origin: Optional[List[float]] = None, + output_spacing: Optional[List[float]] = None, + output_size: Optional[List[int]] = None, + output_direction: Optional[List[float]] = None, +) -> Image: + """Apply an elastix transform parameter object to an image. + + :param moving: Moving image + :type moving: Image + + :param transform_parameter_object: Elastix transform parameter object to apply. Only provide this or an initial transform. + :type transform_parameter_object: Any + + :param output_origin: Output image origin. + :type output_origin: float + + :param output_spacing: Output image spacing. + :type output_spacing: float + + :param output_size: Output image size. + :type output_size: int + + :param output_direction: Output image orientation direction matrix. + :type output_direction: float + + :return: Resampled moving image + :rtype: Image + """ + func = environment_dispatch("itkwasm_elastix", "transformix") + output = func(moving, transform_parameter_object, output_origin=output_origin, output_spacing=output_spacing, output_size=output_size, output_direction=output_direction) + return output diff --git a/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix_async.py b/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix_async.py new file mode 100644 index 0000000..340825c --- /dev/null +++ b/wasm/python/itkwasm-elastix/itkwasm_elastix/transformix_async.py @@ -0,0 +1,44 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Image, +) + +async def transformix_async( + moving: Image, + transform_parameter_object: Any, + output_origin: Optional[List[float]] = None, + output_spacing: Optional[List[float]] = None, + output_size: Optional[List[int]] = None, + output_direction: Optional[List[float]] = None, +) -> Image: + """Apply an elastix transform parameter object to an image. + + :param moving: Moving image + :type moving: Image + + :param transform_parameter_object: Elastix transform parameter object to apply. Only provide this or an initial transform. + :type transform_parameter_object: Any + + :param output_origin: Output image origin. + :type output_origin: float + + :param output_spacing: Output image spacing. + :type output_spacing: float + + :param output_size: Output image size. + :type output_size: int + + :param output_direction: Output image orientation direction matrix. + :type output_direction: float + + :return: Resampled moving image + :rtype: Image + """ + func = environment_dispatch("itkwasm_elastix", "transformix_async") + output = await func(moving, transform_parameter_object, output_origin=output_origin, output_spacing=output_spacing, output_size=output_size, output_direction=output_direction) + return output diff --git a/wasm/python/itkwasm-elastix/pyproject.toml b/wasm/python/itkwasm-elastix/pyproject.toml index 40a1a9b..eae85d5 100644 --- a/wasm/python/itkwasm-elastix/pyproject.toml +++ b/wasm/python/itkwasm-elastix/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] keywords = [ "itkwasm", @@ -32,7 +33,7 @@ keywords = [ requires-python = ">=3.9" dependencies = [ - "itkwasm >= 1.0.b178", + "itkwasm >= 1.0.b195", "itkwasm-elastix-wasi; sys_platform != \"emscripten\"", "itkwasm-elastix-emscripten; sys_platform == \"emscripten\"", diff --git a/wasm/python/itkwasm-elastix/tests/test_transformix.py b/wasm/python/itkwasm-elastix/tests/test_transformix.py new file mode 100644 index 0000000..2e84801 --- /dev/null +++ b/wasm/python/itkwasm-elastix/tests/test_transformix.py @@ -0,0 +1,19 @@ +import pytest +import sys + +if sys.version_info < (3,10): + pytest.skip("Skipping pyodide tests on older Python", allow_module_level=True) + +from pytest_pyodide import run_in_pyodide + +from .fixtures import emscripten_package_wheel, package_wheel, input_data + +@run_in_pyodide(packages=['micropip']) +async def test_transformix(selenium, package_wheel, emscripten_package_wheel): + import micropip + await micropip.install(emscripten_package_wheel) + await micropip.install(package_wheel) + + from itkwasm_elastix import transformix + + # Write your test code here diff --git a/wasm/read-parameter-files.cxx b/wasm/read-parameter-files.cxx index 7844c7d..d450603 100644 --- a/wasm/read-parameter-files.cxx +++ b/wasm/read-parameter-files.cxx @@ -19,9 +19,9 @@ #include "itkPipeline.h" #include "itkOutputTextStream.h" -#include "rapidjson/document.h" -#include "rapidjson/prettywriter.h" -#include "rapidjson/stringbuffer.h" +#include "itkElastixWasmParameterObject.h" + +#include "glaze/glaze.hpp" int main(int argc, char * argv[]) @@ -45,34 +45,39 @@ main(int argc, char * argv[]) auto parameterObject = ParameterObjectType::New(); ITK_WASM_CATCH_EXCEPTION(pipeline, parameterObject->ReadParameterFiles(parameterFiles)); - rapidjson::Document document; - document.SetArray(); - rapidjson::Document::AllocatorType & allocator = document.GetAllocator(); + itk::wasm::ParameterMapVector parameterMaps; const auto numParameterMaps = parameterObject->GetNumberOfParameterMaps(); for (unsigned int i = 0; i < numParameterMaps; ++i) { - const auto & parameterMap = parameterObject->GetParameterMap(i); - rapidjson::Value parameterMapJson(rapidjson::kObjectType); + const auto & parameterMap = parameterObject->GetParameterMap(i); + itk::wasm::ParameterMap wasmParameterMap; for (const auto & parameter : parameterMap) { - const auto & key = parameter.first; - const auto & value = parameter.second; - rapidjson::Value valueJson(rapidjson::kArrayType); - for (const auto & valueElement : value) + const auto & parameterValueVector = parameter.second; + + auto & wasmValues = wasmParameterMap[parameter.first]; + wasmValues.reserve(parameterValueVector.size()); + + // Convert each string into the variant + for (const auto & val : parameterValueVector) { - valueJson.PushBack(rapidjson::Value(valueElement.c_str(), allocator).Move(), allocator); + wasmValues.emplace_back(val); } - parameterMapJson.AddMember(rapidjson::Value(key.c_str(), allocator).Move(), valueJson, allocator); } - document.PushBack(parameterMapJson, allocator); + parameterMaps.push_back(wasmParameterMap); } - rapidjson::StringBuffer buffer; - rapidjson::PrettyWriter writer(buffer); - document.Accept(writer); + std::string serialized{}; + auto errorCode = glz::write(parameterMaps, serialized); + if (errorCode) + { + const std::string errorMessage = glz::format_error(errorCode, serialized); + std::cerr << "Error serializing parameter object: " << errorMessage << std::endl; + return EXIT_FAILURE; + } - parameterObjectJson.Get() << buffer.GetString(); + parameterObjectJson.Get() << serialized; return EXIT_SUCCESS; } \ No newline at end of file diff --git a/wasm/test/data/input/CT_3D_lung.json b/wasm/test/data/input/CT_3D_lung.json new file mode 100644 index 0000000..f296496 --- /dev/null +++ b/wasm/test/data/input/CT_3D_lung.json @@ -0,0 +1,88 @@ +[ + { + "AutomaticScalesEstimation": [ + "true" + ], + "AutomaticTransformInitialization": [ + "true" + ], + "BSplineInterpolationOrder": [ + "1" + ], + "DefaultPixelValue": [ + "0" + ], + "ErodeMask": [ + "false" + ], + "FinalBSplineInterpolationOrder": [ + "3" + ], + "FixedImagePyramid": [ + "FixedRecursiveImagePyramid" + ], + "FixedInternalImagePixelType": [ + "float" + ], + "HowToCombineTransforms": [ + "Compose" + ], + "ImageSampler": [ + "Random" + ], + "Interpolator": [ + "BSplineInterpolator" + ], + "MaximumNumberOfIterations": [ + "250" + ], + "Metric": [ + "AdvancedMattesMutualInformation" + ], + "MovingImagePyramid": [ + "MovingRecursiveImagePyramid" + ], + "MovingInternalImagePixelType": [ + "float" + ], + "NewSamplesEveryIteration": [ + "true" + ], + "NumberOfHistogramBins": [ + "32" + ], + "NumberOfResolutions": [ + "4" + ], + "NumberOfSpatialSamples": [ + "2048" + ], + "Optimizer": [ + "AdaptiveStochasticGradientDescent" + ], + "Registration": [ + "MultiResolutionRegistration" + ], + "ResampleInterpolator": [ + "FinalBSplineInterpolator" + ], + "Resampler": [ + "DefaultResampler" + ], + "ResultImageFormat": [ + "mhd" + ], + "ResultImagePixelType": [ + "short" + ], + "Transform": [ + "AffineTransform" + ], + "UseDirectionCosines": [ + "true" + ], + "WriteResultImage": [ + "true" + ] + } +] \ No newline at end of file diff --git a/wasm/transformix-wasm.cxx b/wasm/transformix-wasm.cxx new file mode 100644 index 0000000..c6f564d --- /dev/null +++ b/wasm/transformix-wasm.cxx @@ -0,0 +1,226 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#include "itkTransformixFilter.h" +#include "itkPipeline.h" +#include "itkInputImage.h" +#include "itkOutputImage.h" +#include "itkInputTextStream.h" +#include "itkOutputTextStream.h" +#include "itkSupportInputImageTypes.h" + +#include "itkImage.h" +#include "itkIdentityTransform.h" +#include "itkCompositeTransform.h" +#include "itkCompositeTransformIOHelper.h" +#include "itkNumberToString.h" + +#include + +#include "itkElastixWasmParameterObject.h" + +// Workaround function to check if a parameter exists in the parameter object +// since elx::ParameterObject doesn't have a HasParameter method, yet, added in +// https://github.com/SuperElastix/elastix/pull/1338 +bool +HasParameterWorkaround(const elastix::ParameterObject * parameterObject, const std::string & key) +{ + if (!parameterObject || parameterObject->GetNumberOfParameterMaps() == 0) + { + return false; + } + + // Check if the key exists in any of the parameter maps + for (unsigned int i = 0; i < parameterObject->GetNumberOfParameterMaps(); ++i) + { + const auto & parameterMap = parameterObject->GetParameterMap(i); + if (parameterMap.find(key) != parameterMap.end()) + { + return true; + } + } + return false; +} + +template +class PipelineFunctor +{ +public: + int + operator()(itk::wasm::Pipeline & pipeline) + { + using ImageType = TImage; + using ParametersValueType = double; + constexpr unsigned int ImageDimension = ImageType::ImageDimension; + + using InputImageType = itk::wasm::InputImage; + InputImageType movingImage; + pipeline.add_option("moving", movingImage, "Moving image")->required()->type_name("INPUT_IMAGE"); + + itk::wasm::InputTextStream transformParameterObjectJson; + auto transformParameterObjectOption = + pipeline + .add_option("transform-parameter-object", + transformParameterObjectJson, + "Elastix transform parameter object to apply. Only provide this or an " + "initial transform.") + ->required() + ->type_name("INPUT_JSON"); + + std::vector outputOrigin(ImageDimension, 0.0); + auto outputOriginOption = pipeline.add_option("-o,--output-origin", outputOrigin, "Output image origin."); + std::vector outputSpacing(ImageDimension, 1.0); + auto outputSpacingOption = pipeline.add_option("-s,--output-spacing", outputSpacing, "Output image spacing."); + std::vector outputSize(ImageDimension, 0); + auto outputSizeOption = pipeline.add_option("-z,--output-size", outputSize, "Output image size."); + std::vector outputDirection; + auto outputDirectionOption = + pipeline.add_option("-d,--output-direction", outputDirection, "Output image orientation direction matrix."); + + using OutputImageType = itk::wasm::OutputImage; + OutputImageType resultImage; + pipeline.add_option("result", resultImage, "Resampled moving image")->required()->type_name("OUTPUT_IMAGE"); + + ITK_WASM_PARSE(pipeline); + + using TransformixType = itk::TransformixFilter; + typename TransformixType::Pointer transformix = TransformixType::New(); + + using ParameterObjectType = elastix::ParameterObject; + const auto transformParameterObject = ParameterObjectType::New(); + std::stringstream ss; + ss << transformParameterObjectJson.Get().rdbuf(); + const std::string errorMessage = itk::wasm::ReadParameterObject(ss.str(), transformParameterObject); + if (!errorMessage.empty()) + { + std::cerr << "Error reading transform parameter object JSON: " << errorMessage << std::endl; + return EXIT_FAILURE; + } + + transformix->SetMovingImage(const_cast(movingImage.Get())); + + if (outputOriginOption->count() != 0 || !HasParameterWorkaround(transformParameterObject.GetPointer(), "Origin")) + { + if (outputOrigin.size() != ImageDimension) + { + std::cerr << "Error: Output origin size does not match image dimension." << std::endl; + return EXIT_FAILURE; + } + std::vector outputOriginStr(outputOrigin.size()); + for (size_t i = 0; i < outputOrigin.size(); ++i) + { + outputOriginStr[i] = itk::ConvertNumberToString(outputOrigin[i]); + } + transformParameterObject->SetParameter("Origin", outputOriginStr); + } + + if (outputSpacingOption->count() != 0 || !HasParameterWorkaround(transformParameterObject.GetPointer(), "Spacing")) + { + if (outputSpacing.size() != ImageDimension) + { + std::cerr << "Error: Output spacing size does not match image dimension." << std::endl; + return EXIT_FAILURE; + } + std::vector outputSpacingStr(outputSpacing.size()); + for (size_t i = 0; i < outputSpacing.size(); ++i) + { + outputSpacingStr[i] = itk::ConvertNumberToString(outputSpacing[i]); + } + transformParameterObject->SetParameter("Spacing", outputSpacingStr); + } + + if (outputSizeOption->count() != 0 || !HasParameterWorkaround(transformParameterObject.GetPointer(), "Size")) + { + if (outputSize.size() != ImageDimension) + { + std::cerr << "Error: Output size does not match image dimension." << std::endl; + return EXIT_FAILURE; + } + for (unsigned int i = 0; i < ImageDimension; ++i) + { + if (outputSize[i] == 0) + { + outputSize[i] = movingImage.Get()->GetLargestPossibleRegion().GetSize()[i]; + } + } + std::vector outputSizeStr(outputSize.size()); + for (size_t i = 0; i < outputSize.size(); ++i) + { + outputSizeStr[i] = itk::ConvertNumberToString(outputSize[i]); + } + transformParameterObject->SetParameter("Size", outputSizeStr); + } + + if (outputDirectionOption->count() != 0 || + !HasParameterWorkaround(transformParameterObject.GetPointer(), "Direction")) + { + if (!outputDirection.empty()) + { + std::vector outputDirectionStr(outputDirection.size()); + for (size_t i = 0; i < outputDirection.size(); ++i) + { + outputDirectionStr[i] = itk::ConvertNumberToString(outputDirection[i]); + } + transformParameterObject->SetParameter("Direction", outputDirectionStr); + } + else + { + // If no output direction is provided, use the moving image's direction + const auto & movingDirection = movingImage.Get()->GetDirection(); + std::vector outputDirectionStr; + for (unsigned int i = 0; i < ImageDimension; ++i) + { + for (unsigned int j = 0; j < ImageDimension; ++j) + { + outputDirectionStr.push_back(itk::ConvertNumberToString(movingDirection[i][j])); + } + } + transformParameterObject->SetParameter("Direction", outputDirectionStr); + } + } + + std::vector outputIndex(ImageDimension, 0); + if (!HasParameterWorkaround(transformParameterObject.GetPointer(), "Index")) + { + std::vector outputIndexStr(outputIndex.size()); + for (size_t i = 0; i < outputIndex.size(); ++i) + { + outputIndexStr[i] = itk::ConvertNumberToString(outputIndex[i]); + } + transformParameterObject->SetParameter("Index", outputIndexStr); + } + + transformix->SetTransformParameterObject(transformParameterObject); + transformix->LogToConsoleOff(); + + ITK_WASM_CATCH_EXCEPTION(pipeline, transformix->UpdateLargestPossibleRegion()); + + typename ImageType::Pointer outputImage = transformix->GetOutput(); + resultImage.Set(outputImage); + + return EXIT_SUCCESS; + } +}; + +int +main(int argc, char * argv[]) +{ + itk::wasm::Pipeline pipeline("transformix", "Apply an elastix transform parameter object to an image.", argc, argv); + + return itk::wasm::SupportInputImageTypes:: + Dimensions<2U, 3U, 4U>("moving", pipeline); +} diff --git a/wasm/typescript/dist/pipelines/default-parameter-map.wasm.zst b/wasm/typescript/dist/pipelines/default-parameter-map.wasm.zst index 4248d72..467e8e8 100755 Binary files a/wasm/typescript/dist/pipelines/default-parameter-map.wasm.zst and b/wasm/typescript/dist/pipelines/default-parameter-map.wasm.zst differ diff --git a/wasm/typescript/dist/pipelines/elastix.js b/wasm/typescript/dist/pipelines/elastix.js index ce8d2f7..8473441 100644 --- a/wasm/typescript/dist/pipelines/elastix.js +++ b/wasm/typescript/dist/pipelines/elastix.js @@ -6,7 +6,7 @@ var elastix = (() => { async function(moduleArg = {}) { var moduleRtn; -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");let dirname=import.meta.url;if(dirname.startsWith("data:")){dirname="/"}var require=createRequire(dirname)}var mStdout=null;var mStderr=null;Module["resetModuleStdout"]=function(){mStdout=""};Module["resetModuleStderr"]=function(){mStderr=""};Module["print"]=function(text){console.log(text);mStdout+=text+"\n"};Module["printErr"]=function(text){console.error(text);mStderr+=text+"\n"};Module["getModuleStdout"]=function(){return mStdout};Module["getModuleStderr"]=function(){return mStderr};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(!import.meta.url.startsWith("data:")){scriptDirectory=nodePath.dirname(require("url").fileURLToPath(import.meta.url))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){if(Module["locateFile"]){var f="elastix.wasm";if(!isDataURI(f)){return locateFile(f)}return f}return new URL("elastix.wasm",import.meta.url).href}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=applySignatureConversions(wasmExports);wasmMemory=wasmExports["M"];updateMemoryViews();addOnInit(wasmExports["N"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);receiveInstantiationResult(result);return result}catch(e){readyPromiseReject(e);return}}var tempDouble;var tempI64;class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>>2>>>0]=type}get_type(){return HEAPU32[this.ptr+4>>>2>>>0]}set_destructor(destructor){HEAPU32[this.ptr+8>>>2>>>0]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>>2>>>0]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12>>>0]=caught}get_caught(){return HEAP8[this.ptr+12>>>0]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>>0]=rethrown}get_rethrown(){return HEAP8[this.ptr+13>>>0]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>>2>>>0]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>>2>>>0]}}var exceptionLast=0;var uncaughtExceptionCount=0;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___cxa_throw(ptr,type,destructor){ptr>>>=0;type>>>=0;destructor>>>=0;var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{idx>>>=0;var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}}heap[outIdx>>>0]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length>>0)}}return{ptr,allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var NODEFS={isWindows:false,staticInit(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process.binding("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode(e){var code=e.code;return ERRNO_CODES[code]},tryFSOperation(f){try{return f()}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},mount(mount){return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode(path){return NODEFS.tryFSOperation(()=>{var mode=fs.lstatSync(path).mode;if(NODEFS.isWindows){mode|=(mode&292)>>2}return mode})},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},flagsForNode(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(flags){throw new FS.ErrnoError(28)}return newFlags},node_ops:{getattr(node){var path=NODEFS.realPath(node);var stat;NODEFS.tryFSOperation(()=>stat=fs.lstatSync(path));if(NODEFS.isWindows){if(!stat.blksize){stat.blksize=4096}if(!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}stat.mode|=(stat.mode&292)>>2}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(attr.mode!==undefined){var mode=attr.mode;if(NODEFS.isWindows){mode&=384}fs.chmodSync(path,mode);node.mode=attr.mode}if(attr.atime||attr.mtime){var atime=attr.atime&&new Date(attr.atime);var mtime=attr.mtime&&new Date(attr.mtime);fs.utimesSync(path,atime,mtime)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}})},lookup(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}});return node},rename(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{FS.unlink(newPath)}catch(e){}NODEFS.tryFSOperation(()=>fs.renameSync(oldPath,newPath));oldNode.name=newName},unlink(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.unlinkSync(path))},rmdir(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.rmdirSync(path))},readdir(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readdirSync(path))},symlink(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);NODEFS.tryFSOperation(()=>fs.symlinkSync(oldPath,newPath))},readlink(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readlinkSync(path))},statfs(path){var stats=NODEFS.tryFSOperation(()=>fs.statfsSync(path));stats.frsize=stats.bsize;return stats}},stream_ops:{open(stream){var path=NODEFS.realPath(stream.node);NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)){stream.shared.refcount=1;stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}})},close(stream){NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)&&stream.nfd&&--stream.shared.refcount===0){fs.closeSync(stream.nfd)}})},dup(stream){stream.shared.refcount++},read(stream,buffer,offset,length,position){if(length===0)return 0;return NODEFS.tryFSOperation(()=>fs.readSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},write(stream,buffer,offset,length,position){return NODEFS.tryFSOperation(()=>fs.writeSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){NODEFS.tryFSOperation(()=>{var stat=fs.fstatSync(stream.nfd);position+=stat.size})}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}},msync(stream,buffer,offset,length,mmapFlags){NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path)return{path:"",node:null};opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p&&p!==".");var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};var parent=FS.lookupPath(path,{follow:true}).node;if(parent?.node_ops.statfs){Object.assign(rtn,parent.node_ops.statfs(parent.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS,NODEFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>{ptr>>>=0;return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>>2>>>0]=stat.dev;HEAP32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAP32[buf+12>>>2>>>0]=stat.uid;HEAP32[buf+16>>>2>>>0]=stat.gid;HEAP32[buf+20>>>2>>>0]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>>2>>>0]=tempI64[0],HEAP32[buf+28>>>2>>>0]=tempI64[1];HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>>2>>>0]=tempI64[0],HEAP32[buf+44>>>2>>>0]=tempI64[1];HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>>2>>>0]=tempI64[0],HEAP32[buf+60>>>2>>>0]=tempI64[1];HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>>2>>>0]=tempI64[0],HEAP32[buf+76>>>2>>>0]=tempI64[1];HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>>2>>>0]=tempI64[0],HEAP32[buf+92>>>2>>>0]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>>1>>>0]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){buf>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ftruncate64(fd,length_low,length_high){var length=convertI32PairToI53Checked(length_low,length_high);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){buf>>>=0;size>>>=0;try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>=0;count>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var startIdx=Math.floor(off/struct_size);var endIdx=Math.min(stream.getdents.length,startIdx+Math.floor(count/struct_size));for(var idx=startIdx;idx>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>>2>>>0]=tempI64[0],HEAP32[dirp+pos+4>>>2>>>0]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>>2>>>0]=tempI64[0],HEAP32[dirp+pos+12>>>2>>>0]=tempI64[1];HEAP16[dirp+pos+16>>>1>>>0]=280;HEAP8[dirp+pos+18>>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){path>>>=0;buf>>>=0;bufsize>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len>>>0];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len>>>0]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var readI53FromI64=ptr=>HEAPU32[ptr>>>2>>>0]+HEAP32[ptr+4>>>2>>>0]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){path>>>=0;times>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);var now=Date.now(),atime,mtime;if(!times){atime=now;mtime=now}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>>2>>>0];if(nanoseconds==1073741823){atime=now}else if(nanoseconds==1073741822){atime=null}else{atime=seconds*1e3+nanoseconds/(1e3*1e3)}times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>>2>>>0];if(nanoseconds==1073741823){mtime=now}else if(nanoseconds==1073741822){mtime=null}else{mtime=seconds*1e3+nanoseconds/(1e3*1e3)}}if((mtime??atime)!==null){FS.utime(path,atime,mtime)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");function __emscripten_memcpy_js(dest,src,num){dest>>>=0;src>>>=0;num>>>=0;return HEAPU8.copyWithin(dest>>>0,src>>>0,src+num>>>0)}var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};function __emscripten_system(command){command>>>=0;if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15;default:return 2}};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;return-52}function __gmtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);tmPtr>>>=0;var date=new Date(time*1e3);HEAP32[tmPtr>>>2>>>0]=date.getUTCSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getUTCMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getUTCHours();HEAP32[tmPtr+12>>>2>>>0]=date.getUTCDate();HEAP32[tmPtr+16>>>2>>>0]=date.getUTCMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>>2>>>0]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>>2>>>0]=yday}var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);tmPtr>>>=0;var date=new Date(time*1e3);HEAP32[tmPtr>>>2>>>0]=date.getSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getHours();HEAP32[tmPtr+12>>>2>>>0]=date.getDate();HEAP32[tmPtr+16>>>2>>>0]=date.getMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getFullYear()-1900;HEAP32[tmPtr+24>>>2>>>0]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;HEAP32[tmPtr+36>>>2>>>0]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>>2>>>0]=dst}var setTempRet0=val=>__emscripten_tempret_set(val);var __mktime_js=function(tmPtr){tmPtr>>>=0;var ret=(()=>{var date=new Date(HEAP32[tmPtr+20>>>2>>>0]+1900,HEAP32[tmPtr+16>>>2>>>0],HEAP32[tmPtr+12>>>2>>>0],HEAP32[tmPtr+8>>>2>>>0],HEAP32[tmPtr+4>>>2>>>0],HEAP32[tmPtr>>>2>>>0],0);var dst=HEAP32[tmPtr+32>>>2>>>0];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>>2>>>0]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>>2>>>0]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>>2>>>0]=yday;HEAP32[tmPtr>>>2>>>0]=date.getSeconds();HEAP32[tmPtr+4>>>2>>>0]=date.getMinutes();HEAP32[tmPtr+8>>>2>>>0]=date.getHours();HEAP32[tmPtr+12>>>2>>>0]=date.getDate();HEAP32[tmPtr+16>>>2>>>0]=date.getMonth();HEAP32[tmPtr+20>>>2>>>0]=date.getYear();var timeMs=date.getTime();if(isNaN(timeMs)){return-1}return timeMs/1e3})();return setTempRet0((tempDouble=ret,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)),ret>>>0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone>>>=0;daylight>>>=0;std_name>>>=0;dst_name>>>=0;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>>2>>>0]=stdTimezoneOffset*60;HEAP32[daylight>>>2>>>0]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetDate.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision_low,ignored_precision_high,ptime){var ignored_precision=convertI32PairToI53Checked(ignored_precision_low,ignored_precision_high);ptime>>>=0;if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);tempI64=[nsec>>>0,(tempDouble=nsec,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptime>>>2>>>0]=tempI64[0],HEAP32[ptime+4>>>2>>>0]=tempI64[1];return 0}var getHeapMax=()=>4294901760;function _emscripten_get_heap_max(){return getHeapMax()}var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>>0]=str.charCodeAt(i)}HEAP8[buffer>>>0]=0};var _environ_get=function(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>>2>>>0]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=function(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>>2>>>0]=tempI64[0],HEAP32[newOffset+4>>>2>>>0]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=FS.createPath;var FS_unlink=path=>FS.unlink(path);var FS_createLazyFile=FS.createLazyFile;var FS_createDevice=FS.createDevice;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";if(ENVIRONMENT_IS_NODE){NODEFS.staticInit()}var wasmImports={a:___cxa_throw,L:___syscall_faccessat,g:___syscall_fcntl64,H:___syscall_fstat64,q:___syscall_ftruncate64,D:___syscall_getcwd,A:___syscall_getdents64,u:___syscall_ioctl,F:___syscall_lstat64,C:___syscall_mkdirat,E:___syscall_newfstatat,h:___syscall_openat,z:___syscall_readlinkat,G:___syscall_stat64,w:___syscall_unlinkat,v:___syscall_utimensat,j:__abort_js,K:__emscripten_memcpy_js,B:__emscripten_runtime_keepalive_clear,x:__emscripten_system,m:__gmtime_js,n:__localtime_js,o:__mktime_js,s:__setitimer_js,l:__tzset_js,r:_clock_time_get,i:_emscripten_date_now,y:_emscripten_get_heap_max,d:_emscripten_get_now,t:_emscripten_resize_heap,I:_environ_get,J:_environ_sizes_get,b:_exit,c:_fd_close,f:_fd_read,p:_fd_seek,e:_fd_write,k:_proc_exit};var wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["N"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["O"])(a0,a1);var _itk_wasm_input_array_alloc=Module["_itk_wasm_input_array_alloc"]=(a0,a1,a2,a3)=>(_itk_wasm_input_array_alloc=Module["_itk_wasm_input_array_alloc"]=wasmExports["P"])(a0,a1,a2,a3);var _itk_wasm_input_json_alloc=Module["_itk_wasm_input_json_alloc"]=(a0,a1,a2)=>(_itk_wasm_input_json_alloc=Module["_itk_wasm_input_json_alloc"]=wasmExports["Q"])(a0,a1,a2);var _itk_wasm_output_json_address=Module["_itk_wasm_output_json_address"]=(a0,a1)=>(_itk_wasm_output_json_address=Module["_itk_wasm_output_json_address"]=wasmExports["R"])(a0,a1);var _itk_wasm_output_json_size=Module["_itk_wasm_output_json_size"]=(a0,a1)=>(_itk_wasm_output_json_size=Module["_itk_wasm_output_json_size"]=wasmExports["S"])(a0,a1);var _itk_wasm_output_array_address=Module["_itk_wasm_output_array_address"]=(a0,a1,a2)=>(_itk_wasm_output_array_address=Module["_itk_wasm_output_array_address"]=wasmExports["T"])(a0,a1,a2);var _itk_wasm_output_array_size=Module["_itk_wasm_output_array_size"]=(a0,a1,a2)=>(_itk_wasm_output_array_size=Module["_itk_wasm_output_array_size"]=wasmExports["U"])(a0,a1,a2);var _itk_wasm_free_all=Module["_itk_wasm_free_all"]=()=>(_itk_wasm_free_all=Module["_itk_wasm_free_all"]=wasmExports["V"])();var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["X"])(a0,a1);var __emscripten_tempret_set=a0=>(__emscripten_tempret_set=wasmExports["Y"])(a0);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Z"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["_"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["$"])();function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["_"]=makeWrapper_pp(wasmExports["_"]);wasmExports["$"]=makeWrapper_p(wasmExports["$"]);return wasmExports}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["callMain"]=callMain;Module["stackSave"]=stackSave;Module["stackRestore"]=stackRestore;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["writeArrayToMemory"]=writeArrayToMemory;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{HEAPU32[argv_ptr>>>2>>>0]=stringToUTF8OnStack(arg);argv_ptr+=4});HEAPU32[argv_ptr>>>2>>>0]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run();Module.mountContainingDir=function(filePath){if(!ENVIRONMENT_IS_NODE){return}var path=require("path");var containingDir=path.dirname(filePath);if(containingDir==="/"){throw new Error("Cannot mount root directory")}var currentDir="/";var splitContainingDir=containingDir.split(path.sep);for(var ii=1;ii{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof WorkerGlobalScope!="undefined";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";if(ENVIRONMENT_IS_NODE){const{createRequire}=await import("module");let dirname=import.meta.url;if(dirname.startsWith("data:")){dirname="/"}var require=createRequire(dirname)}var mStdout=null;var mStderr=null;Module["resetModuleStdout"]=function(){mStdout=""};Module["resetModuleStderr"]=function(){mStderr=""};Module["print"]=function(text){console.log(text);mStdout+=text+"\n"};Module["printErr"]=function(text){console.error(text);mStderr+=text+"\n"};Module["getModuleStdout"]=function(){return mStdout};Module["getModuleStderr"]=function(){return mStderr};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(!import.meta.url.startsWith("data:")){scriptDirectory=nodePath.dirname(require("url").fileURLToPath(import.meta.url))+"/"}readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){if(Module["locateFile"]){var f="elastix.wasm";if(!isDataURI(f)){return locateFile(f)}return f}return new URL("elastix.wasm",import.meta.url).href}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=applySignatureConversions(wasmExports);wasmMemory=wasmExports["E"];updateMemoryViews();addOnInit(wasmExports["F"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}wasmBinaryFile??=findWasmBinary();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);receiveInstantiationResult(result);return result}catch(e){readyPromiseReject(e);return}}var tempDouble;var tempI64;class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>>2>>>0]=type}get_type(){return HEAPU32[this.ptr+4>>>2>>>0]}set_destructor(destructor){HEAPU32[this.ptr+8>>>2>>>0]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>>2>>>0]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12>>>0]=caught}get_caught(){return HEAP8[this.ptr+12>>>0]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>>0]=rethrown}get_rethrown(){return HEAP8[this.ptr+13>>>0]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>>2>>>0]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>>2>>>0]}}var exceptionLast=0;var uncaughtExceptionCount=0;var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___cxa_throw(ptr,type,destructor){ptr>>>=0;type>>>=0;destructor>>>=0;var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{idx>>>=0;var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}}heap[outIdx>>>0]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length>>0)}}return{ptr,allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url).then(processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var NODEFS={isWindows:false,staticInit(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process.binding("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode(e){var code=e.code;return ERRNO_CODES[code]},tryFSOperation(f){try{return f()}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},mount(mount){return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode(path){return NODEFS.tryFSOperation(()=>{var mode=fs.lstatSync(path).mode;if(NODEFS.isWindows){mode|=(mode&292)>>2}return mode})},realPath(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join(...parts)},flagsForNode(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(flags){throw new FS.ErrnoError(28)}return newFlags},node_ops:{getattr(node){var path=NODEFS.realPath(node);var stat;NODEFS.tryFSOperation(()=>stat=fs.lstatSync(path));if(NODEFS.isWindows){if(!stat.blksize){stat.blksize=4096}if(!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}stat.mode|=(stat.mode&292)>>2}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr(node,attr){var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(attr.mode!==undefined){var mode=attr.mode;if(NODEFS.isWindows){mode&=384}fs.chmodSync(path,mode);node.mode=attr.mode}if(attr.atime||attr.mtime){var atime=attr.atime&&new Date(attr.atime);var mtime=attr.mtime&&new Date(attr.mtime);fs.utimesSync(path,atime,mtime)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}})},lookup(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);NODEFS.tryFSOperation(()=>{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}});return node},rename(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{FS.unlink(newPath)}catch(e){}NODEFS.tryFSOperation(()=>fs.renameSync(oldPath,newPath));oldNode.name=newName},unlink(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.unlinkSync(path))},rmdir(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);NODEFS.tryFSOperation(()=>fs.rmdirSync(path))},readdir(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readdirSync(path))},symlink(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);NODEFS.tryFSOperation(()=>fs.symlinkSync(oldPath,newPath))},readlink(node){var path=NODEFS.realPath(node);return NODEFS.tryFSOperation(()=>fs.readlinkSync(path))},statfs(path){var stats=NODEFS.tryFSOperation(()=>fs.statfsSync(path));stats.frsize=stats.bsize;return stats}},stream_ops:{open(stream){var path=NODEFS.realPath(stream.node);NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)){stream.shared.refcount=1;stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}})},close(stream){NODEFS.tryFSOperation(()=>{if(FS.isFile(stream.node.mode)&&stream.nfd&&--stream.shared.refcount===0){fs.closeSync(stream.nfd)}})},dup(stream){stream.shared.refcount++},read(stream,buffer,offset,length,position){if(length===0)return 0;return NODEFS.tryFSOperation(()=>fs.readSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},write(stream,buffer,offset,length,position){return NODEFS.tryFSOperation(()=>fs.writeSync(stream.nfd,new Int8Array(buffer.buffer,offset,length),0,length,position))},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){NODEFS.tryFSOperation(()=>{var stat=fs.fstatSync(stream.nfd);position+=stat.size})}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}},msync(stream,buffer,offset,length,mmapFlags){NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},filesystems:null,syncFSRequests:0,readFiles:{},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path)return{path:"",node:null};opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p&&p!==".");var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};var parent=FS.lookupPath(path,{follow:true}).node;if(parent?.node_ops.statfs){Object.assign(rtn,parent.node_ops.statfs(parent.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS,NODEFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>{ptr>>>=0;return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>>2>>>0]=stat.dev;HEAP32[buf+4>>>2>>>0]=stat.mode;HEAPU32[buf+8>>>2>>>0]=stat.nlink;HEAP32[buf+12>>>2>>>0]=stat.uid;HEAP32[buf+16>>>2>>>0]=stat.gid;HEAP32[buf+20>>>2>>>0]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>>2>>>0]=tempI64[0],HEAP32[buf+28>>>2>>>0]=tempI64[1];HEAP32[buf+32>>>2>>>0]=4096;HEAP32[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>>2>>>0]=tempI64[0],HEAP32[buf+44>>>2>>>0]=tempI64[1];HEAPU32[buf+48>>>2>>>0]=atime%1e3*1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>>2>>>0]=tempI64[0],HEAP32[buf+60>>>2>>>0]=tempI64[1];HEAPU32[buf+64>>>2>>>0]=mtime%1e3*1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>>2>>>0]=tempI64[0],HEAP32[buf+76>>>2>>>0]=tempI64[1];HEAPU32[buf+80>>>2>>>0]=ctime%1e3*1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>>2>>>0]=tempI64[0],HEAP32[buf+92>>>2>>>0]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_faccessat(dirfd,path,amode,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){varargs>>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>>1>>>0]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){buf>>>=0;size>>>=0;try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>=0;SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=termios.c_iflag||0;HEAP32[argp+4>>>2>>>0]=termios.c_oflag||0;HEAP32[argp+8>>>2>>>0]=termios.c_cflag||0;HEAP32[argp+12>>>2>>>0]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>>2>>>0];var c_oflag=HEAP32[argp+4>>>2>>>0];var c_cflag=HEAP32[argp+8>>>2>>>0];var c_lflag=HEAP32[argp+12>>>2>>>0];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>>2>>>0]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>>1>>>0]=winsize[0];HEAP16[argp+2>>>1>>>0]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){path>>>=0;buf>>>=0;bufsize>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len>>>0];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len>>>0]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){path>>>=0;buf>>>=0;try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){path>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var readI53FromI64=ptr=>HEAPU32[ptr>>>2>>>0]+HEAP32[ptr+4>>>2>>>0]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){path>>>=0;times>>>=0;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);var now=Date.now(),atime,mtime;if(!times){atime=now;mtime=now}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>>2>>>0];if(nanoseconds==1073741823){atime=now}else if(nanoseconds==1073741822){atime=null}else{atime=seconds*1e3+nanoseconds/(1e3*1e3)}times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>>2>>>0];if(nanoseconds==1073741823){mtime=now}else if(nanoseconds==1073741822){mtime=null}else{mtime=seconds*1e3+nanoseconds/(1e3*1e3)}}if((mtime??atime)!==null){FS.utime(path,atime,mtime)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>abort("");function __emscripten_memcpy_js(dest,src,num){dest>>>=0;src>>>=0;num>>>=0;return HEAPU8.copyWithin(dest>>>0,src>>>0,src+num>>>0)}var runtimeKeepaliveCounter=0;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone>>>=0;daylight>>>=0;std_name>>>=0;dst_name>>>=0;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>>2>>>0]=stdTimezoneOffset*60;HEAP32[daylight>>>2>>>0]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetDate.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;function _clock_time_get(clk_id,ignored_precision_low,ignored_precision_high,ptime){var ignored_precision=convertI32PairToI53Checked(ignored_precision_low,ignored_precision_high);ptime>>>=0;if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);tempI64=[nsec>>>0,(tempDouble=nsec,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptime>>>2>>>0]=tempI64[0],HEAP32[ptime+4>>>2>>>0]=tempI64[1];return 0}var getHeapMax=()=>4294901760;function _emscripten_get_heap_max(){return getHeapMax()}var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=HEAPU8.length;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>>0]=str.charCodeAt(i)}HEAP8[buffer>>>0]=0};var _environ_get=function(__environ,environ_buf){__environ>>>=0;environ_buf>>>=0;var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>>2>>>0]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=function(penviron_count,penviron_buf_size){penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();HEAPU32[penviron_count>>>2>>>0]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>>2>>>0]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>>2>>>0]=tempI64[0],HEAP32[newOffset+4>>>2>>>0]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=HEAPU32[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer>>>0)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var FS_createPath=FS.createPath;var FS_unlink=path=>FS.unlink(path);var FS_createLazyFile=FS.createLazyFile;var FS_createDevice=FS.createDevice;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack="";if(ENVIRONMENT_IS_NODE){NODEFS.staticInit()}var wasmImports={a:___cxa_throw,i:___syscall_faccessat,e:___syscall_fcntl64,z:___syscall_getcwd,C:___syscall_ioctl,x:___syscall_lstat64,v:___syscall_mkdirat,w:___syscall_newfstatat,D:___syscall_openat,r:___syscall_readlinkat,y:___syscall_stat64,p:___syscall_unlinkat,o:___syscall_utimensat,j:__abort_js,h:__emscripten_memcpy_js,s:__emscripten_runtime_keepalive_clear,m:__setitimer_js,t:__tzset_js,l:_clock_time_get,c:_emscripten_date_now,q:_emscripten_get_heap_max,n:_emscripten_resize_heap,f:_environ_get,g:_environ_sizes_get,b:_exit,d:_fd_close,B:_fd_read,k:_fd_seek,A:_fd_write,u:_proc_exit};var wasmExports;createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["F"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["G"])(a0,a1);var _itk_wasm_input_array_alloc=Module["_itk_wasm_input_array_alloc"]=(a0,a1,a2,a3)=>(_itk_wasm_input_array_alloc=Module["_itk_wasm_input_array_alloc"]=wasmExports["H"])(a0,a1,a2,a3);var _itk_wasm_input_json_alloc=Module["_itk_wasm_input_json_alloc"]=(a0,a1,a2)=>(_itk_wasm_input_json_alloc=Module["_itk_wasm_input_json_alloc"]=wasmExports["I"])(a0,a1,a2);var _itk_wasm_output_json_address=Module["_itk_wasm_output_json_address"]=(a0,a1)=>(_itk_wasm_output_json_address=Module["_itk_wasm_output_json_address"]=wasmExports["J"])(a0,a1);var _itk_wasm_output_json_size=Module["_itk_wasm_output_json_size"]=(a0,a1)=>(_itk_wasm_output_json_size=Module["_itk_wasm_output_json_size"]=wasmExports["K"])(a0,a1);var _itk_wasm_output_array_address=Module["_itk_wasm_output_array_address"]=(a0,a1,a2)=>(_itk_wasm_output_array_address=Module["_itk_wasm_output_array_address"]=wasmExports["L"])(a0,a1,a2);var _itk_wasm_output_array_size=Module["_itk_wasm_output_array_size"]=(a0,a1,a2)=>(_itk_wasm_output_array_size=Module["_itk_wasm_output_array_size"]=wasmExports["M"])(a0,a1,a2);var _itk_wasm_free_all=Module["_itk_wasm_free_all"]=()=>(_itk_wasm_free_all=Module["_itk_wasm_free_all"]=wasmExports["N"])();var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["P"])(a0,a1);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Q"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["R"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["S"])();function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["R"]=makeWrapper_pp(wasmExports["R"]);wasmExports["S"]=makeWrapper_p(wasmExports["S"]);return wasmExports}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["callMain"]=callMain;Module["stackSave"]=stackSave;Module["stackRestore"]=stackRestore;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["writeArrayToMemory"]=writeArrayToMemory;Module["FS_createPreloadedFile"]=FS_createPreloadedFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=_main;args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv;args.forEach(arg=>{HEAPU32[argv_ptr>>>2>>>0]=stringToUTF8OnStack(arg);argv_ptr+=4});HEAPU32[argv_ptr>>>2>>>0]=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run();Module.mountContainingDir=function(filePath){if(!ENVIRONMENT_IS_NODE){return}var path=require("path");var containingDir=path.dirname(filePath);if(containingDir==="/"){throw new Error("Cannot mount root directory")}var currentDir="/";var splitContainingDir=containingDir.split(path.sep);for(var ii=1;ii} - result object */ async function elastixNode( parameterObject: JsonCompatible, - transform: string, options: ElastixNodeOptions = {} ) : Promise { - const mountDirs: Set = new Set() - const desiredOutputs: Array = [ { type: InterfaceTypes.Image }, + { type: InterfaceTypes.TransformList }, { type: InterfaceTypes.JsonCompatible }, ] @@ -50,11 +48,10 @@ async function elastixNode( const resultName = '0' args.push(resultName) - const transformName = transform + const transformName = '1' args.push(transformName) - mountDirs.add(path.dirname(transformName)) - const transformParameterObjectName = '1' + const transformParameterObjectName = '2' args.push(transformParameterObjectName) // Options @@ -72,12 +69,9 @@ async function elastixNode( } if (options.initialTransform) { - const initialTransform = options.initialTransform - mountDirs.add(path.dirname(initialTransform as string)) - args.push('--initial-transform') - - const name = initialTransform as string - args.push(name) + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.TransformList, data: options.initialTransform as TransformList }) + args.push('--initial-transform', inputCountString) } if (options.initialTransformParameterObject) { @@ -93,14 +87,15 @@ async function elastixNode( returnValue, stderr, outputs - } = await runPipelineNode(pipelinePath, args, desiredOutputs, inputs, mountDirs) + } = await runPipelineNode(pipelinePath, args, desiredOutputs, inputs) if (returnValue !== 0 && stderr !== "") { throw new Error(stderr) } const result = { result: outputs[0]?.data as Image, - transformParameterObject: outputs[1]?.data as JsonCompatible, + transform: outputs[1]?.data as TransformList, + transformParameterObject: outputs[2]?.data as JsonCompatible, } return result } diff --git a/wasm/typescript/src/elastix-options.ts b/wasm/typescript/src/elastix-options.ts index a47af6c..812eda1 100644 --- a/wasm/typescript/src/elastix-options.ts +++ b/wasm/typescript/src/elastix-options.ts @@ -1,6 +1,6 @@ // Generated file. To retain edits, remove this comment. -import { Image,BinaryFile,JsonCompatible, WorkerPoolFunctionOption } from 'itk-wasm' +import { Image,TransformList,JsonCompatible, WorkerPoolFunctionOption } from 'itk-wasm' interface ElastixOptions extends WorkerPoolFunctionOption { /** Fixed image */ @@ -10,7 +10,7 @@ interface ElastixOptions extends WorkerPoolFunctionOption { moving?: Image /** Initial transform to apply before registration */ - initialTransform?: string | File | BinaryFile + initialTransform?: TransformList /** Initial elastix transform parameter object to apply before registration. Only provide this or an initial transform. */ initialTransformParameterObject?: JsonCompatible diff --git a/wasm/typescript/src/elastix-result.ts b/wasm/typescript/src/elastix-result.ts index 0dbdff6..56636d9 100644 --- a/wasm/typescript/src/elastix-result.ts +++ b/wasm/typescript/src/elastix-result.ts @@ -1,13 +1,13 @@ // Generated file. To retain edits, remove this comment. -import { Image, BinaryFile, JsonCompatible, WorkerPoolFunctionResult } from 'itk-wasm' +import { Image, TransformList, JsonCompatible, WorkerPoolFunctionResult } from 'itk-wasm' interface ElastixResult extends WorkerPoolFunctionResult { /** Resampled moving image */ result: Image /** Fixed-to-moving transform file */ - transform: BinaryFile + transform: TransformList /** Elastix optimized transform parameter object representation */ transformParameterObject: JsonCompatible diff --git a/wasm/typescript/src/elastix.ts b/wasm/typescript/src/elastix.ts index 6899e15..6d49706 100644 --- a/wasm/typescript/src/elastix.ts +++ b/wasm/typescript/src/elastix.ts @@ -3,7 +3,7 @@ import { JsonCompatible, Image, - BinaryFile, + TransformList, InterfaceTypes, PipelineOutput, PipelineInput, @@ -22,20 +22,18 @@ import { getDefaultWebWorker } from './default-web-worker.js' * Rigid and non-rigid registration of images. * * @param {JsonCompatible} parameterObject - Elastix parameter object representation - * @param {string} transform - Fixed-to-moving transform file * @param {ElastixOptions} options - options object * * @returns {Promise} - result object */ async function elastix( parameterObject: JsonCompatible, - transform: string, options: ElastixOptions = {} ) : Promise { const desiredOutputs: Array = [ { type: InterfaceTypes.Image }, - { type: InterfaceTypes.BinaryFile, data: { path: transform, data: new Uint8Array() }}, + { type: InterfaceTypes.TransformList }, { type: InterfaceTypes.JsonCompatible }, ] @@ -52,7 +50,7 @@ async function elastix( const resultName = '0' args.push(resultName) - const transformName = transform + const transformName = '1' args.push(transformName) const transformParameterObjectName = '2' @@ -73,17 +71,9 @@ async function elastix( } if (options.initialTransform) { - const initialTransform = options.initialTransform - let initialTransformFile = initialTransform - if (initialTransform instanceof File) { - const initialTransformBuffer = await initialTransform.arrayBuffer() - initialTransformFile = { path: initialTransform.name, data: new Uint8Array(initialTransformBuffer) } - } - args.push('--initial-transform') - - inputs.push({ type: InterfaceTypes.BinaryFile, data: initialTransformFile as BinaryFile }) - const name = initialTransform instanceof File ? initialTransform.name : (initialTransform as BinaryFile).path - args.push(name) + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.TransformList, data: options.initialTransform as TransformList }) + args.push('--initial-transform', inputCountString) } if (options.initialTransformParameterObject) { @@ -112,7 +102,7 @@ async function elastix( const result = { webWorker: usedWebWorker as Worker, result: outputs[0]?.data as Image, - transform: outputs[1]?.data as BinaryFile, + transform: outputs[1]?.data as TransformList, transformParameterObject: outputs[2]?.data as JsonCompatible, } return result diff --git a/wasm/typescript/src/index-common.ts b/wasm/typescript/src/index-common.ts index 718c5e2..5a72d26 100644 --- a/wasm/typescript/src/index-common.ts +++ b/wasm/typescript/src/index-common.ts @@ -4,3 +4,4 @@ export { default as version } from './version.js' export type { JsonCompatible } from 'itk-wasm' export type { Image } from 'itk-wasm' +export type { TransformList } from 'itk-wasm' diff --git a/wasm/typescript/src/index-node-only.ts b/wasm/typescript/src/index-node-only.ts index 4a15852..b32b61d 100644 --- a/wasm/typescript/src/index-node-only.ts +++ b/wasm/typescript/src/index-node-only.ts @@ -32,6 +32,16 @@ import readParameterFilesNode from './read-parameter-files-node.js' export { readParameterFilesNode } +import TransformixNodeResult from './transformix-node-result.js' +export type { TransformixNodeResult } + +import TransformixNodeOptions from './transformix-node-options.js' +export type { TransformixNodeOptions } + +import transformixNode from './transformix-node.js' +export { transformixNode } + + import WriteParameterFilesNodeResult from './write-parameter-files-node-result.js' export type { WriteParameterFilesNodeResult } diff --git a/wasm/typescript/src/index-only.ts b/wasm/typescript/src/index-only.ts index 89c837d..7e0ab0a 100644 --- a/wasm/typescript/src/index-only.ts +++ b/wasm/typescript/src/index-only.ts @@ -35,6 +35,16 @@ import readParameterFiles from './read-parameter-files.js' export { readParameterFiles } +import TransformixResult from './transformix-result.js' +export type { TransformixResult } + +import TransformixOptions from './transformix-options.js' +export type { TransformixOptions } + +import transformix from './transformix.js' +export { transformix } + + import WriteParameterFilesResult from './write-parameter-files-result.js' export type { WriteParameterFilesResult } diff --git a/wasm/typescript/src/transformix-node-options.ts b/wasm/typescript/src/transformix-node-options.ts new file mode 100644 index 0000000..fb87d14 --- /dev/null +++ b/wasm/typescript/src/transformix-node-options.ts @@ -0,0 +1,18 @@ +// Generated file. To retain edits, remove this comment. + +interface TransformixNodeOptions { + /** Output image origin. */ + outputOrigin?: number[] + + /** Output image spacing. */ + outputSpacing?: number[] + + /** Output image size. */ + outputSize?: number[] + + /** Output image orientation direction matrix. */ + outputDirection?: number[] + +} + +export default TransformixNodeOptions diff --git a/wasm/typescript/src/transformix-node-result.ts b/wasm/typescript/src/transformix-node-result.ts new file mode 100644 index 0000000..1549bfb --- /dev/null +++ b/wasm/typescript/src/transformix-node-result.ts @@ -0,0 +1,11 @@ +// Generated file. To retain edits, remove this comment. + +import { Image } from 'itk-wasm' + +interface TransformixNodeResult { + /** Resampled moving image */ + result: Image + +} + +export default TransformixNodeResult diff --git a/wasm/typescript/src/transformix-node.ts b/wasm/typescript/src/transformix-node.ts new file mode 100644 index 0000000..a338b78 --- /dev/null +++ b/wasm/typescript/src/transformix-node.ts @@ -0,0 +1,114 @@ +// Generated file. To retain edits, remove this comment. + +import { + Image, + JsonCompatible, + InterfaceTypes, + PipelineOutput, + PipelineInput, + runPipelineNode +} from 'itk-wasm' + +import TransformixNodeOptions from './transformix-node-options.js' +import TransformixNodeResult from './transformix-node-result.js' + +import path from 'path' +import { fileURLToPath } from 'url' + +/** + * Apply an elastix transform parameter object to an image. + * + * @param {Image} moving - Moving image + * @param {JsonCompatible} transformParameterObject - Elastix transform parameter object to apply. Only provide this or an initial transform. + * @param {TransformixNodeOptions} options - options object + * + * @returns {Promise} - result object + */ +async function transformixNode( + moving: Image, + transformParameterObject: JsonCompatible, + options: TransformixNodeOptions = {} +) : Promise { + + const desiredOutputs: Array = [ + { type: InterfaceTypes.Image }, + ] + + const inputs: Array = [ + { type: InterfaceTypes.Image, data: moving }, + { type: InterfaceTypes.JsonCompatible, data: transformParameterObject as JsonCompatible }, + ] + + const args = [] + // Inputs + const movingName = '0' + args.push(movingName) + + const transformParameterObjectName = '1' + args.push(transformParameterObjectName) + + // Outputs + const resultName = '0' + args.push(resultName) + + // Options + args.push('--memory-io') + if (options.outputOrigin) { + if(options.outputOrigin.length < 1) { + throw new Error('"output-origin" option must have a length > 1') + } + args.push('--output-origin') + + options.outputOrigin.forEach((value) => { + args.push(value.toString()) + }) + } + if (options.outputSpacing) { + if(options.outputSpacing.length < 1) { + throw new Error('"output-spacing" option must have a length > 1') + } + args.push('--output-spacing') + + options.outputSpacing.forEach((value) => { + args.push(value.toString()) + }) + } + if (options.outputSize) { + if(options.outputSize.length < 1) { + throw new Error('"output-size" option must have a length > 1') + } + args.push('--output-size') + + options.outputSize.forEach((value) => { + args.push(value.toString()) + }) + } + if (options.outputDirection) { + if(options.outputDirection.length < 1) { + throw new Error('"output-direction" option must have a length > 1') + } + args.push('--output-direction') + + options.outputDirection.forEach((value) => { + args.push(value.toString()) + }) + } + + const pipelinePath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'pipelines', 'transformix') + + const { + returnValue, + stderr, + outputs + } = await runPipelineNode(pipelinePath, args, desiredOutputs, inputs) + if (returnValue !== 0 && stderr !== "") { + throw new Error(stderr) + } + + const result = { + result: outputs[0]?.data as Image, + } + return result +} + +export default transformixNode diff --git a/wasm/typescript/src/transformix-options.ts b/wasm/typescript/src/transformix-options.ts new file mode 100644 index 0000000..aefed12 --- /dev/null +++ b/wasm/typescript/src/transformix-options.ts @@ -0,0 +1,20 @@ +// Generated file. To retain edits, remove this comment. + +import { WorkerPoolFunctionOption } from 'itk-wasm' + +interface TransformixOptions extends WorkerPoolFunctionOption { + /** Output image origin. */ + outputOrigin?: number[] + + /** Output image spacing. */ + outputSpacing?: number[] + + /** Output image size. */ + outputSize?: number[] + + /** Output image orientation direction matrix. */ + outputDirection?: number[] + +} + +export default TransformixOptions diff --git a/wasm/typescript/src/transformix-result.ts b/wasm/typescript/src/transformix-result.ts new file mode 100644 index 0000000..30cf3a2 --- /dev/null +++ b/wasm/typescript/src/transformix-result.ts @@ -0,0 +1,11 @@ +// Generated file. To retain edits, remove this comment. + +import { Image, WorkerPoolFunctionResult } from 'itk-wasm' + +interface TransformixResult extends WorkerPoolFunctionResult { + /** Resampled moving image */ + result: Image + +} + +export default TransformixResult diff --git a/wasm/typescript/src/transformix.ts b/wasm/typescript/src/transformix.ts new file mode 100644 index 0000000..fd56b71 --- /dev/null +++ b/wasm/typescript/src/transformix.ts @@ -0,0 +1,122 @@ +// Generated file. To retain edits, remove this comment. + +import { + Image, + JsonCompatible, + InterfaceTypes, + PipelineOutput, + PipelineInput, + runPipeline +} from 'itk-wasm' + +import TransformixOptions from './transformix-options.js' +import TransformixResult from './transformix-result.js' + +import { getPipelinesBaseUrl } from './pipelines-base-url.js' +import { getPipelineWorkerUrl } from './pipeline-worker-url.js' + +import { getDefaultWebWorker } from './default-web-worker.js' + +/** + * Apply an elastix transform parameter object to an image. + * + * @param {Image} moving - Moving image + * @param {JsonCompatible} transformParameterObject - Elastix transform parameter object to apply. Only provide this or an initial transform. + * @param {TransformixOptions} options - options object + * + * @returns {Promise} - result object + */ +async function transformix( + moving: Image, + transformParameterObject: JsonCompatible, + options: TransformixOptions = {} +) : Promise { + + const desiredOutputs: Array = [ + { type: InterfaceTypes.Image }, + ] + + const inputs: Array = [ + { type: InterfaceTypes.Image, data: moving }, + { type: InterfaceTypes.JsonCompatible, data: transformParameterObject as JsonCompatible }, + ] + + const args = [] + // Inputs + const movingName = '0' + args.push(movingName) + + const transformParameterObjectName = '1' + args.push(transformParameterObjectName) + + // Outputs + const resultName = '0' + args.push(resultName) + + // Options + args.push('--memory-io') + if (options.outputOrigin) { + if(options.outputOrigin.length < 1) { + throw new Error('"output-origin" option must have a length > 1') + } + args.push('--output-origin') + + await Promise.all(options.outputOrigin.map(async (value) => { + args.push(value.toString()) + })) + } + if (options.outputSpacing) { + if(options.outputSpacing.length < 1) { + throw new Error('"output-spacing" option must have a length > 1') + } + args.push('--output-spacing') + + await Promise.all(options.outputSpacing.map(async (value) => { + args.push(value.toString()) + })) + } + if (options.outputSize) { + if(options.outputSize.length < 1) { + throw new Error('"output-size" option must have a length > 1') + } + args.push('--output-size') + + await Promise.all(options.outputSize.map(async (value) => { + args.push(value.toString()) + })) + } + if (options.outputDirection) { + if(options.outputDirection.length < 1) { + throw new Error('"output-direction" option must have a length > 1') + } + args.push('--output-direction') + + await Promise.all(options.outputDirection.map(async (value) => { + args.push(value.toString()) + })) + } + + const pipelinePath = 'transformix' + + let workerToUse = options?.webWorker + if (workerToUse === undefined) { + workerToUse = await getDefaultWebWorker() + } + const { + webWorker: usedWebWorker, + returnValue, + stderr, + outputs + } = await runPipeline(pipelinePath, args, desiredOutputs, inputs, { pipelineBaseUrl: getPipelinesBaseUrl(), pipelineWorkerUrl: getPipelineWorkerUrl(), webWorker: workerToUse, noCopy: options?.noCopy }) + if (returnValue !== 0 && stderr !== "") { + throw new Error(stderr) + } + + const result = { + webWorker: usedWebWorker as Worker, + result: outputs[0]?.data as Image, + } + return result +} + +export default transformix diff --git a/wasm/typescript/src/version.ts b/wasm/typescript/src/version.ts index 9252bd9..13a4022 100644 --- a/wasm/typescript/src/version.ts +++ b/wasm/typescript/src/version.ts @@ -1,3 +1,3 @@ -const version = "0.4.0" +const version = "1.0.2" export default version diff --git a/wasm/typescript/test/browser/common.ts b/wasm/typescript/test/browser/common.ts deleted file mode 100644 index 86ca403..0000000 --- a/wasm/typescript/test/browser/common.ts +++ /dev/null @@ -1 +0,0 @@ -export const demoServer = "http://localhost:5173"; diff --git a/wasm/typescript/test/node/elastix-test.js b/wasm/typescript/test/node/elastix-test.js index 4a40654..72c8d77 100644 --- a/wasm/typescript/test/node/elastix-test.js +++ b/wasm/typescript/test/node/elastix-test.js @@ -25,11 +25,8 @@ test("Default 2D registration", async (t) => { const parameterObject = JSON.parse( fs.readFileSync(path.join(testDataInputDirectory, "parameters_single.json")) ); - const transform = path.join( - testDataOutputDirectory, - "CT_2D_head_node_transform.txt" - ); - const { result } = await elastixNode(parameterObject, transform, { + + const { result } = await elastixNode(parameterObject, { fixed: fixedImage, moving: movingImage, }); diff --git a/wasm/write-parameter-files.cxx b/wasm/write-parameter-files.cxx index 6914aa1..728fa83 100644 --- a/wasm/write-parameter-files.cxx +++ b/wasm/write-parameter-files.cxx @@ -19,12 +19,14 @@ #include "itkPipeline.h" #include "itkInputTextStream.h" -#include "rapidjson/document.h" -#include "rapidjson/prettywriter.h" -#include "rapidjson/stringbuffer.h" - #include +#include "itkElastixWasmParameterObject.h" + +#include "glaze/glaze.hpp" + +#include "itkNumberToString.h" + int main(int argc, char * argv[]) { @@ -47,31 +49,60 @@ main(int argc, char * argv[]) ITK_WASM_PARSE(pipeline); - rapidjson::Document document; - std::stringstream ss; + std::stringstream ss; ss << parameterObjectJson.Get().rdbuf(); - document.Parse(ss.str().c_str()); + itk::wasm::ParameterMapVector wasmParameterMaps; + auto errorCode = glz::read_json(wasmParameterMaps, ss.str()); + if (errorCode) + { + const std::string errorMessage = glz::format_error(errorCode, ss.str()); + std::cerr << "Error reading parameter object JSON: " << errorMessage << std::endl; + return EXIT_FAILURE; + } using ParameterObjectType = elastix::ParameterObject; - const auto numParameterMaps = document.Size(); - using ParameterMapType = std::map>; - std::vector parameterMaps; - for (unsigned int i = 0; i < numParameterMaps; ++i) + const auto numParameterMaps = wasmParameterMaps.size(); + ParameterObjectType::ParameterMapVectorType parameterMaps; + parameterMaps.reserve(numParameterMaps); + for (const auto wasmParameterMap : wasmParameterMaps) { - const auto & parameterMapJson = document[i]; - ParameterMapType parameterMap; - for (auto it = parameterMapJson.MemberBegin(); it != parameterMapJson.MemberEnd(); ++it) + ParameterObjectType::ParameterMapType parameterMap; + for (const auto & parameter : wasmParameterMap) { - const auto & key = it->name.GetString(); - const auto & valueJson = it->value; - std::vector value; - for (auto it2 = valueJson.Begin(); it2 != valueJson.End(); ++it2) + ParameterObjectType::ParameterValueVectorType parameterValues; + for (const auto & value : parameter.second) { - const auto & valueElement = it2->GetString(); - value.push_back(valueElement); + if (value.index() == 0) + { + const auto & valueString = std::get(value); + parameterValues.push_back(valueString); + } + else if (value.index() == 1) + { + const auto & valueBool = std::get(value); + if (valueBool) + { + parameterValues.push_back("true"); + } + else + { + parameterValues.push_back("false"); + } + } + else if (value.index() == 2) + { + const auto & valueInt = std::get(value); + parameterValues.push_back(itk::ConvertNumberToString(valueInt)); + } + else if (value.index() == 3) + { + const auto & valueDouble = std::get(value); + parameterValues.push_back(itk::ConvertNumberToString(valueDouble)); + } } - parameterMap[key] = value; + parameterMap[parameter.first] = parameterValues; } + parameterMaps.push_back(parameterMap); }