From 60bebb233b07b63e60fad0a11a6c71e3520f8c59 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 7 Jul 2026 16:50:52 -0400 Subject: [PATCH] feat(downsample): add resample-to-reference pipeline (transform + interpolator + background value) Add a `resample-to-reference` pipeline to @itk-wasm/downsample that resamples a moving image onto a reference image's sampling grid. Features: - Reference image supplies the output grid geometry (origin, spacing, direction, size); only its geometry is read. - Optional transform mapping output-grid points into the moving-image space. Any single parameterization (translation, rigid, affine, B-spline, ...) is reconstructed generically into the abstract itk::Transform base via the ITK object factory; a multi-entry or composite TransformList is composed into an itk::CompositeTransform (last list entry applied to the point first, matching itk::CompositeTransform semantics). Shared with resample-bounding-box through resampleReadInputTransform.h. - Selectable interpolator: linear, nearest_neighbor, label_image, b_spline, windowed_sinc, gaussian. - Configurable background value (`--default-value` / `defaultValue`) threaded into ResampleImageFilter::SetDefaultPixelValue, cast to the pixel type; defaults to 0. - Scalar and itk::VectorImage (multi-component) pixel-type paths, with the shared option surface hoisted into a ResampleOptions helper. Includes TypeScript + Python bindings, Node/Python/C++ tests, a browser demo, and independently generated baselines. Also carries a bindgen fix (wasi Python interpolator-choice validation split on ',' not ', ') and builds @itk-wasm/transform-io in the demo/CI. Rebased onto upstream main alongside the resample-bounding-box pipeline; the two share resampleReadInputTransform.h (this pipeline's version adds composite-list support and retains readInputTransformDimension for bounding-box) and the package test-data tarball (a superset already covering both). Squashed from the prior 15-commit branch to keep the rebase over the sibling pipeline's overlapping generated files tractable. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../python/wasi/wasi-function-module.js | 2 +- packages/downsample/CMakeLists.txt | 68 + packages/downsample/downsample.cxx | 68 +- packages/downsample/package.json | 6 +- packages/downsample/pixi.lock | 7149 +++++++++-------- packages/downsample/pixi.toml | 1 + .../itkwasm_downsample_emscripten/__init__.py | 1 + .../js_package.py | 2 +- .../resample_to_reference_async.py | 73 + .../pyproject.toml | 2 +- .../itkwasm_downsample_wasi/__init__.py | 1 + .../resample_to_reference.py | 91 + .../itkwasm-downsample-wasi/pyproject.toml | 2 +- .../test/test_resample_to_reference.py | 298 + .../tests/test_resample_to_reference.py | 8 + .../itkwasm_downsample/__init__.py | 2 + .../resample_to_reference.py | 41 + .../resample_to_reference_async.py | 41 + .../python/itkwasm-downsample/pyproject.toml | 2 +- packages/downsample/resample-to-reference.cxx | 364 + .../downsample/resampleReadInputTransform.h | 214 +- packages/downsample/typescript/README.md | 65 + .../typescript/src/index-node-only.ts | 10 + .../downsample/typescript/src/index-only.ts | 10 + .../src/resample-to-reference-node-options.ts | 17 + .../src/resample-to-reference-node-result.ts | 11 + .../src/resample-to-reference-node.ts | 91 + .../src/resample-to-reference-options.ts | 17 + .../src/resample-to-reference-result.ts | 11 + .../typescript/src/resample-to-reference.ts | 99 + .../test/browser/demo-app/index.html | 57 + .../typescript/test/browser/demo-app/index.ts | 1 + .../resample-to-reference-controller.ts | 189 + ...esample-to-reference-load-sample-inputs.ts | 51 + .../browser/resample-to-reference.spec.ts | 55 + .../test/node/resample-to-reference-test.js | 220 + packages/downsample/typescript/vite.config.js | 3 +- 37 files changed, 5693 insertions(+), 3650 deletions(-) create mode 100644 packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/resample_to_reference_async.py create mode 100644 packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/resample_to_reference.py create mode 100644 packages/downsample/python/itkwasm-downsample-wasi/test/test_resample_to_reference.py create mode 100644 packages/downsample/python/itkwasm-downsample-wasi/tests/test_resample_to_reference.py create mode 100644 packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference.py create mode 100644 packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference_async.py create mode 100644 packages/downsample/resample-to-reference.cxx create mode 100644 packages/downsample/typescript/src/resample-to-reference-node-options.ts create mode 100644 packages/downsample/typescript/src/resample-to-reference-node-result.ts create mode 100644 packages/downsample/typescript/src/resample-to-reference-node.ts create mode 100644 packages/downsample/typescript/src/resample-to-reference-options.ts create mode 100644 packages/downsample/typescript/src/resample-to-reference-result.ts create mode 100644 packages/downsample/typescript/src/resample-to-reference.ts create mode 100644 packages/downsample/typescript/test/browser/demo-app/resample-to-reference-controller.ts create mode 100644 packages/downsample/typescript/test/browser/demo-app/resample-to-reference-load-sample-inputs.ts create mode 100644 packages/downsample/typescript/test/browser/resample-to-reference.spec.ts create mode 100644 packages/downsample/typescript/test/node/resample-to-reference-test.js diff --git a/packages/core/typescript/itk-wasm/src/bindgen/python/wasi/wasi-function-module.js b/packages/core/typescript/itk-wasm/src/bindgen/python/wasi/wasi-function-module.js index d69d249bd..afad2b36a 100644 --- a/packages/core/typescript/itk-wasm/src/bindgen/python/wasi/wasi-function-module.js +++ b/packages/core/typescript/itk-wasm/src/bindgen/python/wasi/wasi-function-module.js @@ -239,7 +239,7 @@ from itkwasm import ( ? ` if ${snake}:\n` : ` if ${snake} is not None:\n` if (parameter.type.startsWith('TEXT:{')) { - const choices = parameter.type.split('{')[1].split('}')[0].split(', ') + const choices = parameter.type.split('{')[1].split('}')[0].split(',') args += ` if ${snake} not in (${choices.map((c) => `'${c}'`).join(',')}):\n` args += ` raise ValueError(f'${snake} must be one of ${choices.join(', ')}')\n` } diff --git a/packages/downsample/CMakeLists.txt b/packages/downsample/CMakeLists.txt index 69ca2f36d..f6546fa65 100644 --- a/packages/downsample/CMakeLists.txt +++ b/packages/downsample/CMakeLists.txt @@ -14,6 +14,8 @@ else() set(io_components ITKImageIO ITKTransformIO + ITKIOTransformInsightLegacy + ITKIOTransformHDF5 ) endif() @@ -22,6 +24,7 @@ find_package(ITK REQUIRED WebAssemblyInterface ITKSmoothing ITKImageGrid + ITKImageFunction ITKTransform GenericLabelInterpolator ${io_components} @@ -35,6 +38,7 @@ set(pipelines downsample-bin-shrink downsample-label-image resample-bounding-box + resample-to-reference ) # resample-bounding-box-generate-inputs fabricates the self-contained inputs (fixed image, moving image, @@ -163,3 +167,67 @@ if(NOT EMSCRIPTEN) COMMAND resample-bounding-box-test ) endif() + +# Interpolator coverage: one self-contained test per interpolator, using +# cthead1.png as both the moving image and the reference geometry (identity +# transform), so every interpolator selection is exercised. Needs no new data. +# The linear case doubles as the pipeline smoke test. +add_test(NAME resample-to-reference-linear + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_linear.png + --interpolator linear + ) + +add_test(NAME resample-to-reference-nearest-neighbor + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_nearest_neighbor.png + --interpolator nearest_neighbor + ) + +add_test(NAME resample-to-reference-b-spline + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_b_spline.png + --interpolator b_spline + ) + +add_test(NAME resample-to-reference-windowed-sinc + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_windowed_sinc.png + --interpolator windowed_sinc + ) + +add_test(NAME resample-to-reference-gaussian + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_gaussian.png + --interpolator gaussian + ) + +# Label-image interpolator on the existing multi-label test image. +add_test(NAME resample-to-reference-label-image + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/2th_cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/2th_cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/2th_cthead1_resampled_label_image.png + --interpolator label_image + ) + +# Background value: exercise the --default-value flag on the filesystem/CLI path (the memory-IO +# pixel-value assertions live in the Node and Python suites). Identity resample onto the same grid. +add_test(NAME resample-to-reference-default-value + COMMAND resample-to-reference + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_SOURCE_DIR}/test/data/input/cthead1.png + ${CMAKE_CURRENT_BINARY_DIR}/cthead1_resampled_default_value.png + --interpolator linear + --default-value 128 + ) diff --git a/packages/downsample/downsample.cxx b/packages/downsample/downsample.cxx index 51131490b..1d4ee13c6 100644 --- a/packages/downsample/downsample.cxx +++ b/packages/downsample/downsample.cxx @@ -29,6 +29,39 @@ #include "downsampleSigma.h" +// Groups the CLI options shared by the scalar and vector downsample paths so both declare exactly one +// option surface -- identical names, order, type_names, and help text. The option-target members must +// outlive ITK_WASM_PARSE (CLI11 binds them by reference), so the caller owns this struct on its own stack +// and passes it to addDownsampleOptions() before parsing. +template +struct DownsampleOptions +{ + std::vector shrinkFactors{ 2, 2 }; + std::vector cropRadius; + itk::wasm::OutputImage downsampledImage; +}; + +// Declares the shared downsample option surface into `pipeline`, binding each option to the corresponding +// member of `options`. The `input` option is declared separately by each functor (the scalar path adds it +// before pre-parse dispatch), so it is not part of this shared surface. +template +void +addDownsampleOptions(itk::wasm::Pipeline & pipeline, DownsampleOptions & options) +{ + constexpr unsigned int ImageDimension = TImage::ImageDimension; + + pipeline.add_option("-s,--shrink-factors", options.shrinkFactors, "Shrink factors") + ->required() + ->type_size(ImageDimension); + + pipeline.add_option("-r,--crop-radius", options.cropRadius, "Optional crop radius in pixel units.") + ->type_size(ImageDimension); + + pipeline.add_option("downsampled", options.downsampledImage, "Output downsampled image") + ->required() + ->type_name("OUTPUT_IMAGE"); +} + // Scalar image processing template int @@ -39,21 +72,15 @@ DownsampleScalarImage(itk::wasm::Pipeline & pipeline, const TImage * inputImage) pipeline.get_option("input")->required()->type_name("INPUT_IMAGE"); - std::vector shrinkFactors{ 2, 2 }; - pipeline.add_option("-s,--shrink-factors", shrinkFactors, "Shrink factors")->required()->type_size(ImageDimension); - - std::vector cropRadius; - pipeline.add_option("-r,--crop-radius", cropRadius, "Optional crop radius in pixel units.") - ->type_size(ImageDimension); - - using OutputImageType = itk::wasm::OutputImage; - OutputImageType downsampledImage; - pipeline.add_option("downsampled", downsampledImage, "Output downsampled image") - ->required() - ->type_name("OUTPUT_IMAGE"); + DownsampleOptions options; + addDownsampleOptions(pipeline, options); ITK_WASM_PARSE(pipeline); + const std::vector & shrinkFactors = options.shrinkFactors; + const std::vector & cropRadius = options.cropRadius; + auto & downsampledImage = options.downsampledImage; + auto sigmaValues = downsampleSigma(shrinkFactors); using GaussianFilterType = itk::DiscreteGaussianImageFilter; @@ -142,20 +169,15 @@ class PipelineFunctor> InputImageType inputImage; pipeline.add_option("input", inputImage, "Input image")->required()->type_name("INPUT_IMAGE"); - std::vector shrinkFactors{ 2, 2 }; - pipeline.add_option("-s,--shrink-factors", shrinkFactors, "Shrink factors")->required()->type_size(Dimension); - - std::vector cropRadius; - pipeline.add_option("-r,--crop-radius", cropRadius, "Optional crop radius in pixel units.")->type_size(Dimension); - - using OutputImageType = itk::wasm::OutputImage; - OutputImageType downsampledImage; - pipeline.add_option("downsampled", downsampledImage, "Output downsampled image") - ->required() - ->type_name("OUTPUT_IMAGE"); + DownsampleOptions options; + addDownsampleOptions(pipeline, options); ITK_WASM_PARSE(pipeline); + const std::vector & shrinkFactors = options.shrinkFactors; + const std::vector & cropRadius = options.cropRadius; + auto & downsampledImage = options.downsampledImage; + // Get number of components const unsigned int numberOfComponents = inputImage.Get()->GetNumberOfComponentsPerPixel(); diff --git a/packages/downsample/package.json b/packages/downsample/package.json index 3732998a2..2042bb786 100644 --- a/packages/downsample/package.json +++ b/packages/downsample/package.json @@ -7,9 +7,9 @@ "itk-wasm": { "emscripten-docker-image": "docker.io/itkwasm/emscripten:latest", "wasi-docker-image": "docker.io/itkwasm/wasi:latest", - "test-data-hash": "bafkreigtrr3oeqaunbyhrpuvvhc5hfmpbddc4u52jvonsvr2m2xe5ni3jq", + "test-data-hash": "bafkreiesjpg3sjqkyjb77djrffdvznjjsgvudd2y44iqjrfgnd45uyyprq", "test-data-urls": [ - "https://itk.mypinata.cloud/ipfs/bafkreigtrr3oeqaunbyhrpuvvhc5hfmpbddc4u52jvonsvr2m2xe5ni3jq" + "https://itk.mypinata.cloud/ipfs/bafkreiesjpg3sjqkyjb77djrffdvznjjsgvudd2y44iqjrfgnd45uyyprq" ], "typescript-package-name": "@itk-wasm/downsample", "python-package-name": "itkwasm-downsample", @@ -32,7 +32,7 @@ "build:gen:typescript": "itk-wasm pnpm-script build:gen:typescript", "build:gen:python": "pnpm build:wasi && pnpm bindgen:python", "test": "pnpm test:data:download && pnpm build:gen:python && pnpm test:python", - "test:data:download": "dam download test/data test/data.tar.gz bafkreigtrr3oeqaunbyhrpuvvhc5hfmpbddc4u52jvonsvr2m2xe5ni3jq https://itk.mypinata.cloud/ipfs/bafkreigtrr3oeqaunbyhrpuvvhc5hfmpbddc4u52jvonsvr2m2xe5ni3jq", + "test:data:download": "dam download test/data test/data.tar.gz bafkreiesjpg3sjqkyjb77djrffdvznjjsgvudd2y44iqjrfgnd45uyyprq https://itk.mypinata.cloud/ipfs/bafkreiesjpg3sjqkyjb77djrffdvznjjsgvudd2y44iqjrfgnd45uyyprq", "test:data:pack": "dam pack test/data test/data.tar.gz", "test:python:wasi": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-wasi", "test:python:emscripten": "pnpm test:data:download && pixi run --manifest-path=./pixi.toml test-emscripten", diff --git a/packages/downsample/pixi.lock b/packages/downsample/pixi.lock index bd1f74488..a5e068585 100644 --- a/packages/downsample/pixi.lock +++ b/packages/downsample/pixi.lock @@ -1,4 +1,26 @@ -version: 6 +version: 7 +platforms: +- name: linux-64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=x86_64 +- name: linux-aarch64 + virtual-packages: + - __unix=0=0 + - __linux=4.18 + - __glibc=2.28 + - __archspec=0=aarch64 +- name: osx-arm64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=m1 +- name: win-64 + virtual-packages: + - __win=10.0 + - __archspec=0=x86_64 environments: default: channels: @@ -7,40 +29,14 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - 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.8.30-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 @@ -57,64 +53,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.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_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/linux-64/pnpm-9.12.2-h6417eb3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.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.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.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/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 @@ -125,7 +87,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda @@ -133,8 +94,43 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.3-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 @@ -151,33 +147,64 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.9.0-h8374285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.7-h5d932e8_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.3.3-py312h8025657_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.7-h5d932e8_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.3.3-py312h8025657_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda @@ -185,22 +212,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda @@ -215,46 +234,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/osx-arm64/pnpm-9.12.2-hef028c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda @@ -262,11 +264,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda @@ -274,10 +296,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_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/distlib-0.3.9-pyhd8ed1ab_0.conda @@ -300,57 +319,60 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-jq-1.6-h301d43c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/win-64/pnpm-9.12.2-haa868a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py312h2e8e312_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-jq-1.6-h301d43c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py312h2e8e312_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312h7606c53_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda python: @@ -362,43 +384,15 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - 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.8.30-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_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/linux-64/cryptography-43.0.3-py312hda17c39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-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/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 @@ -423,109 +417,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.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_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/linux-64/pnpm-9.12.2-h6417eb3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.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.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.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/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/14/577a2a26c81ab6e2db821d7a5da3c6ff8dbf27ab3d8ebe74a3d4f203ab38/itk-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f3/8a/6388ca285140894109b17f8ae912ce7d13f69c8216af0b5c0e45adca6676/itk_core-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/bb/23/06d0a850a7e525ede537e3e37fd8efd7f5858e261d6170d6f0697cb663dd/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/11/61/cfd1cc04d2cd6c603c0abcd1f4bc0d65bff6ee9b84ebcbd828277b807887/itk_io-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/f4/94/424a2efabc1ae2c6f46cb250d21bf82cb791e113486d614b77b75788e8f5/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/8a/0b/46eaffa04ac7a15d2bea1f40e179df6152c00bf709f8d08b81c5514a9e12/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/dc/58/ec1bf790ed9657fd8a651189d40eedd765bf1cd75355ffa3f8f9bd67f4df/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1a/e5/94a596fba3dbecdea33059b455294fbfea91fcfc0d6cfd92372e10a6da93/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/a6/3c/ac3bad4ff24fe2b07064be5e44db8f4ed32a4e3708dff084e3b58c5b608c/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/b4/e3c7e6fab0f77fff6194afa173d1f2342073d91b1d3b4b30b17c3fb4407a/numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f9/0c/8cde1a86a9a7449a0ba95197f42156198083be1749b717831fba16ab2b5f/playwright-1.48.0-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/de/7b8898c9e7f73a2f4c20b621279143cfc27836dba0db676e9a923cd0a461/wasmtime-38.0.0-py3-none-manylinux1_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - - pypi: ./python/itkwasm-downsample - - pypi: ./python/itkwasm-downsample-wasi - linux-aarch64: - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_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/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda @@ -535,7 +457,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda @@ -544,8 +465,83 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - pypi: ./python/itkwasm-downsample + - pypi: ./python/itkwasm-downsample-wasi + - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/11/61/cfd1cc04d2cd6c603c0abcd1f4bc0d65bff6ee9b84ebcbd828277b807887/itk_io-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/12/80/53ebf3fb5a6f1139da37fe365ac0a24e7d6588dc6729943626da8a506505/itkwasm_transform_io_wasi-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/e5/94a596fba3dbecdea33059b455294fbfea91fcfc0d6cfd92372e10a6da93/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.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/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/46/f5b38109ab08d0adf7dd63ebc130a1d25b3f001f2eb9464091825fab8271/itkwasm_transform_io-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/de/7b8898c9e7f73a2f4c20b621279143cfc27836dba0db676e9a923cd0a461/wasmtime-38.0.0-py3-none-manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/14/577a2a26c81ab6e2db821d7a5da3c6ff8dbf27ab3d8ebe74a3d4f203ab38/itk-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8a/0b/46eaffa04ac7a15d2bea1f40e179df6152c00bf709f8d08b81c5514a9e12/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/b4/e3c7e6fab0f77fff6194afa173d1f2342073d91b1d3b4b30b17c3fb4407a/numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/a6/3c/ac3bad4ff24fe2b07064be5e44db8f4ed32a4e3708dff084e3b58c5b608c/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/23/06d0a850a7e525ede537e3e37fd8efd7f5858e261d6170d6f0697cb663dd/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/58/ec1bf790ed9657fd8a651189d40eedd765bf1cd75355ffa3f8f9bd67f4df/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f3/8a/6388ca285140894109b17f8ae912ce7d13f69c8216af0b5c0e45adca6676/itk_core-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f4/94/424a2efabc1ae2c6f46cb250d21bf82cb791e113486d614b77b75788e8f5/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f9/0c/8cde1a86a9a7449a0ba95197f42156198083be1749b717831fba16ab2b5f/playwright-1.48.0-py3-none-manylinux1_x86_64.whl + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 @@ -570,105 +566,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.9.0-h8374285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.0.0-py312h5ab5af3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.7-h5d932e8_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.3.3-py312h8025657_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8a/a0/732ddb5575a5be47d1088def8b1db91c799263a8d583181341271a4f6e6d/itk-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/6e/5c/eeaa8d362f97ecbb832d6e88cab4d3c13afd602a01befb4d38712afacf4f/itk_core-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/8d/f0/0fb8ad41cddcd0580689450d304757211a19f8e3426ae42d30577d10ac19/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d6/79/acd142f3052c408eb41f5e6934b954decb49b6129370262647cfda343208/itk_io-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d8/0f/15f4f1953ad4358fb9fc191a3432f3c521d209faf671ef13b386692c7ff8/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/2d/7f/b28465e289ce6217b3e1fbebb9956e73e334a5c5f76a6426ba6843310943/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/e7/f0/a21ddf56263ad6c5f87164032aaeb2235ee2de688cb8a8eeec01a5f01bd7/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/79/b9/ba9598bb8b7ee3962980d481065a58f75569c5a2df1d01520083288894b0/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/f2/f5/cd8ed297bd1b9f816d7492bfa857c53bd8fd68aefc2aa9bef7a0d5a61d85/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c4/a7/af3329fda3c3ec31d9b650e42bbcd3422fc62a765cbb1405fde4177a0996/numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/31/dc/121be574222fc74d12ac42921728fb6ba8ac17264a1fdab1993263389082/playwright-1.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/7b/8e6f9670ea1476735517b28b99b2595e9000d46ee0a276d0e0b547cc928c/wasmtime-38.0.0-py3-none-manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - - pypi: ./python/itkwasm-downsample - - pypi: ./python/itkwasm-downsample-wasi - osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_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/distlib-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda @@ -678,7 +606,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda @@ -686,51 +613,118 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - pypi: ./python/itkwasm-downsample + - pypi: ./python/itkwasm-downsample-wasi + - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/80/53ebf3fb5a6f1139da37fe365ac0a24e7d6588dc6729943626da8a506505/itkwasm_transform_io_wasi-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.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/2d/7f/b28465e289ce6217b3e1fbebb9956e73e334a5c5f76a6426ba6843310943/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/31/dc/121be574222fc74d12ac42921728fb6ba8ac17264a1fdab1993263389082/playwright-1.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/46/f5b38109ab08d0adf7dd63ebc130a1d25b3f001f2eb9464091825fab8271/itkwasm_transform_io-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6e/5c/eeaa8d362f97ecbb832d6e88cab4d3c13afd602a01befb4d38712afacf4f/itk_core-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/b9/ba9598bb8b7ee3962980d481065a58f75569c5a2df1d01520083288894b0/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8a/a0/732ddb5575a5be47d1088def8b1db91c799263a8d583181341271a4f6e6d/itk-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8d/f0/0fb8ad41cddcd0580689450d304757211a19f8e3426ae42d30577d10ac19/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/a7/af3329fda3c3ec31d9b650e42bbcd3422fc62a765cbb1405fde4177a0996/numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d6/79/acd142f3052c408eb41f5e6934b954decb49b6129370262647cfda343208/itk_io-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/d8/0f/15f4f1953ad4358fb9fc191a3432f3c521d209faf671ef13b386692c7ff8/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/e7/f0/a21ddf56263ad6c5f87164032aaeb2235ee2de688cb8a8eeec01a5f01bd7/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/f2/f5/cd8ed297bd1b9f816d7492bfa857c53bd8fd68aefc2aa9bef7a0d5a61d85/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_aarch64.whl + - pypi: https://files.pythonhosted.org/packages/fc/7b/8e6f9670ea1476735517b28b99b2595e9000d46ee0a276d0e0b547cc928c/wasmtime-38.0.0-py3-none-manylinux2014_aarch64.whl + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_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/distlib-0.3.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-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/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/osx-arm64/pnpm-9.12.2-hef028c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda @@ -738,67 +732,97 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: ./python/itkwasm-downsample + - pypi: ./python/itkwasm-downsample-wasi + - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0b/dc/c0c76414440ea1520b496801b9ee82f7cfbe5c4c1643e1e82c383897b3ae/itk-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/60/be/5e7d2f70bb03a8ef78ca076c22d0e3c633b330be1ca310a6dcebfefaaea3/itk_core-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/cb/49/098970cb18aa7f84c6d41ece00c8dd2072d3a890973ae4e2a069fe9d8cc2/itk_filtering-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/51/61/45c8709b872d28bb37c0cdbf9f1cd87772f0a0198564d7af39f0d98438f6/itk_io-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/4a/a2/ef05890cd456cdb8d6d2e539f2f4c38392fa44155a1e35cedd05e4221b49/itk_meshtopolydata-0.11.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/3b/b8/5f1269e17191228c7702cd81fc6e83f1814ab49a235fcba62230bac81cb4/itk_numerics-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/88/99/3db052a349efaf1ddbb51252e7e4c7a6a10ed5b3b87e2076afb622b711fd/itk_registration-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/3a/92/7d32413898fe4068f0b2da97ab783057e6af84123aa6c54af3706476fed9/itk_segmentation-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/77/66/73fa21a0439eacae5156c73611b35eec2c9c3d83ae4f987754043fce1d67/itk_webassemblyinterface-1.0b175-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/12/80/53ebf3fb5a6f1139da37fe365ac0a24e7d6588dc6729943626da8a506505/itkwasm_transform_io_wasi-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.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/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b0/29/cb48a402ea879e645b16218718f3f7d9588a77d674a9dcf22e4c43487636/numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/46/f5b38109ab08d0adf7dd63ebc130a1d25b3f001f2eb9464091825fab8271/itkwasm_transform_io-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/92/7d32413898fe4068f0b2da97ab783057e6af84123aa6c54af3706476fed9/itk_segmentation-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/3b/b8/5f1269e17191228c7702cd81fc6e83f1814ab49a235fcba62230bac81cb4/itk_numerics-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4a/a2/ef05890cd456cdb8d6d2e539f2f4c38392fa44155a1e35cedd05e4221b49/itk_meshtopolydata-0.11.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/51/61/45c8709b872d28bb37c0cdbf9f1cd87772f0a0198564d7af39f0d98438f6/itk_io-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/54/83/83d598af08eb297f1a644e678ce2d6c335f015c9f3c8c2532e289801293b/wasmtime-38.0.0-py3-none-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/be/5e7d2f70bb03a8ef78ca076c22d0e3c633b330be1ca310a6dcebfefaaea3/itk_core-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/64/41/d77c47743800fbeb86657611e651e56a17cbb4ebfefa1da0318dc39092df/playwright-1.48.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/66/73fa21a0439eacae5156c73611b35eec2c9c3d83ae4f987754043fce1d67/itk_webassemblyinterface-1.0b175-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl + - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/88/99/3db052a349efaf1ddbb51252e7e4c7a6a10ed5b3b87e2076afb622b711fd/itk_registration-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b0/29/cb48a402ea879e645b16218718f3f7d9588a77d674a9dcf22e4c43487636/numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/49/098970cb18aa7f84c6d41ece00c8dd2072d3a890973ae4e2a069fe9d8cc2/itk_filtering-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/54/83/83d598af08eb297f1a644e678ce2d6c335f015c9f3c8c2532e289801293b/wasmtime-38.0.0-py3-none-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - - pypi: ./python/itkwasm-downsample - - pypi: ./python/itkwasm-downsample-wasi win-64: - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_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/distlib-0.3.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda @@ -816,6 +840,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda @@ -835,90 +890,65 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-jq-1.6-h301d43c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.4.0-py312h381445a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-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/win-64/pnpm-9.12.2-haa868a1_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py312h2e8e312_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312h7606c53_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda - - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e6/05/b876851fc885a3e3cb85f4167bcbc35020da23b98d50da3947041fc82224/itk-5.4.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/fd/35/1fbc801f430858f1054c6b64e5d8316b9a319c2eaca2b6723c98ee7a0358/itk_core-5.4.0-cp311-abi3-win_amd64.whl + - pypi: ./python/itkwasm-downsample + - pypi: ./python/itkwasm-downsample-wasi + - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/80/53ebf3fb5a6f1139da37fe365ac0a24e7d6588dc6729943626da8a506505/itkwasm_transform_io_wasi-1.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/16/33/4d3617f48f853878750dc249d84bbfe4509469e82df58908a8612d469b2c/itk_filtering-5.4.0-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1d/5d/e542c16e7647a544fd51ced24c6ca8d8c154a4f62d42bcd6bfa65b5c1a12/itk_io-5.4.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/e6/55/01ab1b8f98e35f90fac200ed3aad19714c6d9058a43c68bbe3186cbfdc70/itk_meshtopolydata-0.11.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/2b/3e/d1dfc24f22415a35c743fdd8dc8b8315454f4bcee6ecbb740aa9d440baa0/itk_numerics-5.4.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/89/f6/686c2d2650065495720889c2e6ebcf6af2e5c2692fc6d8768793b08c641a/itk_registration-5.4.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/77/8d/916c078544ac29a5ac215d2e5a2b07c9314b515b63136be92d6856a41f55/itk_segmentation-5.4.0-cp311-abi3-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6c/cf/af6554bd0fd831ba2f8ed7840904a1b0828b1ea348b5000b78ad34c5688f/itk_webassemblyinterface-1.0b175-cp311-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2b/3e/d1dfc24f22415a35c743fdd8dc8b8315454f4bcee6ecbb740aa9d440baa0/itk_numerics-5.4.0-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/46/f5b38109ab08d0adf7dd63ebc130a1d25b3f001f2eb9464091825fab8271/itkwasm_transform_io-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/45/88/b6459c93a8bc0b96e7a33b6744bbef2740a0b78b0534542a037d220427f0/playwright-1.48.0-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/4c/79/73735a6a5dad6059c085f240a4e74c9270feccd2bc66e4d31b5ca01d329c/numpy-2.1.2-cp312-cp312-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/45/88/b6459c93a8bc0b96e7a33b6744bbef2740a0b78b0534542a037d220427f0/playwright-1.48.0-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/66/99/6da689c6534b16b2e6959321533f0000228854e5f4211eb00bfa7b6bcebc/wasmtime-38.0.0-py3-none-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6c/cf/af6554bd0fd831ba2f8ed7840904a1b0828b1ea348b5000b78ad34c5688f/itk_webassemblyinterface-1.0b175-cp311-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/8d/916c078544ac29a5ac215d2e5a2b07c9314b515b63136be92d6856a41f55/itk_segmentation-5.4.0-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/89/f6/686c2d2650065495720889c2e6ebcf6af2e5c2692fc6d8768793b08c641a/itk_registration-5.4.0-cp311-abi3-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/66/99/6da689c6534b16b2e6959321533f0000228854e5f4211eb00bfa7b6bcebc/wasmtime-38.0.0-py3-none-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - - pypi: ./python/itkwasm-downsample - - pypi: ./python/itkwasm-downsample-wasi + - pypi: https://files.pythonhosted.org/packages/e6/05/b876851fc885a3e3cb85f4167bcbc35020da23b98d50da3947041fc82224/itk-5.4.0-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/e6/55/01ab1b8f98e35f90fac200ed3aad19714c6d9058a43c68bbe3186cbfdc70/itk_meshtopolydata-0.11.0-cp311-abi3-win_amd64.whl + - pypi: https://files.pythonhosted.org/packages/fd/35/1fbc801f430858f1054c6b64e5d8316b9a319c2eaca2b6723c98ee7a0358/itk_core-5.4.0-cp311-abi3-win_amd64.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 @@ -941,106 +971,6 @@ packages: purls: [] size: 23621 timestamp: 1650670423406 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 - build_number: 16 - sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 - md5: 6168d71addc746e8f2b8d57dfd2edcea - depends: - - libgomp >=7.5.0 - constrains: - - openmp_impl 9999 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 23712 - timestamp: 1650670790230 -- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda - sha256: 4b54b7ce79d818e3cce54ae4d552dba51b7afac160ceecdefd04b3917a37c502 - md5: 688697ec5e9588bdded167d19577625b - depends: - - exceptiongroup >=1.0.2 - - idna >=2.8 - - python >=3.9 - - sniffio >=1.1 - - typing_extensions >=4.1 - constrains: - - uvloop >=0.21.0b1 - - trio >=0.26.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/anyio?source=compressed-mapping - size: 109864 - timestamp: 1728935803440 -- pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl - name: attrs - version: 24.2.0 - sha256: 81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 - requires_dist: - - importlib-metadata ; python_full_version < '3.8' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' - - hypothesis ; extra == 'benchmark' - - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'benchmark' - - pympler ; extra == 'benchmark' - - pytest-codspeed ; extra == 'benchmark' - - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'benchmark' - - pytest-xdist[psutil] ; extra == 'benchmark' - - pytest>=4.3.0 ; extra == 'benchmark' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' - - coverage[toml]>=5.3 ; extra == 'cov' - - hypothesis ; extra == 'cov' - - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'cov' - - pympler ; extra == 'cov' - - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'cov' - - pytest-xdist[psutil] ; extra == 'cov' - - pytest>=4.3.0 ; extra == 'cov' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' - - hypothesis ; extra == 'dev' - - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'dev' - - pre-commit ; extra == 'dev' - - pympler ; extra == 'dev' - - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'dev' - - pytest-xdist[psutil] ; extra == 'dev' - - pytest>=4.3.0 ; extra == 'dev' - - cogapp ; extra == 'docs' - - furo ; extra == 'docs' - - myst-parser ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinx-notfound-page ; extra == 'docs' - - sphinxcontrib-towncrier ; extra == 'docs' - - towncrier<24.7 ; extra == 'docs' - - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' - - hypothesis ; extra == 'tests' - - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests' - - pympler ; extra == 'tests' - - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests' - - pytest-xdist[psutil] ; extra == 'tests' - - pytest>=4.3.0 ; extra == 'tests' - - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' - - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda - sha256: 31b51537ce7d2ba8b5b3d0095f1813711884304ac1701bc55938ca75f6c82e19 - md5: 67bdebbc334513034826e9b63f769d4c - depends: - - python >=3 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6989 - timestamp: 1722295637981 -- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda - sha256: 7ba30f32daad2e7ca251508525185ba170eedc14123572611c2acf261c7956b3 - md5: c747b1d79f136013c3b7ebcba876afa6 - depends: - - backports - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/backports-tarfile?source=hash-mapping - size: 31951 - timestamp: 1712700751335 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d md5: 62ee74e96c5ebb0af99386de58cf9553 @@ -1052,38 +982,6 @@ packages: purls: [] size: 252783 timestamp: 1720974456583 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda - sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb - md5: 56398c28220513b9ea13d7b450acfb20 - depends: - - libgcc-ng >=12 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 189884 - timestamp: 1720974504976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda - sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 - md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 122909 - timestamp: 1720974522888 -- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda - sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b - md5: 276e7ffe9ffe39688abc665ef0f45596 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: bzip2-1.0.6 - license_family: BSD - purls: [] - size: 54927 - timestamp: 1720974860185 - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea md5: c27d1c142233b5bc9ca570c6e2e0c244 @@ -1091,37 +989,6 @@ packages: purls: [] size: 159003 timestamp: 1725018903918 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda - sha256: 2a2d827bee3775a85f0f1b2f2089291475c4416336d1b3a8cbce2964db547af8 - md5: 70e57e8f59d2c98f86b49c69e5074be5 - license: ISC - purls: [] - size: 159106 - timestamp: 1725020043153 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda - sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 - md5: 40dec13fd8348dbe303e57be74bd3d35 - license: ISC - purls: [] - size: 158482 - timestamp: 1725019034582 -- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda - sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 - md5: 4c4fd67c18619be5aa65dc5b6c72e490 - license: ISC - purls: [] - size: 158773 - timestamp: 1725019107649 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda - sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f - md5: 12f7d00853807b0531775e9be891cb11 - depends: - - python >=3.7 - license: ISC - purls: - - pkg:pypi/certifi?source=hash-mapping - size: 163752 - timestamp: 1725278204397 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.17.1-py312h06ac9bb_0.conda sha256: cba6ea83c4b0b4f5b5dc59cb19830519b28f95d7ebef7c9c5cf1c14843621457 md5: a861504bbea4161a9170b85d4d2be840 @@ -1138,128 +1005,27 @@ packages: - pkg:pypi/cffi?source=hash-mapping size: 294403 timestamp: 1725560714366 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda - sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 - md5: 1a256e5581b1099e9295cb84d53db3ea +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-43.0.3-py312hda17c39_0.conda + sha256: ba9e5aced2e7dc0bbc48f60bf38f514839424a01975fb2aed30e9246c2f82c7c + md5: 2abada8c216dd6e32514535a3fa245d4 depends: - - libffi >=3.4,<4.0a0 + - __glibc >=2.17,<3.0.a0 + - cffi >=1.12 - libgcc >=13 - - pycparser + - openssl >=3.3.2,<4.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD purls: - - pkg:pypi/cffi?source=hash-mapping - size: 312892 - timestamp: 1725561779888 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda - sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f - md5: 19a5456f72f505881ba493979777b24e - depends: - - __osx >=11.0 - - libffi >=3.4,<4.0a0 - - pycparser - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 281206 - timestamp: 1725560813378 -- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda - sha256: ac007bf5fd56d13e16d95eea036433012f2e079dc015505c8a79efebbad1fcbc - md5: 08310c1a22ef957d537e547f8d484f92 - depends: - - pycparser - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - purls: - - pkg:pypi/cffi?source=hash-mapping - size: 288142 - timestamp: 1725560896359 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda - sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec - md5: f3ad426304898027fc619827ff428eca - depends: - - __unix - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 84437 - timestamp: 1692311973840 -- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda - sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 - md5: 3549ecbceb6cd77b91a105511b7d0786 - depends: - - __win - - colorama - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/click?source=hash-mapping - size: 85051 - timestamp: 1692312207348 -- 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/linux-64/cryptography-43.0.3-py312hda17c39_0.conda - sha256: ba9e5aced2e7dc0bbc48f60bf38f514839424a01975fb2aed30e9246c2f82c7c - md5: 2abada8c216dd6e32514535a3fa245d4 - depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.12 - - libgcc >=13 - - openssl >=3.3.2,<4.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=hash-mapping - size: 1488388 - timestamp: 1729286882127 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda - sha256: bd9cc8410bf31ac8b90d63dda92d5810af16c3841ca6dd09be9b7f9c5c7688ba - md5: bfacbf2e4560c7d6416d40f573961918 - depends: - - cffi >=1.12 - - libgcc >=13 - - openssl >=3.3.2,<4.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - constrains: - - __glibc >=2.17 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - purls: - - pkg:pypi/cryptography?source=hash-mapping - size: 1480456 - timestamp: 1729287055014 -- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 - sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 - md5: ecfff944ba3960ecb334b9a2663d708d + - pkg:pypi/cryptography?source=hash-mapping + size: 1488388 + timestamp: 1729286882127 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + sha256: 8f5f995699a2d9dbdd62c61385bfeeb57c82a681a7c8c5313c395aa0ccab68a5 + md5: ecfff944ba3960ecb334b9a2663d708d depends: - expat >=2.4.2,<3.0a0 - libgcc-ng >=9.4.0 @@ -1269,50 +1035,6 @@ packages: purls: [] size: 618596 timestamp: 1640112124844 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 - sha256: 5fe76bdf27a142cfb9da0fb3197c562e528d2622b573765bee5c9904cf5e6b6b - md5: f3d63805602166bac09386741e00935e - depends: - - expat >=2.4.2,<3.0a0 - - libgcc-ng >=9.4.0 - - libglib >=2.70.2,<3.0a0 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 672759 - timestamp: 1640113663539 -- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.9-pyhd8ed1ab_0.conda - sha256: 300b2e714f59403df0560174f5ef6c19db8b4a3b74a7244862cf771f07dee8fb - md5: fe521c1608280cc2803ebd26dc252212 - depends: - - python 2.7|>=3.6 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/distlib?source=hash-mapping - size: 276214 - timestamp: 1728557312342 -- conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda - sha256: de160a7494e7bc72360eea6a29cbddf194d0a79f45ff417a4de20e6858cf79a9 - md5: 9873878e2a069bc358b69e9a29c1ecd5 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/editables?source=hash-mapping - size: 10988 - timestamp: 1705857085102 -- 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 - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.3-h5888daf_0.conda sha256: 65bd479c75ce876f26600cb230d6ebc474086e31fa384af9b4282b36842ed7e2 md5: 6595440079bed734b113de44ffd3cd0a @@ -1325,27 +1047,6 @@ packages: purls: [] size: 137891 timestamp: 1725568750673 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda - sha256: c827521e080d0f3395655924f1c364d48a1eac1ff3e193a12d0441e9c3b51e91 - md5: 901a44b341632b0c233756ed5abcd78b - depends: - - libexpat 2.6.3 h5ad3122_0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 130283 - timestamp: 1725568848182 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda - sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 - md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 - depends: - - python >=3.7 - license: Unlicense - purls: - - pkg:pypi/filelock?source=hash-mapping - size: 17357 - timestamp: 1726613593584 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6 md5: 9ae35c3d96db2c94ce0cef86efdfa2cb @@ -1357,746 +1058,698 @@ packages: purls: [] size: 634972 timestamp: 1694615932610 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda - sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 - md5: a5ab74c5bd158c3d5532b66d8d83d907 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 depends: + - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: GPL-2.0-only OR FTL + - libstdcxx-ng >=12 + license: MIT + license_family: MIT purls: [] - size: 642092 - timestamp: 1694617858496 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda - sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 - md5: e6085e516a3e304ce41a8ee08b9b89ad + size: 12129203 + timestamp: 1720853576813 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda + sha256: a04a1603e405ea9ae5c4a492a8e361086cb441a91ef7299bd4bf3eca0b485b6d + md5: 80814f94713e35df60aad6c4b235de87 depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: GPL-2.0-only OR FTL + - libgcc-ng >=12 + - oniguruma 6.9.* + - oniguruma >=6.9.9,<6.10.0a0 + license: MIT + license_family: MIT purls: [] - size: 596430 - timestamp: 1694616332835 -- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda - sha256: 2c53ee8879e05e149a9e525481d36adfd660a6abda26fd731376fa64ff03e728 - md5: 3761b23693f768dc75a8fd0a73ca053f + size: 318956 + timestamp: 1702500793203 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda + sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 + md5: 51bb7010fc86f70eee639b4bb7a894f5 depends: - - libpng >=1.6.39,<1.7.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: GPL-2.0-only OR FTL + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + license: MIT + license_family: MIT purls: [] - size: 510306 - timestamp: 1694616398888 -- pypi: https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl - name: greenlet - version: 3.1.1 - sha256: 7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01 - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: greenlet - version: 3.1.1 - sha256: f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79 - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl - name: greenlet - version: 3.1.1 - sha256: 4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - requires_python: '>=3.7' -- pypi: https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: greenlet - version: 3.1.1 - sha256: 1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9 - requires_dist: - - sphinx ; extra == 'docs' - - furo ; extra == 'docs' - - objgraph ; extra == 'test' - - psutil ; extra == 'test' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 - sha256: 817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085 - md5: b21ed0883505ba1910994f1df031a428 - depends: - - python >=3 - - typing_extensions - license: MIT - license_family: MIT - purls: - - pkg:pypi/h11?source=hash-mapping - size: 48251 - timestamp: 1664132995560 -- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 - sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a - md5: b748fbf7060927a6e82df7cb5ee8f097 - depends: - - hpack >=4.0,<5 - - hyperframe >=6.0,<7 - - python >=3.6.1 - license: MIT - license_family: MIT - purls: - - pkg:pypi/h2?source=hash-mapping - size: 46754 - timestamp: 1634280590080 -- conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda - sha256: 675b0304b129a4dbc39b8e6f337cea51adebef20508a656f43b6e6b43d9cf458 - md5: b8a6437f94d29aef00decdbe1174be27 - depends: - - click >=8.0.6 - - hatchling >=1.24.2 - - httpx >=0.22.0 - - hyperlink >=21.0.0 - - keyring >=23.5.0 - - packaging >=23.2 - - pexpect >=4.8,<5 - - platformdirs >=2.5.0 - - python >=3.8 - - rich >=11.2.0 - - shellingham >=1.4.0 - - tomli-w >=1.0 - - tomlkit >=0.11.1 - - userpath >=1.7,<2 - - uv >=0.1.35 - - virtualenv >=20.26.1 - - zstandard <1.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hatch?source=hash-mapping - size: 177173 - timestamp: 1728879212263 -- conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda - sha256: fb8a16a913f909d8f7d2ae95c18a1aeb7be3eebfb1b7a4246500c06d54498f89 - md5: 7571d6e5561b04aef679a11904dfcebf - depends: - - editables >=0.3 - - importlib-metadata - - packaging >=21.3 - - pathspec >=0.10.1 - - pluggy >=1.0.0 - - python >=3.7 - - tomli >=1.2.2 - - trove-classifiers - license: MIT - license_family: MIT - purls: - - pkg:pypi/hatchling?source=hash-mapping - size: 64580 - timestamp: 1719090878694 -- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 - sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 - md5: 914d6646c4dbb1fd3ff539830a12fd71 - depends: - - python - license: MIT - license_family: MIT - purls: - - pkg:pypi/hpack?source=hash-mapping - size: 25341 - timestamp: 1598856368685 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda - sha256: 8952c3f1eb18bf4d7e813176c3b23e0af4e863e8b05087e73f74f371d73077ca - md5: b8e1901ef9a215fc41ecfb6bef7e0943 - depends: - - anyio >=3.0,<5.0 - - certifi - - h11 >=0.13,<0.15 - - h2 >=3,<5 - - python >=3.8 - - sniffio 1.* - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/httpcore?source=hash-mapping - size: 45711 - timestamp: 1727821031365 -- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda - sha256: 1a33f160548bf447e15c0273899d27e4473f1d5b7ca1441232ec2d9d07c56d03 - md5: 7e9ac3faeebdbd7b53b462c41891e7f7 + size: 245247 + timestamp: 1701647787198 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda + sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe + md5: 048b02e3962f066da18efe3a21b77672 depends: - - anyio - - certifi - - httpcore 1.* - - idna - - python >=3.8 - - sniffio - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/httpx?source=hash-mapping - size: 65085 - timestamp: 1724778453275 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 - sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 - md5: 9f765cbfab6870c8435b9eefecd7a1f4 + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.43 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 669211 + timestamp: 1729655358674 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + md5: 76bbff344f0134279f225174e9064c8f depends: - - python >=3.6 - license: MIT - license_family: MIT - purls: - - pkg:pypi/hyperframe?source=hash-mapping - size: 14646 - timestamp: 1619110249723 -- conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 - sha256: 026cb82ada41be9ee2836a2ace526e85c4603e77617887c41c6e62c9bde798b3 - md5: 1303beb57b40f8f4ff6fb1bb23bf0553 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 281798 + timestamp: 1657977462600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda + sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 + md5: b422943d5d772b7cc858b36ad2a92db5 depends: - - idna >=2.6 - - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: MIT license_family: MIT - purls: - - pkg:pypi/hyperlink?source=hash-mapping - size: 72732 - timestamp: 1610092261086 -- pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl - name: hypothesis - version: 6.115.5 - sha256: b7733459ae9a93020fac3b91b41473c9b85e975139a152a70d88f3a5caa3fa3f - requires_dist: - - attrs>=22.2.0 - - sortedcontainers>=2.1.0,<3.0.0 - - exceptiongroup>=1.0.0 ; python_full_version < '3.11' - - black>=19.10b0 ; extra == 'all' - - click>=7.0 ; extra == 'all' - - crosshair-tool>=0.0.74 ; extra == 'all' - - django>=4.2 ; extra == 'all' - - dpcontracts>=0.4 ; extra == 'all' - - hypothesis-crosshair>=0.0.16 ; extra == 'all' - - lark>=0.10.1 ; extra == 'all' - - libcst>=0.3.16 ; extra == 'all' - - numpy>=1.19.3 ; extra == 'all' - - pandas>=1.1 ; extra == 'all' - - pytest>=4.6 ; extra == 'all' - - python-dateutil>=1.4 ; extra == 'all' - - pytz>=2014.1 ; extra == 'all' - - redis>=3.0.0 ; extra == 'all' - - rich>=9.0.0 ; extra == 'all' - - tzdata>=2024.2 ; (sys_platform == 'emscripten' and extra == 'all') or (sys_platform == 'win32' and extra == 'all') - - click>=7.0 ; extra == 'cli' - - black>=19.10b0 ; extra == 'cli' - - rich>=9.0.0 ; extra == 'cli' - - libcst>=0.3.16 ; extra == 'codemods' - - hypothesis-crosshair>=0.0.16 ; extra == 'crosshair' - - crosshair-tool>=0.0.74 ; extra == 'crosshair' - - python-dateutil>=1.4 ; extra == 'dateutil' - - django>=4.2 ; extra == 'django' - - dpcontracts>=0.4 ; extra == 'dpcontracts' - - black>=19.10b0 ; extra == 'ghostwriter' - - lark>=0.10.1 ; extra == 'lark' - - numpy>=1.19.3 ; extra == 'numpy' - - pandas>=1.1 ; extra == 'pandas' - - pytest>=4.6 ; extra == 'pytest' - - pytz>=2014.1 ; extra == 'pytz' - - redis>=3.0.0 ; extra == 'redis' - - tzdata>=2024.2 ; (sys_platform == 'emscripten' and extra == 'zoneinfo') or (sys_platform == 'win32' and extra == 'zoneinfo') - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda - sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e - md5: 8b189310083baabfb622af68fd9d3ae3 + purls: [] + size: 72242 + timestamp: 1728177071251 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda + sha256: 4bb47bb2cd09898737a5211e2992d63c555d63715a07ba56eae0aff31fb89c22 + md5: 59f4c43bb1b5ef1c71946ff2cbf59524 depends: - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - libgcc >=13 + constrains: + - expat 2.6.3.* license: MIT license_family: MIT purls: [] - size: 12129203 - timestamp: 1720853576813 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda - sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 - md5: 268203e8b983fddb6412b36f2024e75c + size: 73616 + timestamp: 1725568742634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 + - libgcc-ng >=9.4.0 license: MIT license_family: MIT purls: [] - size: 12282786 - timestamp: 1720853454991 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda - sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 - md5: 5eb22c1d7b3fc4abb50d92d621583137 + size: 58292 + timestamp: 1636488182923 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda + sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 + md5: 3cb76c3f10d3bc7f1105b2fc9db984df depends: - - __osx >=11.0 - license: MIT - license_family: MIT + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 14.2.0 h77fa898_1 + - libgcc-ng ==14.2.0=*_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL purls: [] - size: 11857802 - timestamp: 1720853997952 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda - sha256: 8c57fd68e6be5eecba4462e983aed7e85761a519aab80e834bbd7794d4b545b2 - md5: 7ba2ede0e7c795ff95088daf0dc59753 + size: 848745 + timestamp: 1729027721139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda + sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 + md5: e39480b9ca41323497b05492a63bc35b depends: - - python >=3.6 + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54142 + timestamp: 1729027726517 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda + sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 + md5: 13e8e54035ddd2b91875ba399f0f7c04 + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.44,<10.45.0a0 + constrains: + - glib 2.82.2 *_0 + license: LGPL-2.1-or-later + purls: [] + size: 3931898 + timestamp: 1729191404130 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda + sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 + md5: cc3573974587f12dda90d96e3e55a702 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 460992 + timestamp: 1729027639220 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 + md5: d66573916ffcf376178462f1b61c941e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + purls: [] + size: 705775 + timestamp: 1702682170569 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda + sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f + md5: ea25936bb4080d843790b586850f82b8 + depends: + - libgcc-ng >=12 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + purls: [] + size: 618575 + timestamp: 1694474974816 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda + sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 + md5: f4cc49d7aa68316213e4b12be35308d1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 290661 + timestamp: 1726234747153 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda + sha256: 76ffc7a5823b51735c11d535f3666b3c9c7d1519f9fbb6fa9cdff79db01960b9 + md5: 540296f0ce9d3352188c15a89b30b9ac + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 874704 + timestamp: 1729591931557 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda + sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 + md5: 234a5554c53625688d51062645337328 + depends: + - libgcc 14.2.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3893695 + timestamp: 1729027746910 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda + sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 + md5: 8371ac6457591af2cf6159439c1fd051 + depends: + - libstdcxx 14.2.0 hc0a3c3a_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54105 + timestamp: 1729027780628 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda + sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 + md5: 63872517c98aa305da58a757c443698e + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.22,<1.23.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 428156 + timestamp: 1728232228989 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/idna?source=hash-mapping - size: 49837 - timestamp: 1726459583613 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda - sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c - md5: 54198435fce4d64d8a89af22573012a8 + purls: [] + size: 33601 + timestamp: 1680112270483 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda + sha256: a35cd81cd1a9add11024097da83cc06b0aae83186fe4124b77710876f37d8f31 + md5: 070e3c9ddab77e38799d5c30b109c633 depends: - - python >=3.8 - - zipp >=0.5 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 28646 - timestamp: 1726082927916 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda - sha256: 2cb9db3e40033c3df72d3defc678a012840378fd55a67e4351363d4b321a0dc1 - md5: c808991d29b9838fb4d96ce8267ec9ec + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 884647 + timestamp: 1729322566955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda + sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f + md5: b26e8aa824079e1be0294e7152ca4559 depends: - - python >=3.8 - - zipp >=3.1.0 + - libgcc-ng >=12 constrains: - - importlib-resources >=6.4.5,<6.4.6.0a0 - license: Apache-2.0 - license_family: APACHE - purls: - - pkg:pypi/importlib-resources?source=hash-mapping - size: 32725 - timestamp: 1725921462405 -- conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 - md5: f800d2da156d08e289b14e87e43c1ae5 + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 438953 + timestamp: 1713199854503 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 depends: - - python >=3.7 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp license: MIT license_family: MIT - purls: - - pkg:pypi/iniconfig?source=hash-mapping - size: 11101 - timestamp: 1673103208955 -- pypi: https://files.pythonhosted.org/packages/0b/dc/c0c76414440ea1520b496801b9ee82f7cfbe5c4c1643e1e82c383897b3ae/itk-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk - version: 5.4.0 - sha256: a1b4e5511c2274025bffe80d081ef79ee41de580df80311007af1ec05e2774db - requires_dist: - - itk-core==5.4.0 - - itk-numerics==5.4.0 - - itk-io==5.4.0 - - itk-filtering==5.4.0 - - itk-registration==5.4.0 - - itk-segmentation==5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7e/14/577a2a26c81ab6e2db821d7a5da3c6ff8dbf27ab3d8ebe74a3d4f203ab38/itk-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk - version: 5.4.0 - sha256: 0f0dcce9df862831e705eebf0ffa95de554b17027f69d67b31b30dcb8d838019 - requires_dist: - - itk-core==5.4.0 - - itk-numerics==5.4.0 - - itk-io==5.4.0 - - itk-filtering==5.4.0 - - itk-registration==5.4.0 - - itk-segmentation==5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/8a/a0/732ddb5575a5be47d1088def8b1db91c799263a8d583181341271a4f6e6d/itk-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk - version: 5.4.0 - sha256: 88344f4c7e8a74dfdeb98e20232d1a9565eb7c381d8242534588ecc4e745ffb3 - requires_dist: - - itk-core==5.4.0 - - itk-numerics==5.4.0 - - itk-io==5.4.0 - - itk-filtering==5.4.0 - - itk-registration==5.4.0 - - itk-segmentation==5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e6/05/b876851fc885a3e3cb85f4167bcbc35020da23b98d50da3947041fc82224/itk-5.4.0-cp311-abi3-win_amd64.whl - name: itk - version: 5.4.0 - sha256: e5ffacab2c8609979c78c2d2e02ee7e6abd611261aac0613289d98e7c277cd83 - requires_dist: - - itk-core==5.4.0 - - itk-numerics==5.4.0 - - itk-io==5.4.0 - - itk-filtering==5.4.0 - - itk-registration==5.4.0 - - itk-segmentation==5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/60/be/5e7d2f70bb03a8ef78ca076c22d0e3c633b330be1ca310a6dcebfefaaea3/itk_core-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-core - version: 5.4.0 - sha256: 21c7b5c451f73c8073eb3b5dd85f7c654399cdc25dd51669bfbbafa611aa4649 - requires_dist: - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/6e/5c/eeaa8d362f97ecbb832d6e88cab4d3c13afd602a01befb4d38712afacf4f/itk_core-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-core - version: 5.4.0 - sha256: b6af0e82dae0efa95ad87f36ccd55a955383b34a6bd8a036894fb96a3933615a - requires_dist: - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f3/8a/6388ca285140894109b17f8ae912ce7d13f69c8216af0b5c0e45adca6676/itk_core-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-core - version: 5.4.0 - sha256: 8ca83de9c269e6b20648f2391aa2bf96903b8ed645c3d8cd40d90b939dda439e - requires_dist: - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/fd/35/1fbc801f430858f1054c6b64e5d8316b9a319c2eaca2b6723c98ee7a0358/itk_core-5.4.0-cp311-abi3-win_amd64.whl - name: itk-core - version: 5.4.0 - sha256: 6affe6986927fd176c176f5464d9ea9e737b85d8745f5c4129da910fd16235cb - requires_dist: - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/16/33/4d3617f48f853878750dc249d84bbfe4509469e82df58908a8612d469b2c/itk_filtering-5.4.0-cp311-abi3-win_amd64.whl - name: itk-filtering - version: 5.4.0 - sha256: ad59e6066dba25d6b0803023e95c7633a80e7b9c1a9ff89a41c97eae5a60e06f - requires_dist: - - itk-numerics==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/8d/f0/0fb8ad41cddcd0580689450d304757211a19f8e3426ae42d30577d10ac19/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-filtering - version: 5.4.0 - sha256: 6e8600df87c59233968013d162c5a353ca4c8f843c76117b52347aec20ff1620 - requires_dist: - - itk-numerics==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/bb/23/06d0a850a7e525ede537e3e37fd8efd7f5858e261d6170d6f0697cb663dd/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-filtering - version: 5.4.0 - sha256: 86026c853f1fd0b13e282f952cff7455df0ac131cc608df8669ce335633eef0a - requires_dist: - - itk-numerics==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/cb/49/098970cb18aa7f84c6d41ece00c8dd2072d3a890973ae4e2a069fe9d8cc2/itk_filtering-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-filtering - version: 5.4.0 - sha256: e8d90842d703877c4ce777efece3db478c8ed5e3a18488e277a480f05d61ebb0 - requires_dist: - - itk-numerics==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/11/61/cfd1cc04d2cd6c603c0abcd1f4bc0d65bff6ee9b84ebcbd828277b807887/itk_io-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-io - version: 5.4.0 - sha256: 393d711f9edb248aed402e7fc9613045536dbd6b45fc8db638a28d0a409fe974 - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1d/5d/e542c16e7647a544fd51ced24c6ca8d8c154a4f62d42bcd6bfa65b5c1a12/itk_io-5.4.0-cp311-abi3-win_amd64.whl - name: itk-io - version: 5.4.0 - sha256: 8c0eacb3aa100e4b369a673bb0e65c3c48c411bc4b716069bce4cee8c3f9e1cc - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/51/61/45c8709b872d28bb37c0cdbf9f1cd87772f0a0198564d7af39f0d98438f6/itk_io-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-io - version: 5.4.0 - sha256: d969a2ab2775b2ace36edee274ffe4839b21c7ccd634844082028f9f373dfedb - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d6/79/acd142f3052c408eb41f5e6934b954decb49b6129370262647cfda343208/itk_io-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-io - version: 5.4.0 - sha256: 11a34ac45b960aa883e1758ead15c5394814964573c93d736fc04f021c18cd22 - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/4a/a2/ef05890cd456cdb8d6d2e539f2f4c38392fa44155a1e35cedd05e4221b49/itk_meshtopolydata-0.11.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-meshtopolydata - version: 0.11.0 - sha256: 3c10f157bddbdf86b596ec2742f17bcc35cd6ce7bd64bba712a2a0c0858c2dc7 - requires_dist: - - itk-core~=5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/d8/0f/15f4f1953ad4358fb9fc191a3432f3c521d209faf671ef13b386692c7ff8/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-meshtopolydata - version: 0.11.0 - sha256: 914cae65049842affc820471e149b2cdd55d305ff1a740c34a47e1b1af567361 - requires_dist: - - itk-core~=5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e6/55/01ab1b8f98e35f90fac200ed3aad19714c6d9058a43c68bbe3186cbfdc70/itk_meshtopolydata-0.11.0-cp311-abi3-win_amd64.whl - name: itk-meshtopolydata - version: 0.11.0 - sha256: b8b746f6d5597687d0b50dd81d650da0293f2c3c90f31212baefdf46edb727d6 - requires_dist: - - itk-core~=5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f4/94/424a2efabc1ae2c6f46cb250d21bf82cb791e113486d614b77b75788e8f5/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-meshtopolydata - version: 0.11.0 - sha256: 84bd859eeb17aed3de39f0b3357525a4bfac0db17263a8d36cd641e5f8c49b46 - requires_dist: - - itk-core~=5.4.0 - - numpy - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/2b/3e/d1dfc24f22415a35c743fdd8dc8b8315454f4bcee6ecbb740aa9d440baa0/itk_numerics-5.4.0-cp311-abi3-win_amd64.whl - name: itk-numerics - version: 5.4.0 - sha256: 31f24c218c763b2c15953453cc366c5ba09e7a5c7d47d432a24c0b6b12249206 - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/2d/7f/b28465e289ce6217b3e1fbebb9956e73e334a5c5f76a6426ba6843310943/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-numerics - version: 5.4.0 - sha256: 5cd8ab0781e08a4022e36094bb60652d0ee2b7cd1912f325e8f32d8bd5501fcf - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3b/b8/5f1269e17191228c7702cd81fc6e83f1814ab49a235fcba62230bac81cb4/itk_numerics-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-numerics - version: 5.4.0 - sha256: 583b665d6b8578ac93691afb796faf69e30b8db8a205754cdc746707f9589fcd - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/8a/0b/46eaffa04ac7a15d2bea1f40e179df6152c00bf709f8d08b81c5514a9e12/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-numerics - version: 5.4.0 - sha256: e2dcda0a07ccb6b9b518d3cc4413387a44c30a313c22e15bf818af06c7da8bfd - requires_dist: - - itk-core==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/88/99/3db052a349efaf1ddbb51252e7e4c7a6a10ed5b3b87e2076afb622b711fd/itk_registration-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-registration - version: 5.4.0 - sha256: 15eab6a72bebeccfb8a0fb291b65c305e46776a18a8f3cb91f199fc8ecd137a1 - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/89/f6/686c2d2650065495720889c2e6ebcf6af2e5c2692fc6d8768793b08c641a/itk_registration-5.4.0-cp311-abi3-win_amd64.whl - name: itk-registration - version: 5.4.0 - sha256: 8a2d3f2872375a9c2694bb34a2e061a4d2666f8c13390f03d94219ba8370649e - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/dc/58/ec1bf790ed9657fd8a651189d40eedd765bf1cd75355ffa3f8f9bd67f4df/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-registration - version: 5.4.0 - sha256: 3f41cff2136f69ae5c2ce6166191dff86e4722097411aaaba07a74884d36ff73 - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e7/f0/a21ddf56263ad6c5f87164032aaeb2235ee2de688cb8a8eeec01a5f01bd7/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-registration - version: 5.4.0 - sha256: dde112dbb9b695c1908692a0086f60da8d5a123f7e959ebc5aaec2825aaf9793 - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1a/e5/94a596fba3dbecdea33059b455294fbfea91fcfc0d6cfd92372e10a6da93/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-segmentation - version: 5.4.0 - sha256: ff2ca7cdf42c8c32b20e1ecf7ee0a0be68e885ce673c565e72a4876b28d2e2f3 - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/3a/92/7d32413898fe4068f0b2da97ab783057e6af84123aa6c54af3706476fed9/itk_segmentation-5.4.0-cp311-abi3-macosx_11_0_arm64.whl - name: itk-segmentation - version: 5.4.0 - sha256: b3c154e7a92be2ad48e6bf8bd5a8a17610f890bb420abb54dd2bde15b1c9c52c - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/77/8d/916c078544ac29a5ac215d2e5a2b07c9314b515b63136be92d6856a41f55/itk_segmentation-5.4.0-cp311-abi3-win_amd64.whl - name: itk-segmentation - version: 5.4.0 - sha256: 45374d3c38884ed02e0dfebf73f363e265184a50f7c46d55d8c9217e690a571f - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/79/b9/ba9598bb8b7ee3962980d481065a58f75569c5a2df1d01520083288894b0/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-segmentation - version: 5.4.0 - sha256: 8dd071dbb1ba1c8fcf26a4011fc3b7069d444e10bc56279d7b26fd3193ac58aa - requires_dist: - - itk-filtering==5.4.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/6c/cf/af6554bd0fd831ba2f8ed7840904a1b0828b1ea348b5000b78ad34c5688f/itk_webassemblyinterface-1.0b175-cp311-abi3-win_amd64.whl - name: itk-webassemblyinterface - version: 1.0b175 - sha256: 0b787ee92418a1f965c52eea1fd41a7aef4424eb6e07a290b0e1ddebf50a09e1 - requires_dist: - - itk==5.4.* - - itk-meshtopolydata==0.11.* - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/77/66/73fa21a0439eacae5156c73611b35eec2c9c3d83ae4f987754043fce1d67/itk_webassemblyinterface-1.0b175-cp311-abi3-macosx_11_0_arm64.whl - name: itk-webassemblyinterface - version: 1.0b175 - sha256: ee3defc13dc65f56127e468c145e9249265c275b63ea3c530c1b88f1df4a7033 - requires_dist: - - itk==5.4.* - - itk-meshtopolydata==0.11.* - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/a6/3c/ac3bad4ff24fe2b07064be5e44db8f4ed32a4e3708dff084e3b58c5b608c/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_x86_64.whl - name: itk-webassemblyinterface - version: 1.0b175 - sha256: 72f82fab54c4ee4c6c579cfd5c963cba9a84ecc9909e61f3641caa9fef94b40c - requires_dist: - - itk==5.4.* - - itk-meshtopolydata==0.11.* - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f2/f5/cd8ed297bd1b9f816d7492bfa857c53bd8fd68aefc2aa9bef7a0d5a61d85/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_aarch64.whl - name: itk-webassemblyinterface - version: 1.0b175 - sha256: eff3cd27756e96ebd31500ef258d0cc4a56e48c2c25c4533300469246623d7aa - requires_dist: - - itk==5.4.* - - itk-meshtopolydata==0.11.* - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl - name: itkwasm - version: 1.0b195 - sha256: c98eaf4263a89cd3e639f40da0c1e0b021f85903fdfad54606b994c42e0d057a - requires_dist: - - importlib-metadata ; python_full_version < '3.10' - - numpy - - platformdirs ; sys_platform != 'emscripten' - - typing-extensions - - wasmtime>=28.0.0 ; sys_platform != 'emscripten' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl - name: itkwasm-compare-images - version: 5.2.3 - sha256: 60a5f25ca54caf0f9823750cef72adebc443157979b028f01bfab3d6c35f9cea - requires_dist: - - itkwasm-compare-images-emscripten>=1.0.1 ; sys_platform == 'emscripten' - - itkwasm-compare-images-wasi>=1.0.1 ; sys_platform != 'emscripten' - - itkwasm>=1.0b171 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl - name: itkwasm-compare-images-wasi - version: 5.2.3 - sha256: d363d00507ed7da55e57099ec659cf7d13314141d432f9750f83af94250a0bd6 - requires_dist: - - importlib-resources - - itkwasm>=1.0b171 - requires_python: '>=3.8' -- pypi: ./python/itkwasm-downsample - name: itkwasm-downsample - version: 1.7.1 - sha256: 40a64ad99d6ad94e7e233bcc1ff4ec3ad0af60f473dbcaa2d8b0099b79c326ba - requires_dist: - - itkwasm-downsample-emscripten ; sys_platform == 'emscripten' - - itkwasm-downsample-wasi ; sys_platform != 'emscripten' - - itkwasm>=1.0b145 - requires_python: '>=3.8' - editable: true -- pypi: ./python/itkwasm-downsample-wasi - name: itkwasm-downsample-wasi - version: 1.7.1 - sha256: e889b45381ae4dba3986c719889a9a9ca1bff2d1aa55d17a10cb863fa75e2586 - requires_dist: - - importlib-resources - - itkwasm>=1.0b145 - requires_python: '>=3.8' - editable: true -- pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl - name: itkwasm-image-io - version: 1.6.0 - sha256: 55122f55b37b7b3c834952bfdc40ff51bdf1da05482e5c5aeba5b4fec418b8f7 - requires_dist: - - itkwasm-image-io-emscripten ; sys_platform == 'emscripten' - - itkwasm-image-io-wasi ; sys_platform != 'emscripten' - - itkwasm>=1.0b186 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl - name: itkwasm-image-io-wasi - version: 1.3.0 - sha256: 13fe5cad7942dc9fc94ece5711d5b342b5cb90dc93f764558de195674a2b183b - requires_dist: - - importlib-resources - - itkwasm>=1.0b131 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda - sha256: 538b1c6df537a36c63fd0ed83cb1c1c25b07d8d3b5e401991fdaff261a4b5b4d - md5: 7b756504d362cbad9b73a50a5455cafd + purls: [] + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 60963 + timestamp: 1727963148474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 889086 + timestamp: 1724658547447 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda + sha256: 1bc6445b7ecb3bff478d5a11eb3504e45eb5a3cdde24c6ec7339f80c193d24c8 + md5: 40255c9ffb722d614b02ca7aaee6abcb + depends: + - __glibc >=2.28,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 21198038 + timestamp: 1726661026112 +- conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda + sha256: dec1c78df7670d34880f71f75ac716f082d087494b4a2c6a90d5d75a82c933ed + md5: 77dab674d16c1525ebe65e67de30de0d + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 246869 + timestamp: 1697485543293 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda + sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 + md5: 7f2e286780f072ed750df46dc2631138 + depends: + - libgcc-ng >=12 + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 341592 + timestamp: 1709159244431 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + sha256: cee91036686419f6dd6086902acf7142b4916e1c4ba042e9ca23e151da012b6d + md5: 4d638782050ab6faa27275bed57e9b4e + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=13 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2891789 + timestamp: 1725410790053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda + sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d + md5: df359c09c41cd186fffb93a2d87aa6f5 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 952308 + timestamp: 1723488734144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda + sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 + md5: 385f46a4df6f97892503a841121a9acf + depends: + - __glibc >=2.17,<3.0.a0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41948418 + timestamp: 1729065846594 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pnpm-9.12.2-h6417eb3_0.conda + sha256: 0caf7ddacb1d8adb16144a93cfaf7a70bff2f83e22cbaae4d3d91b71f28f9caf + md5: 711bc7fb6b870f4b5b180c181786d710 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - nodejs >=22.6.0,<23.0a0 + license: MIT + license_family: MIT + purls: [] + size: 3466596 + timestamp: 1729713864150 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda + sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d + md5: 0515111a9cdf69f83278f7c197db9807 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31574780 + timestamp: 1728059777603 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 + md5: 0424ae29b104430108f5218a66db7260 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6238 + timestamp: 1723823388266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 depends: - - more-itertools - - python >=3.8 + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_3.conda + sha256: c6d5d0bc7fb6cbfa3b8be8f2399a3c1308b3392a4e20bd1a0f29a828fda5ab20 + md5: 4840da9db2808db946a0d979603c6de4 + depends: + - cryptography + - dbus + - jeepney >=0.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/secretstorage?source=hash-mapping + size: 31601 + timestamp: 1725915741329 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda + sha256: 4f05a61c3c3127ce7e487001215d20f49da0563fa4335462b2f6cc0028bb265b + md5: c4316a4c2b47ae154259fa5caffd53f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR MIT + purls: [] + size: 9446110 + timestamp: 1729774270770 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda + sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 + md5: 77cbc488235ebbaab2b6e912d3934bae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: MIT license_family: MIT - purls: - - pkg:pypi/jaraco-classes?source=hash-mapping - size: 12223 - timestamp: 1713939433204 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda - sha256: 9e2aeacb1aed3ab4fc5883a357e8a874e12f687af300f8708ec12de2995e17d2 - md5: 72d7ad2dcd0f37eccb2ee35a1c8f6aaa + purls: [] + size: 14679 + timestamp: 1727034741045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 depends: - - backports.tarfile - - python >=3.8 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 license: MIT license_family: MIT + purls: [] + size: 19901 + timestamp: 1727794976192 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab + md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib 1.3.1 hb9d3cd8_2 + license: Zlib + license_family: Other + purls: [] + size: 92286 + timestamp: 1727963153079 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda + sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b + md5: 8b7069e9792ee4e5b4919a7a306d2e67 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=1.11 + - libgcc >=13 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/jaraco-context?source=hash-mapping - size: 12456 - timestamp: 1714372284922 -- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda - sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 - md5: 547670a612fd335eaa5ffbf0fa75cb64 + - pkg:pypi/zstandard?source=hash-mapping + size: 419552 + timestamp: 1725305670210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 depends: - - more-itertools - - python >=3.8 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23712 + timestamp: 1650670790230 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h68df207_7.conda + sha256: 2258b0b33e1cb3a9852d47557984abb6e7ea58e3d7f92706ec1f8e879290c4cb + md5: 56398c28220513b9ea13d7b450acfb20 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 189884 + timestamp: 1720974504976 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.8.30-hcefe29a_0.conda + sha256: 2a2d827bee3775a85f0f1b2f2089291475c4416336d1b3a8cbce2964db547af8 + md5: 70e57e8f59d2c98f86b49c69e5074be5 + license: ISC + purls: [] + size: 159106 + timestamp: 1725020043153 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-1.17.1-py312hac81daf_0.conda + sha256: 1162e3ca039e7ca7c0e78f0a020ed1bde968096841b663e3f393c966eb82f0f0 + md5: 1a256e5581b1099e9295cb84d53db3ea + depends: + - libffi >=3.4,<4.0a0 + - libgcc >=13 + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT purls: - - pkg:pypi/jaraco-functools?source=hash-mapping - size: 15192 - timestamp: 1701695329516 -- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 - sha256: 16639759b811866d63315fe1391f6fb45f5478b823972f4d3d9f0392b7dd80b8 - md5: 9800ad1699b42612478755a2d26c722d + - pkg:pypi/cffi?source=hash-mapping + size: 312892 + timestamp: 1725561779888 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-43.0.3-py312he723553_0.conda + sha256: bd9cc8410bf31ac8b90d63dda92d5810af16c3841ca6dd09be9b7f9c5c7688ba + md5: bfacbf2e4560c7d6416d40f573961918 depends: - - python >=3.7 + - cffi >=1.12 + - libgcc >=13 + - openssl >=3.3.2,<4.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + purls: + - pkg:pypi/cryptography?source=hash-mapping + size: 1480456 + timestamp: 1729287055014 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.13.6-h12b9eeb_3.tar.bz2 + sha256: 5fe76bdf27a142cfb9da0fb3197c562e528d2622b573765bee5c9904cf5e6b6b + md5: f3d63805602166bac09386741e00935e + depends: + - expat >=2.4.2,<3.0a0 + - libgcc-ng >=9.4.0 + - libglib >=2.70.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 672759 + timestamp: 1640113663539 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.6.3-h5ad3122_0.conda + sha256: c827521e080d0f3395655924f1c364d48a1eac1ff3e193a12d0441e9c3b51e91 + md5: 901a44b341632b0c233756ed5abcd78b + depends: + - libexpat 2.6.3 h5ad3122_0 + - libgcc >=13 license: MIT license_family: MIT - purls: - - pkg:pypi/jeepney?source=hash-mapping - size: 36895 - timestamp: 1649085298891 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jq-1.7.1-hd590300_0.conda - sha256: a04a1603e405ea9ae5c4a492a8e361086cb441a91ef7299bd4bf3eca0b485b6d - md5: 80814f94713e35df60aad6c4b235de87 + purls: [] + size: 130283 + timestamp: 1725568848182 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.12.1-hf0a5ef3_2.conda + sha256: 7af93030f4407f076dce181062360efac2cd54dce863b5d7765287a6f5382537 + md5: a5ab74c5bd158c3d5532b66d8d83d907 depends: - libgcc-ng >=12 - - oniguruma 6.9.* - - oniguruma >=6.9.9,<6.10.0a0 + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL + purls: [] + size: 642092 + timestamp: 1694617858496 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-75.1-hf9b3779_0.conda + sha256: 813298f2e54ef087dbfc9cc2e56e08ded41de65cff34c639cc8ba4e27e4540c9 + md5: 268203e8b983fddb6412b36f2024e75c + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 license: MIT license_family: MIT purls: [] - size: 318956 - timestamp: 1702500793203 + size: 12282786 + timestamp: 1720853454991 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jq-1.7.1-h31becfc_0.conda sha256: 53437ca79e28003faac8058f6c025c83a819e122d3a0fb70624e6da0f77ab126 md5: 397702b2c1e53f0f0312d2b170d2e699 @@ -2109,83 +1762,6 @@ packages: purls: [] size: 334346 timestamp: 1702502754422 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda - sha256: e530cf5800e937bce7847a023a998db504e333a928b469c45a1752535593e762 - md5: dbf665694fb28d86d77cca18e5dd530c - depends: - - oniguruma 6.9.* - - oniguruma >=6.9.9,<6.10.0a0 - license: MIT - license_family: MIT - purls: [] - size: 317604 - timestamp: 1702501287237 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda - sha256: 8d8fc7d67e9bd387403720447abb1b5539a6f6ca8e3aba8406e0987213bfa0ce - md5: 2099f34ea2f3534f7adc5c21cc199e1b - depends: - - __osx - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/keyring?source=hash-mapping - size: 37045 - timestamp: 1726971145252 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda - sha256: 69626899dfac975090032f7af782c143b569f7706e808a4eca67a9a5aa134a15 - md5: 1c74a03431815d5e091585bb04e86f12 - depends: - - __win - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - python >=3.8 - - pywin32-ctypes >=0.2.0 - license: MIT - license_family: MIT - purls: - - pkg:pypi/keyring?source=hash-mapping - size: 37407 - timestamp: 1726971355676 -- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda - sha256: 6deeb4fa0f01447a5e8bd7261044c45d139e27d36df769e5a3a16ce55607da14 - md5: ef6f2de3c8eef0ee9fd31f2267c27bf2 - depends: - - __linux - - importlib-metadata >=4.11.4 - - importlib_resources - - jaraco.classes - - jaraco.context - - jaraco.functools - - jeepney >=0.4.2 - - python >=3.8 - - secretstorage >=3.2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/keyring?source=hash-mapping - size: 36717 - timestamp: 1726971094601 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda - sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041 - md5: 51bb7010fc86f70eee639b4bb7a894f5 - depends: - - libgcc-ng >=12 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 245247 - timestamp: 1701647787198 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.16-h922389a_0.conda sha256: be4847b1014d3cbbc524a53bdbf66182f86125775020563e11d914c8468dd97d md5: ffdd8267a04c515e7ce69c727b051414 @@ -2198,43 +1774,6 @@ packages: purls: [] size: 296219 timestamp: 1701647961116 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 - md5: 66f6c134e76fe13cce8a9ea5814b5dd5 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - license: MIT - license_family: MIT - purls: [] - size: 211959 - timestamp: 1701647962657 -- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda - sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 - md5: d3592435917b62a8becff3a60db674f6 - depends: - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - purls: [] - size: 507632 - timestamp: 1701648249706 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_2.conda - sha256: 7c91cea91b13f4314d125d1bedb9d03a29ebbd5080ccdea70260363424646dbe - md5: 048b02e3962f066da18efe3a21b77672 - depends: - - __glibc >=2.17,<3.0.a0 - constrains: - - binutils_impl_linux-64 2.43 - license: GPL-3.0-only - license_family: GPL - purls: [] - size: 669211 - timestamp: 1729655358674 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.43-h80caac9_2.conda sha256: 80ec7e8f006196808fac5bd4b3773a652847f97bbf08044cd87731424ac64f8b md5: fcbde5ea19d55468953bf588770c0501 @@ -2245,17 +1784,6 @@ packages: purls: [] size: 698245 timestamp: 1729655345825 -- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 - sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 - md5: 76bbff344f0134279f225174e9064c8f - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 281798 - timestamp: 1657977462600 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.0.0-h4de3ea5_0.tar.bz2 sha256: 2d09ef9b7796d83364957e420b41c32d94e628c3f0520b61c332518a7b5cd586 md5: 1a0ffc65e03ce81559dbcb0695ad1476 @@ -2267,141 +1795,28 @@ packages: purls: [] size: 262096 timestamp: 1657978241894 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 - sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 - md5: de462d5aacda3b30721b512c5da4e742 - depends: - - libcxx >=13.0.1 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 215721 - timestamp: 1657977558796 -- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 - sha256: f4f39d7f6a2f9b407f8fb567a6c25755270421731d70f0ff331f5de4fa367488 - md5: 1900cb3cab5055833cfddb0ba233b074 - depends: - - vc >=14.2,<15 - - vs2015_runtime >=14.29.30037 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 194365 - timestamp: 1657977692274 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda - sha256: 9c714110264f4fe824d40e11ad39b0eda65251f87826c81f4d67ccf8a3348d29 - md5: ba89ad7c5477e6a9d020020fcdadd37d - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 521199 - timestamp: 1729038190391 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.22-hb9d3cd8_0.conda - sha256: 780f0530a3adfc1497ba49d626931c6afc978c540e1abfde6ccd57128ded6ad6 - md5: b422943d5d772b7cc858b36ad2a92db5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 72242 - timestamp: 1728177071251 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.22-h86ecc28_0.conda - sha256: 986207f130703897300ddc3637c52e86a5b21c735fe384bf48554d9a6d91c56d - md5: ff6a44e8b1707d02be2fe9a36ea88d4a - depends: - - libgcc >=13 - license: MIT - license_family: MIT - purls: [] - size: 69601 - timestamp: 1728177137503 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda - sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda - md5: 2d3e3f3d8ab315748420ef58d5a3ae0f - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - purls: [] - size: 54089 - timestamp: 1728177149927 -- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda - sha256: 579c634b7de8869cb1d76eccd4c032dc275d5a017212128502ea4dc828a5b361 - md5: a3439ce12d4e3cd887270d9436f9a4c8 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: MIT - license_family: MIT - purls: [] - size: 155506 - timestamp: 1728177485361 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - sha256: 4bb47bb2cd09898737a5211e2992d63c555d63715a07ba56eae0aff31fb89c22 - md5: 59f4c43bb1b5ef1c71946ff2cbf59524 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 73616 - timestamp: 1725568742634 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.3-h5ad3122_0.conda - sha256: 02341c9c35128055fd404dfe675832b80f2bf9dbb99539457652c11c06e52757 - md5: 1d2b842bb76e268625e8ee8d0a9fe8c3 - depends: - - libgcc >=13 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 72342 - timestamp: 1725568840022 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda - sha256: 5cbe5a199fba14ade55457a468ce663aac0b54832c39aa54470b3889b4c75c4a - md5: 5f22f07c2ab2dea8c66fe9585a062c96 - depends: - - __osx >=11.0 - constrains: - - expat 2.6.3.* - license: MIT - license_family: MIT - purls: [] - size: 63895 - timestamp: 1725568783033 -- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - sha256: 9543965d155b8da96fc67dd81705fe5c2571c7c00becc8de5534c850393d4e3c - md5: 21415fbf4d0de6767a621160b43e5dea + sha256: 986207f130703897300ddc3637c52e86a5b21c735fe384bf48554d9a6d91c56d + md5: ff6a44e8b1707d02be2fe9a36ea88d4a depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - expat 2.6.3.* + - libgcc >=13 license: MIT license_family: MIT purls: [] - size: 138992 - timestamp: 1725569106114 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e - md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + size: 69601 + timestamp: 1728177137503 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.3-h5ad3122_0.conda + sha256: 02341c9c35128055fd404dfe675832b80f2bf9dbb99539457652c11c06e52757 + md5: 1d2b842bb76e268625e8ee8d0a9fe8c3 depends: - - libgcc-ng >=9.4.0 + - libgcc >=13 + constrains: + - expat 2.6.3.* license: MIT license_family: MIT purls: [] - size: 58292 - timestamp: 1636488182923 + size: 72342 + timestamp: 1725568840022 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 sha256: 7e9258a102480757fe3faeb225a3ca04dffd10fecd2a958c65cdb4cdf75f2c3c md5: dddd85f4d52121fab0a8b099c5e06501 @@ -2412,39 +1827,6 @@ packages: purls: [] size: 59450 timestamp: 1636488255090 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca - md5: 086914b672be056eb70fd4285b6783b6 - license: MIT - license_family: MIT - purls: [] - size: 39020 - timestamp: 1636488587153 -- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 - md5: 2c96d1b6915b408893f9472569dee135 - depends: - - vc >=14.1,<15.0a0 - - vs2015_runtime >=14.16.27012 - license: MIT - license_family: MIT - purls: [] - size: 42063 - timestamp: 1636489106777 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.2.0-h77fa898_1.conda - sha256: 53eb8a79365e58849e7b1a068d31f4f9e718dc938d6f2c03e960345739a03569 - md5: 3cb76c3f10d3bc7f1105b2fc9db984df - depends: - - _libgcc_mutex 0.1 conda_forge - - _openmp_mutex >=4.5 - constrains: - - libgomp 14.2.0 h77fa898_1 - - libgcc-ng ==14.2.0=*_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 848745 - timestamp: 1729027721139 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-14.2.0-he277a41_1.conda sha256: 5d56757ccad208c79214395b00d006d8d18929a4ba49c47bd9460789a7620943 md5: 511b511c5445e324066c3377481bcab8 @@ -2458,16 +1840,6 @@ packages: purls: [] size: 535243 timestamp: 1729089435134 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.2.0-h69a702a_1.conda - sha256: 3a76969c80e9af8b6e7a55090088bc41da4cffcde9e2c71b17f44d37b7cb87f7 - md5: e39480b9ca41323497b05492a63bc35b - depends: - - libgcc 14.2.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 54142 - timestamp: 1729027726517 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-14.2.0-he9431aa_1.conda sha256: 9b5cf168a6c7361cae869cb74b716766ee7c6d6b3f6172b32ba9bf91135efdc4 md5: 0694c249c61469f2c0f7e2990782af21 @@ -2478,22 +1850,6 @@ packages: purls: [] size: 54104 timestamp: 1729089444587 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.82.2-h2ff4ddf_0.conda - sha256: 49ee9401d483a76423461c50dcd37f91d070efaec7e4dc2828d8cdd2ce694231 - md5: 13e8e54035ddd2b91875ba399f0f7c04 - depends: - - __glibc >=2.17,<3.0.a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libiconv >=1.17,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - pcre2 >=10.44,<10.45.0a0 - constrains: - - glib 2.82.2 *_0 - license: LGPL-2.1-or-later - purls: [] - size: 3931898 - timestamp: 1729191404130 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.82.2-hc486b8e_0.conda sha256: 6797d24de7acd298f81a86078c64e4f3fea6d551a3e8892205c9e72a37a7cc3c md5: 47f6d85fe47b865e56c539f2ba5f4dad @@ -2509,16 +1865,6 @@ packages: purls: [] size: 4020802 timestamp: 1729191545578 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.2.0-h77fa898_1.conda - sha256: 1911c29975ec99b6b906904040c855772ccb265a1c79d5d75c8ceec4ed89cd63 - md5: cc3573974587f12dda90d96e3e55a702 - depends: - - _libgcc_mutex 0.1 conda_forge - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - purls: [] - size: 460992 - timestamp: 1729027639220 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-14.2.0-he277a41_1.conda sha256: 5aa53874a5e57a00f2e0c2e2910684eb674429cd5fcb803619b226a73e89aedf md5: 376f0e73abbda6d23c0cb749adc195ef @@ -2527,15 +1873,6 @@ packages: purls: [] size: 463521 timestamp: 1729089357313 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9 - md5: d66573916ffcf376178462f1b61c941e - depends: - - libgcc-ng >=12 - license: LGPL-2.1-only - purls: [] - size: 705775 - timestamp: 1702682170569 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.17-h31becfc_2.conda sha256: a30e09d089cb75a0d5b8e5c354694c1317da98261185ed65aa3793e741060614 md5: 9a8eb13f14de7d761555a98712e6df65 @@ -2545,17 +1882,6 @@ packages: purls: [] size: 705787 timestamp: 1702684557134 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f - md5: ea25936bb4080d843790b586850f82b8 - depends: - - libgcc-ng >=12 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - purls: [] - size: 618575 - timestamp: 1694474974816 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.0.0-h31becfc_1.conda sha256: 675bc1f2a8581cd34a86c412663ec29c5f90c1d9f8d11866aa1ade5cdbdf8429 md5: ed24e702928be089d9ba3f05618515c6 @@ -2567,537 +1893,823 @@ packages: purls: [] size: 647126 timestamp: 1694475003570 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda - sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 - md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 34501 + timestamp: 1697358973269 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda + sha256: 23b5ce15cf9c6017641a8396bab00ae807dd9f662718cfa7f61de114d0c97647 + md5: 5d25802b25fcc7419fa13e21affaeb3a + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: zlib-acknowledgement + purls: [] + size: 294907 + timestamp: 1726236639270 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda + sha256: 469ed05e9a1622b0204a2b6cf620c9054bf6904e2ed818a1f91ee96a7bc64517 + md5: ccbe261fb8c1f1cd1a3122592247d3c4 + depends: + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + purls: [] + size: 1042108 + timestamp: 1729592001716 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda + sha256: 519556d2c93f1b487091ce046d62e762286177f4a670ec10e16005177d0bcab3 + md5: 37f489acd39e22b623d2d1e5ac6d195c + depends: + - libgcc 14.2.0 he277a41_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 3816794 + timestamp: 1729089463404 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda + sha256: 9f97461bd55a2745a7a0941f3502a047f15bfe7bb2952dc7fb204b3202f866fd + md5: 0e75771b8a03afae5a2c6ce71bc733f5 + depends: + - libstdcxx 14.2.0 h3f4de04_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 54133 + timestamp: 1729089498541 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda + sha256: 14ecb9e129b1b5ffd6d4bee48de95cd2cd0973c712e1b965d3ef977cca23936d + md5: 1f80061f5ba6956fcdc381f34618cd8d + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.22,<1.23.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx >=13 + - libwebp-base >=1.4.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 464938 + timestamp: 1728232266969 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 35720 + timestamp: 1680113474501 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda + sha256: adf4eca89339ac7780f2394e7e6699be81259eb91f79f9d9fdf2c1bc6b26f210 + md5: 1899e1ec2be63386c41c4db31d3056af + depends: + - libgcc >=13 + license: MIT + license_family: MIT + purls: [] + size: 627484 + timestamp: 1729322575379 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda + sha256: 10dded60f274e29c573cfacf6e96f5d0fc374ee431250374a44cbd773916ab9d + md5: 5fd7ab3e5f382c70607fbac6335e6e19 + depends: + - libgcc-ng >=12 constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 363577 + timestamp: 1713201785160 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda + sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b + md5: cd14ee5cca2464a425b1dbfc24d90db2 + depends: + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + purls: [] + size: 397493 + timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 114269 + timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 + md5: 08aad7cbe9f5a6b460d0976076b6ae64 + depends: + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 66657 + timestamp: 1727963199518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda + sha256: acad4cf1f57b12ee1e42995e6fac646fa06aa026529f05eb8c07eb0a84a47a84 + md5: 91d49c85cacd92caa40cf375ef72a25d + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause purls: [] - size: 547541 - timestamp: 1694475104253 -- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda - sha256: 4e7808e3098b4b4ed7e287f63bb24f9045cc4d95bfd39f0db870fc2837d74dff - md5: 3f1b948619c45b1ca714d60c7389092c + size: 924472 + timestamp: 1724658573518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.9.0-h8374285_0.conda + sha256: ff2186a51d389c18423109af3abf6377d4ef5b1370a81ee5f8fb2e036d79cf4f + md5: 6a9739c1ce3f9714b705a655872b5a4d depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib + - __glibc >=2.28,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - zlib + license: MIT + license_family: MIT purls: [] - size: 822966 - timestamp: 1694475223854 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 - md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + size: 21653106 + timestamp: 1726665120657 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda + sha256: e21b1822736959ba434ebce452ee86844a11d918c8b1c48c71f15e9a932fd571 + md5: 475018b8e0b8720c985a185427f5bf13 depends: - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL + license: BSD-2-Clause + license_family: BSD purls: [] - size: 33408 - timestamp: 1697359010159 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda - sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 - md5: c14f32510f694e3185704d89967ec422 + size: 250005 + timestamp: 1697487236819 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda + sha256: d83375856601bc67c11295b537548a937a6896ede9d0a51d78bf5e921ab07c6f + md5: fd2898519e839d5ceb778343f39a3176 depends: - libgcc-ng >=12 - license: LGPL-2.1-only - license_family: GPL + - libpng >=1.6.43,<1.7.0a0 + - libstdcxx-ng >=12 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause + license_family: BSD purls: [] - size: 34501 - timestamp: 1697358973269 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.44-hadc24fc_0.conda - sha256: e5b14f7a01c2db4362d8591f42f82f336ed48d5e4079e4d1f65d0c2a3637ea78 - md5: f4cc49d7aa68316213e4b12be35308d1 + size: 374964 + timestamp: 1709159226478 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda + sha256: 4669d26dbf81e4d72093d8260f55d19d57204d82b1d9440be83d11d313b5990c + md5: 9e1e477b3f8ee3789297883faffa708b depends: - - __glibc >=2.17,<3.0.a0 + - ca-certificates - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement + license: Apache-2.0 + license_family: Apache purls: [] - size: 290661 - timestamp: 1726234747153 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.44-hc4a20ef_0.conda - sha256: 23b5ce15cf9c6017641a8396bab00ae807dd9f662718cfa7f61de114d0c97647 - md5: 5d25802b25fcc7419fa13e21affaeb3a + size: 3428083 + timestamp: 1725412266679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda + sha256: e9f4b912e48514771d477f2ee955f59d4ff4ef799c3d4d16e4d0f335ce91df67 + md5: 94022de9682cb1a0bb18a99cbc3541b3 depends: - - libgcc >=13 + - bzip2 >=1.0.8,<2.0a0 + - libgcc-ng >=12 - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement + license: BSD-3-Clause + license_family: BSD purls: [] - size: 294907 - timestamp: 1726236639270 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda - sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 - md5: fb36e93f0ea6a6f5d2b99984f34b049e + size: 884590 + timestamp: 1723488793100 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.0.0-py312h5ab5af3_0.conda + sha256: 3cf43a5eb1f67f3a5f3ef1ec3a685f8767019cce24dbe46c4b76fee8a54fbacf + md5: 1c4bdfe659cfdedd372685ce2494e97b depends: - - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - license: zlib-acknowledgement - purls: [] - size: 263385 - timestamp: 1726234714421 -- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda - sha256: 0d3d6ff9225f6918ac225e3839c0d91e5af1da08a4ebf59cac1bfd86018db945 - md5: 639ac6b55a40aa5de7b8c1b4d78f9e81 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 41756471 + timestamp: 1729068045876 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda + sha256: aa25e9d0085be78115c5104ff905f9930d8585901a7a8d7278083f87ff4f6d25 + md5: 15d1e168a06119b34c9bd39187ce2af3 depends: - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: zlib-acknowledgement + - libgcc >=13 + - libstdcxx >=13 + - nodejs >=22.6.0,<23.0a0 + license: MIT + license_family: MIT purls: [] - size: 348933 - timestamp: 1726235196095 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.47.0-hadc24fc_0.conda - sha256: 76ffc7a5823b51735c11d535f3666b3c9c7d1519f9fbb6fa9cdff79db01960b9 - md5: 540296f0ce9d3352188c15a89b30b9ac + size: 3516854 + timestamp: 1729713906302 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda + sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba + md5: bb5a90c93e3bac3d5690acf76b4a6386 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=13 - - libzlib >=1.3.1,<2.0a0 - license: Unlicense + license: MIT + license_family: MIT purls: [] - size: 874704 - timestamp: 1729591931557 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.47.0-hc4a20ef_0.conda - sha256: 469ed05e9a1622b0204a2b6cf620c9054bf6904e2ed818a1f91ee96a7bc64517 - md5: ccbe261fb8c1f1cd1a3122592247d3c4 + size: 8342 + timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.7-h5d932e8_0_cpython.conda + sha256: 25570873d92d4d9490c6db780cc85e6c28bd3ff61dc1ece79f602cf82bc73bc1 + md5: e6cab21bb5787270388939cf41cc5f43 depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 - libzlib >=1.3.1,<2.0a0 - license: Unlicense + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 purls: [] - size: 1042108 - timestamp: 1729592001716 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda - sha256: 76aa4bbbaa2334689b16048f04ac4c7406e9bfb1f225ac7107fd2a73f85329cf - md5: 5bbe4802d5460b80620411fe1da8fec3 + size: 13762126 + timestamp: 1728057461028 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 + md5: 62b20f305498284a07dc6c45fd0e5c87 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6329 + timestamp: 1723823366253 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd + md5: 105eb1e16bf83bfb2eb380a48032b655 depends: - - __osx >=11.0 - - libzlib >=1.3.1,<2.0a0 - license: Unlicense + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 837789 - timestamp: 1729592072314 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda - sha256: 4f3cd0477c831eab48fb7fa3ed91d918aeb644fad9b4014726d445339750cdcc - md5: 964bef59135d876c596ae67b3315e812 + size: 294092 + timestamp: 1679532238805 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.3.3-py312h8025657_3.conda + sha256: fd6bc45ba0c6bb097ad98037ad8d2ddf2449f28c2eedf57dfff54eeceefe90c6 + md5: 4ae02e3717828f5e92dfae068845afdd depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Unlicense + - cryptography + - dbus + - jeepney >=0.6 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/secretstorage?source=hash-mapping + size: 31394 + timestamp: 1725917363210 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD purls: [] - size: 884970 - timestamp: 1729592254351 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-14.2.0-hc0a3c3a_1.conda - sha256: 4661af0eb9bdcbb5fb33e5d0023b001ad4be828fccdcc56500059d56f9869462 - md5: 234a5554c53625688d51062645337328 + size: 3351802 + timestamp: 1695506242997 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda + sha256: f63f7ab9e410899daf66e7ff343020b4bb8cf5f52413acca0dcb95ae9b04f854 + md5: f3f6ad5ca3aca4e0e5fd0f7f5f156093 depends: - - libgcc 14.2.0 h77fa898_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libgcc >=13 + - libstdcxx >=13 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR MIT purls: [] - size: 3893695 - timestamp: 1729027746910 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-14.2.0-h3f4de04_1.conda - sha256: 519556d2c93f1b487091ce046d62e762286177f4a670ec10e16005177d0bcab3 - md5: 37f489acd39e22b623d2d1e5ac6d195c + size: 8929757 + timestamp: 1729774724816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h86ecc28_1.conda + sha256: a00c4c6054209c84fb460c5e4ae7193c335a9ee1851645c9ad59312438e853f7 + md5: c5f72a733c461aa7785518d29b997cc8 depends: - - libgcc 14.2.0 he277a41_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libgcc >=13 + license: MIT + license_family: MIT purls: [] - size: 3816794 - timestamp: 1729089463404 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.2.0-h4852527_1.conda - sha256: 25bb30b827d4f6d6f0522cc0579e431695503822f144043b93c50237017fffd8 - md5: 8371ac6457591af2cf6159439c1fd051 + size: 15690 + timestamp: 1727036097294 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda + sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f + md5: 25a5a7b797fe6e084e04ffe2db02fc62 depends: - - libstdcxx 14.2.0 hc0a3c3a_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libgcc >=13 + license: MIT + license_family: MIT purls: [] - size: 54105 - timestamp: 1729027780628 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-14.2.0-hf1166c9_1.conda - sha256: 9f97461bd55a2745a7a0941f3502a047f15bfe7bb2952dc7fb204b3202f866fd - md5: 0e75771b8a03afae5a2c6ce71bc733f5 + size: 20615 + timestamp: 1727796660574 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + sha256: 93f58a7b393adf41fa007ac8c55978765e957e90cd31877ece1e5a343cb98220 + md5: 83baad393a31d59c20b63ba4da6592df depends: - - libstdcxx 14.2.0 h3f4de04_1 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 purls: [] - size: 54133 - timestamp: 1729089498541 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.0-he137b08_1.conda - sha256: 9890121db85f6ef463fe12eb04ef1471176e3ef3b5e2d62e8d6dac713df00df4 - md5: 63872517c98aa305da58a757c443698e + size: 440555 + timestamp: 1660348056328 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 + md5: bc230abb5d21b63ff4799b0e75204783 depends: - - __glibc >=2.17,<3.0.a0 - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND + - libzlib 1.3.1 h86ecc28_2 + license: Zlib + license_family: Other purls: [] - size: 428156 - timestamp: 1728232228989 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.0-hec21d91_1.conda - sha256: 14ecb9e129b1b5ffd6d4bee48de95cd2cd0973c712e1b965d3ef977cca23936d - md5: 1f80061f5ba6956fcdc381f34618cd8d + size: 95582 + timestamp: 1727963203597 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda + sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 + md5: ffcb8e97e62af42075e0e5f46bb9856e depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 + - cffi >=1.11 - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libstdcxx >=13 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 - zstd >=1.5.6,<1.6.0a0 - license: HPND - purls: [] - size: 464938 - timestamp: 1728232266969 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda - sha256: 97ba24c74750b6e731b3fe0d2a751cda6148b4937d2cc3f72d43bf7b3885c39d - md5: b9abf45f7c64caf3303725f1aa0e9a4d + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 392496 + timestamp: 1725305808244 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda + sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c + md5: be8d5f8cf21aed237b8b182ea86b3dd6 depends: - - __osx >=11.0 - - lerc >=4.0.0,<5.0a0 - - libcxx >=17 - - libdeflate >=1.22,<1.23.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 366323 - timestamp: 1728232400072 -- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda - sha256: 902cb9f7f54d17dcfd54ce050b1ce2bc944b9bbd1748913342c2ea1e1140f8bb - md5: eac317ed1cc6b9c0af0c27297e364665 + size: 539937 + timestamp: 1714723130243 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.6.2.post1-pyhd8ed1ab_0.conda + sha256: 4b54b7ce79d818e3cce54ae4d552dba51b7afac160ceecdefd04b3917a37c502 + md5: 688697ec5e9588bdded167d19577625b depends: - - lerc >=4.0.0,<5.0a0 - - libdeflate >=1.22,<1.23.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libzlib >=1.3.1,<2.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - - xz >=5.2.6,<6.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: HPND + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.9 + - sniffio >=1.1 + - typing_extensions >=4.1 + constrains: + - uvloop >=0.21.0b1 + - trio >=0.26.1 + license: MIT + license_family: MIT + purls: + - pkg:pypi/anyio?source=compressed-mapping + size: 109864 + timestamp: 1728935803440 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_4.conda + sha256: 31b51537ce7d2ba8b5b3d0095f1813711884304ac1701bc55938ca75f6c82e19 + md5: 67bdebbc334513034826e9b63f769d4c + depends: + - python >=3 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 978865 - timestamp: 1728232594877 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 - md5: 40b61aab5c7ba9ff276c41cfffe6b80b + size: 6989 + timestamp: 1722295637981 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.0.0-pyhd8ed1ab_1.conda + sha256: 7ba30f32daad2e7ca251508525185ba170eedc14123572611c2acf261c7956b3 + md5: c747b1d79f136013c3b7ebcba876afa6 + depends: + - backports + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/backports-tarfile?source=hash-mapping + size: 31951 + timestamp: 1712700751335 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.8.30-pyhd8ed1ab_0.conda + sha256: 7020770df338c45ac6b560185956c32f0a5abf4b76179c037f115fc7d687819f + md5: 12f7d00853807b0531775e9be891cb11 + depends: + - python >=3.7 + license: ISC + purls: + - pkg:pypi/certifi?source=hash-mapping + size: 163752 + timestamp: 1725278204397 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + md5: f3ad426304898027fc619827ff428eca + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 84437 + timestamp: 1692311973840 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + md5: 3549ecbceb6cd77b91a105511b7d0786 + depends: + - __win + - colorama + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/click?source=hash-mapping + size: 85051 + timestamp: 1692312207348 +- 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/distlib-0.3.9-pyhd8ed1ab_0.conda + sha256: 300b2e714f59403df0560174f5ef6c19db8b4a3b74a7244862cf771f07dee8fb + md5: fe521c1608280cc2803ebd26dc252212 + depends: + - python 2.7|>=3.6 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/distlib?source=hash-mapping + size: 276214 + timestamp: 1728557312342 +- conda: https://conda.anaconda.org/conda-forge/noarch/editables-0.5-pyhd8ed1ab_0.conda + sha256: de160a7494e7bc72360eea6a29cbddf194d0a79f45ff417a4de20e6858cf79a9 + md5: 9873878e2a069bc358b69e9a29c1ecd5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/editables?source=hash-mapping + size: 10988 + timestamp: 1705857085102 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda + sha256: e0edd30c4b7144406bb4da975e6bb97d6bc9c0e999aa4efe66ae108cada5d5b5 + md5: d02ae936e42063ca46af6cdad2dbd1e0 depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 33601 - timestamp: 1680112270483 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda - sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f - md5: 000e30b09db0b7c775b21695dff30969 + - python >=3.7 + license: MIT and PSF-2.0 + purls: + - pkg:pypi/exceptiongroup?source=hash-mapping + size: 20418 + timestamp: 1720869435725 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.16.1-pyhd8ed1ab_0.conda + sha256: 1da766da9dba05091af87977922fe60dc7464091a9ccffb3765d403189d39be4 + md5: 916f8ec5dd4128cd5f207a3c4c07b2c6 depends: - - libgcc-ng >=12 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 35720 - timestamp: 1680113474501 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.49.2-hb9d3cd8_0.conda - sha256: a35cd81cd1a9add11024097da83cc06b0aae83186fe4124b77710876f37d8f31 - md5: 070e3c9ddab77e38799d5c30b109c633 + - python >=3.7 + license: Unlicense + purls: + - pkg:pypi/filelock?source=hash-mapping + size: 17357 + timestamp: 1726613593584 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + sha256: 817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085 + md5: b21ed0883505ba1910994f1df031a428 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - python >=3 + - typing_extensions license: MIT license_family: MIT - purls: [] - size: 884647 - timestamp: 1729322566955 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.49.2-h86ecc28_0.conda - sha256: adf4eca89339ac7780f2394e7e6699be81259eb91f79f9d9fdf2c1bc6b26f210 - md5: 1899e1ec2be63386c41c4db31d3056af + purls: + - pkg:pypi/h11?source=hash-mapping + size: 48251 + timestamp: 1664132995560 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: b748fbf7060927a6e82df7cb5ee8f097 depends: - - libgcc >=13 + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.6.1 license: MIT license_family: MIT - purls: [] - size: 627484 - timestamp: 1729322575379 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda - sha256: 0e5176af1e788ad5006cf261c4ea5a288a935fda48993b0240ddd2e562dc3d02 - md5: 4bc348e3a1a74d20a3f9beb866d75e0a + purls: + - pkg:pypi/h2?source=hash-mapping + size: 46754 + timestamp: 1634280590080 +- conda: https://conda.anaconda.org/conda-forge/noarch/hatch-1.13.0-pyhd8ed1ab_0.conda + sha256: 675b0304b129a4dbc39b8e6f337cea51adebef20508a656f43b6e6b43d9cf458 + md5: b8a6437f94d29aef00decdbe1174be27 depends: - - __osx >=11.0 + - click >=8.0.6 + - hatchling >=1.24.2 + - httpx >=0.22.0 + - hyperlink >=21.0.0 + - keyring >=23.5.0 + - packaging >=23.2 + - pexpect >=4.8,<5 + - platformdirs >=2.5.0 + - python >=3.8 + - rich >=11.2.0 + - shellingham >=1.4.0 + - tomli-w >=1.0 + - tomlkit >=0.11.1 + - userpath >=1.7,<2 + - uv >=0.1.35 + - virtualenv >=20.26.1 + - zstandard <1.0 license: MIT license_family: MIT - purls: [] - size: 410500 - timestamp: 1729322654121 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda - sha256: 49bc5f6b1e11cb2babf2a2a731d1a680a5e08a858280876a779dbda06c78c35f - md5: b26e8aa824079e1be0294e7152ca4559 + purls: + - pkg:pypi/hatch?source=hash-mapping + size: 177173 + timestamp: 1728879212263 +- conda: https://conda.anaconda.org/conda-forge/noarch/hatchling-1.25.0-pyhd8ed1ab_0.conda + sha256: fb8a16a913f909d8f7d2ae95c18a1aeb7be3eebfb1b7a4246500c06d54498f89 + md5: 7571d6e5561b04aef679a11904dfcebf depends: - - libgcc-ng >=12 - constrains: - - libwebp 1.4.0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 438953 - timestamp: 1713199854503 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.4.0-h31becfc_0.conda - sha256: 10dded60f274e29c573cfacf6e96f5d0fc374ee431250374a44cbd773916ab9d - md5: 5fd7ab3e5f382c70607fbac6335e6e19 + - editables >=0.3 + - importlib-metadata + - packaging >=21.3 + - pathspec >=0.10.1 + - pluggy >=1.0.0 + - python >=3.7 + - tomli >=1.2.2 + - trove-classifiers + license: MIT + license_family: MIT + purls: + - pkg:pypi/hatchling?source=hash-mapping + size: 64580 + timestamp: 1719090878694 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 + md5: 914d6646c4dbb1fd3ff539830a12fd71 depends: - - libgcc-ng >=12 - constrains: - - libwebp 1.4.0 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/hpack?source=hash-mapping + size: 25341 + timestamp: 1598856368685 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.6-pyhd8ed1ab_0.conda + sha256: 8952c3f1eb18bf4d7e813176c3b23e0af4e863e8b05087e73f74f371d73077ca + md5: b8e1901ef9a215fc41ecfb6bef7e0943 + depends: + - anyio >=3.0,<5.0 + - certifi + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - python >=3.8 + - sniffio 1.* license: BSD-3-Clause license_family: BSD - purls: [] - size: 363577 - timestamp: 1713201785160 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda - sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 - md5: c0af0edfebe780b19940e94871f1a765 - constrains: - - libwebp 1.4.0 + purls: + - pkg:pypi/httpcore?source=hash-mapping + size: 45711 + timestamp: 1727821031365 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.2-pyhd8ed1ab_0.conda + sha256: 1a33f160548bf447e15c0273899d27e4473f1d5b7ca1441232ec2d9d07c56d03 + md5: 7e9ac3faeebdbd7b53b462c41891e7f7 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.8 + - sniffio license: BSD-3-Clause license_family: BSD - purls: [] - size: 287750 - timestamp: 1713200194013 -- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda - sha256: d0ca51cb1de9192be9a3238e71fbcca5a535619c499c4f4c9b2ed41c14d36770 - md5: abd61d0ab127ec5cd68f62c2969e6f34 + purls: + - pkg:pypi/httpx?source=hash-mapping + size: 65085 + timestamp: 1724778453275 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 + md5: 9f765cbfab6870c8435b9eefecd7a1f4 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - libwebp 1.4.0 + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperframe?source=hash-mapping + size: 14646 + timestamp: 1619110249723 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperlink-21.0.0-pyhd3deb0d_0.tar.bz2 + sha256: 026cb82ada41be9ee2836a2ace526e85c4603e77617887c41c6e62c9bde798b3 + md5: 1303beb57b40f8f4ff6fb1bb23bf0553 + depends: + - idna >=2.6 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/hyperlink?source=hash-mapping + size: 72732 + timestamp: 1610092261086 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_0.conda + sha256: 8c57fd68e6be5eecba4462e983aed7e85761a519aab80e834bbd7794d4b545b2 + md5: 7ba2ede0e7c795ff95088daf0dc59753 + depends: + - python >=3.6 license: BSD-3-Clause license_family: BSD - purls: [] - size: 274359 - timestamp: 1713200524021 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa - md5: 92ed62436b625154323d40d5f2f11dd7 + purls: + - pkg:pypi/idna?source=hash-mapping + size: 49837 + timestamp: 1726459583613 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.5.0-pyha770c72_0.conda + sha256: 7194700ce1a5ad2621fd68e894dd8c1ceaff9a38723e6e0e5298fdef13017b1c + md5: 54198435fce4d64d8a89af22573012a8 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - python >=3.8 + - zipp >=0.5 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-metadata?source=hash-mapping + size: 28646 + timestamp: 1726082927916 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.5-pyhd8ed1ab_0.conda + sha256: 2cb9db3e40033c3df72d3defc678a012840378fd55a67e4351363d4b321a0dc1 + md5: c808991d29b9838fb4d96ce8267ec9ec + depends: + - python >=3.8 + - zipp >=3.1.0 + constrains: + - importlib-resources >=6.4.5,<6.4.6.0a0 + license: Apache-2.0 + license_family: APACHE + purls: + - pkg:pypi/importlib-resources?source=hash-mapping + size: 32725 + timestamp: 1725921462405 +- 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: [] - size: 395888 - timestamp: 1727278577118 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda - sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b - md5: cd14ee5cca2464a425b1dbfc24d90db2 + purls: + - pkg:pypi/iniconfig?source=hash-mapping + size: 11101 + timestamp: 1673103208955 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_1.conda + sha256: 538b1c6df537a36c63fd0ed83cb1c1c25b07d8d3b5e401991fdaff261a4b5b4d + md5: 7b756504d362cbad9b73a50a5455cafd depends: - - libgcc >=13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - more-itertools + - python >=3.8 license: MIT license_family: MIT - purls: [] - size: 397493 - timestamp: 1727280745441 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 - md5: af523aae2eca6dfa1c8eec693f5b9a79 + purls: + - pkg:pypi/jaraco-classes?source=hash-mapping + size: 12223 + timestamp: 1713939433204 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-5.3.0-pyhd8ed1ab_1.conda + sha256: 9e2aeacb1aed3ab4fc5883a357e8a874e12f687af300f8708ec12de2995e17d2 + md5: 72d7ad2dcd0f37eccb2ee35a1c8f6aaa depends: - - __osx >=11.0 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - backports.tarfile + - python >=3.8 license: MIT license_family: MIT - purls: [] - size: 323658 - timestamp: 1727278733917 -- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.16-h013a479_1.conda - sha256: abae56e12a4c62730b899fdfb82628a9ac171c4ce144fc9f34ae024957a82a0e - md5: f0b599acdc82d5bc7e3b105833e7c5c8 + purls: + - pkg:pypi/jaraco-context?source=hash-mapping + size: 12456 + timestamp: 1714372284922 +- conda: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.0.0-pyhd8ed1ab_0.conda + sha256: d2e866fd22a48eaa2f795b6a3b0bf16f066293322ce04dd65cca36267160ead6 + md5: 547670a612fd335eaa5ffbf0fa75cb64 depends: - - m2w64-gcc-libs - - m2w64-gcc-libs-core - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp + - more-itertools + - python >=3.8 license: MIT license_family: MIT - purls: [] - size: 989459 - timestamp: 1724419883091 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c - md5: 5aa797f8787fe7a17d1b0821485b5adc - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 100393 - timestamp: 1702724383534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f - md5: b4df5d7d4b63579d081fd3a4cf99740e - depends: - - libgcc-ng >=12 - license: LGPL-2.1-or-later - purls: [] - size: 114269 - timestamp: 1702724369203 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 - md5: 08aad7cbe9f5a6b460d0976076b6ae64 - depends: - - libgcc >=13 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 66657 - timestamp: 1727963199518 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 - md5: 41fbfac52c601159df6c01f875de31b9 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - zlib 1.3.1 *_2 - license: Zlib - license_family: Other - purls: [] - size: 55476 - timestamp: 1727963768015 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 - sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 - md5: 066552ac6b907ec6d72c0ddab29050dc - depends: - - m2w64-gcc-libs-core - - msys2-conda-epoch ==20160418 - license: GPL, LGPL, FDL, custom - purls: [] - size: 350687 - timestamp: 1608163451316 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 - sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa - md5: fe759119b8b3bfa720b8762c6fdc35de - depends: - - m2w64-gcc-libgfortran - - m2w64-gcc-libs-core - - m2w64-gmp - - m2w64-libwinpthread-git - - msys2-conda-epoch ==20160418 - license: GPL3+, partial:GCCRLE, partial:LGPL2+ - purls: [] - size: 532390 - timestamp: 1608163512830 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 - sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 - md5: 4289d80fb4d272f1f3b56cfe87ac90bd - depends: - - m2w64-gmp - - m2w64-libwinpthread-git - - msys2-conda-epoch ==20160418 - license: GPL3+, partial:GCCRLE, partial:LGPL2+ - purls: [] - size: 219240 - timestamp: 1608163481341 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 - sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 - md5: 53a1c73e1e3d185516d7e3af177596d9 + purls: + - pkg:pypi/jaraco-functools?source=hash-mapping + size: 15192 + timestamp: 1701695329516 +- conda: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.8.0-pyhd8ed1ab_0.tar.bz2 + sha256: 16639759b811866d63315fe1391f6fb45f5478b823972f4d3d9f0392b7dd80b8 + md5: 9800ad1699b42612478755a2d26c722d depends: - - msys2-conda-epoch ==20160418 - license: LGPL3 - purls: [] - size: 743501 - timestamp: 1608163782057 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-jq-1.6-h301d43c_0.tar.bz2 - sha256: d722a8c06f44dfb5f357608e6e1d40d1f1c926316bbee5d1e71d93823554646b - md5: 209cbf1b222dc774cb29ce57796500b3 + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/jeepney?source=hash-mapping + size: 36895 + timestamp: 1649085298891 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh534df25_0.conda + sha256: 8d8fc7d67e9bd387403720447abb1b5539a6f6ca8e3aba8406e0987213bfa0ce + md5: 2099f34ea2f3534f7adc5c21cc199e1b depends: - - m2w64-gcc-libs - - m2w64-oniguruma + - __osx + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.8 license: MIT license_family: MIT - purls: [] - size: 424702 - timestamp: 1591860215369 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 - sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 - md5: 774130a326dee16f1ceb05cc687ee4f0 + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 37045 + timestamp: 1726971145252 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyh7428d3b_0.conda + sha256: 69626899dfac975090032f7af782c143b569f7706e808a4eca67a9a5aa134a15 + md5: 1c74a03431815d5e091585bb04e86f12 depends: - - msys2-conda-epoch ==20160418 - license: MIT, BSD - purls: [] - size: 31928 - timestamp: 1608166099896 -- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 - sha256: 523edeac9788aa61243bd2ceb7b8bdb1a86b68c9f7f1aeb933085893d2886cc3 - md5: 61c9b808f92724106a63dd7b50979d6b + - __win + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - python >=3.8 + - pywin32-ctypes >=0.2.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 37407 + timestamp: 1726971355676 +- conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.4.1-pyha804496_0.conda + sha256: 6deeb4fa0f01447a5e8bd7261044c45d139e27d36df769e5a3a16ce55607da14 + md5: ef6f2de3c8eef0ee9fd31f2267c27bf2 depends: - - m2w64-gcc-libs - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 426599 - timestamp: 1591828659130 + - __linux + - importlib-metadata >=4.11.4 + - importlib_resources + - jaraco.classes + - jaraco.context + - jaraco.functools + - jeepney >=0.4.2 + - python >=3.8 + - secretstorage >=3.2 + license: MIT + license_family: MIT + purls: + - pkg:pypi/keyring?source=hash-mapping + size: 36717 + timestamp: 1726971094601 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 md5: 93a8e71256479c62074356ef6ebf501b @@ -3118,270 +2730,20 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/mdurl?source=hash-mapping - size: 14680 - timestamp: 1704317789138 -- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda - sha256: 2315b7dba237e16b0e1b601725a8e03e062421e0be28d8a25dc35dd9bd93a342 - md5: 3364591bebd600979606791e1dff7cb6 - depends: - - python >=3.8 - license: MIT - license_family: MIT - purls: - - pkg:pypi/more-itertools?source=hash-mapping - size: 57345 - timestamp: 1725630183289 -- conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 - md5: b0309b72560df66f71a9d5e34a5efdfa - purls: [] - size: 3227 - timestamp: 1608166968312 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda - sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a - md5: 70caf8bb6cf39a0b6b7efc885f51c0fe - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - purls: [] - size: 889086 - timestamp: 1724658547447 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-hcccb83c_1.conda - sha256: acad4cf1f57b12ee1e42995e6fac646fa06aa026529f05eb8c07eb0a84a47a84 - md5: 91d49c85cacd92caa40cf375ef72a25d - depends: - - libgcc-ng >=12 - license: X11 AND BSD-3-Clause - purls: [] - size: 924472 - timestamp: 1724658573518 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda - sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc - md5: cb2b0ea909b97b3d70cd3921d1445e1a - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - purls: [] - size: 802321 - timestamp: 1724658775723 -- conda: https://conda.anaconda.org/conda-forge/linux-64/nodejs-22.9.0-hf235a45_0.conda - sha256: 1bc6445b7ecb3bff478d5a11eb3504e45eb5a3cdde24c6ec7339f80c193d24c8 - md5: 40255c9ffb722d614b02ca7aaee6abcb - depends: - - __glibc >=2.28,<3.0.a0 - - icu >=75.1,<76.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libuv >=1.48.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - size: 21198038 - timestamp: 1726661026112 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nodejs-22.9.0-h8374285_0.conda - sha256: ff2186a51d389c18423109af3abf6377d4ef5b1370a81ee5f8fb2e036d79cf4f - md5: 6a9739c1ce3f9714b705a655872b5a4d - depends: - - __glibc >=2.28,<3.0.a0 - - icu >=75.1,<76.0a0 - - libgcc >=13 - - libstdcxx >=13 - - libuv >=1.48.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - size: 21653106 - timestamp: 1726665120657 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda - sha256: 736a4738aba32a03401aa25c8f740e4afe4aea02bc06651b59b06f0fdc024fdf - md5: 3771a3a6abe5a8db8910d5ebf144811b - depends: - - __osx >=11.0 - - icu >=75.1,<76.0a0 - - libcxx >=17 - - libuv >=1.48.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - - zlib - license: MIT - license_family: MIT - purls: [] - size: 14859715 - timestamp: 1726671037225 -- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda - sha256: 6d74f0dbb91eb2049199ba801a3db67965f990aef44084f9ae51a1f70c2996f6 - md5: 6aa54ed90a643a11a005491ff316b1c4 - license: MIT - license_family: MIT - purls: [] - size: 25378221 - timestamp: 1726657153171 -- pypi: https://files.pythonhosted.org/packages/4c/79/73735a6a5dad6059c085f240a4e74c9270feccd2bc66e4d31b5ca01d329c/numpy-2.1.2-cp312-cp312-win_amd64.whl - name: numpy - version: 2.1.2 - sha256: 456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/9b/b4/e3c7e6fab0f77fff6194afa173d1f2342073d91b1d3b4b30b17c3fb4407a/numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: numpy - version: 2.1.2 - sha256: 6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b0/29/cb48a402ea879e645b16218718f3f7d9588a77d674a9dcf22e4c43487636/numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl - name: numpy - version: 2.1.2 - sha256: b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/c4/a7/af3329fda3c3ec31d9b650e42bbcd3422fc62a765cbb1405fde4177a0996/numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: numpy - version: 2.1.2 - sha256: 1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0 - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/oniguruma-6.9.9-hd590300_0.conda - sha256: dec1c78df7670d34880f71f75ac716f082d087494b4a2c6a90d5d75a82c933ed - md5: 77dab674d16c1525ebe65e67de30de0d - depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 246869 - timestamp: 1697485543293 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/oniguruma-6.9.9-h31becfc_0.conda - sha256: e21b1822736959ba434ebce452ee86844a11d918c8b1c48c71f15e9a932fd571 - md5: 475018b8e0b8720c985a185427f5bf13 - depends: - - libgcc-ng >=12 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 250005 - timestamp: 1697487236819 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda - sha256: 66632aeef5b74e15746161db8fa8b5150a191ab05823d7d2f1587bdf96674c7b - md5: 770c654e0d5bfa3aa1e6ac5440815cda - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 223231 - timestamp: 1697485732214 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda - sha256: 5600a0b82df042bd27d01e4e687187411561dfc11cc05143a08ce29b64bf2af2 - md5: 7f2e286780f072ed750df46dc2631138 - depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 341592 - timestamp: 1709159244431 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.2-h0d9d63b_0.conda - sha256: d83375856601bc67c11295b537548a937a6896ede9d0a51d78bf5e921ab07c6f - md5: fd2898519e839d5ceb778343f39a3176 - depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 - - libstdcxx-ng >=12 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 374964 - timestamp: 1709159226478 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda - sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 - md5: 5029846003f0bc14414b9128a1f7c84b - depends: - - libcxx >=16 - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 316603 - timestamp: 1709159627299 -- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda - sha256: dda71cbe094234ab208f3552dec1f4ca6f2e614175d010808d6cb66ecf0bc753 - md5: 7e7099ad94ac3b599808950cec30ad4e - depends: - - libpng >=1.6.43,<1.7.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libzlib >=1.2.13,<2.0.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: BSD-2-Clause - license_family: BSD - purls: [] - size: 237974 - timestamp: 1709159764160 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda - sha256: cee91036686419f6dd6086902acf7142b4916e1c4ba042e9ca23e151da012b6d - md5: 4d638782050ab6faa27275bed57e9b4e - depends: - - __glibc >=2.17,<3.0.a0 - - ca-certificates - - libgcc >=13 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2891789 - timestamp: 1725410790053 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.2-h86ecc28_0.conda - sha256: 4669d26dbf81e4d72093d8260f55d19d57204d82b1d9440be83d11d313b5990c - md5: 9e1e477b3f8ee3789297883faffa708b - depends: - - ca-certificates - - libgcc >=13 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 3428083 - timestamp: 1725412266679 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda - sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 - md5: 1773ebccdc13ec603356e8ff1db9e958 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - purls: [] - size: 2882450 - timestamp: 1725410638874 -- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda - sha256: a45c42f3577294e22ac39ddb6ef5a64fd5322e8a6725afefbf4f2b4109340bf9 - md5: 1dc86753693df5e3326bb8a85b74c589 + - pkg:pypi/mdurl?source=hash-mapping + size: 14680 + timestamp: 1704317789138 +- conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.5.0-pyhd8ed1ab_0.conda + sha256: 2315b7dba237e16b0e1b601725a8e03e062421e0be28d8a25dc35dd9bd93a342 + md5: 3364591bebd600979606791e1dff7cb6 depends: - - ca-certificates - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Apache-2.0 - license_family: Apache - purls: [] - size: 8396053 - timestamp: 1725412961673 -- pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl - name: outcome - version: 1.3.0.post0 - sha256: e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b - requires_dist: - - attrs>=19.2.0 - requires_python: '>=3.7' + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/more-itertools?source=hash-mapping + size: 57345 + timestamp: 1725630183289 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda sha256: 36aca948219e2c9fdd6d80728bcc657519e02f06c2703d8db3446aec67f51d81 md5: cbe1bb1f21567018ce595d9c2be0f0db @@ -3404,31 +2766,6 @@ packages: - pkg:pypi/pathspec?source=hash-mapping size: 41173 timestamp: 1702250135032 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-hba22ea6_2.conda - sha256: 1087716b399dab91cc9511d6499036ccdc53eb29a288bebcb19cf465c51d7c0d - md5: df359c09c41cd186fffb93a2d87aa6f5 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - libgcc-ng >=12 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 952308 - timestamp: 1723488734144 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.44-h070dd5b_2.conda - sha256: e9f4b912e48514771d477f2ee955f59d4ff4ef799c3d4d16e4d0f335ce91df67 - md5: 94022de9682cb1a0bb18a99cbc3541b3 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libgcc-ng >=12 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 884590 - timestamp: 1723488793100 - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda sha256: 90a09d134a4a43911b716d4d6eb9d169238aff2349056f7323d9db613812667e md5: 629f3203c99b32e0988910c93e77f3b6 @@ -3440,673 +2777,609 @@ packages: - pkg:pypi/pexpect?source=hash-mapping size: 53600 timestamp: 1706113273252 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.0.0-py312h7b63e92_0.conda - sha256: 13a464bea02c0df0199c20ef6bad24a6bc336aaf55bf8d6a133d0fe664463224 - md5: 385f46a4df6f97892503a841121a9acf +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda + sha256: d820e5358bcb117fa6286e55d4550c60b0332443df62121df839eab2d11c890b + md5: 6c78fbb8ddfd64bcb55b5cbafd2d2c43 depends: - - __glibc >=2.17,<3.0.a0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND + - python >=3.8,<3.13.0a0 + - setuptools + - wheel + license: MIT + license_family: MIT purls: - - pkg:pypi/pillow?source=hash-mapping - size: 41948418 - timestamp: 1729065846594 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-11.0.0-py312h5ab5af3_0.conda - sha256: 3cf43a5eb1f67f3a5f3ef1ec3a685f8767019cce24dbe46c4b76fee8a54fbacf - md5: 1c4bdfe659cfdedd372685ce2494e97b + - pkg:pypi/pip?source=hash-mapping + size: 1237976 + timestamp: 1724954490262 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda + sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f + md5: fd8f2b18b65bbf62e8f653100690c8d2 depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libgcc >=13 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND + - python >=3.8 + license: MIT + license_family: MIT purls: - - pkg:pypi/pillow?source=hash-mapping - size: 41756471 - timestamp: 1729068045876 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda - sha256: 727b4c3faecdb6f6809cf20c5f32d2df4af34e0d5b9146b7588383bcba7990e8 - md5: dc9b51fbd2b6f7fea9b5123458864dbb + - pkg:pypi/platformdirs?source=hash-mapping + size: 20625 + timestamp: 1726613611845 +- 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/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 + sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a + md5: 359eeb6536da0e687af562ed265ec263 + depends: + - python + license: ISC + purls: + - pkg:pypi/ptyprocess?source=hash-mapping + size: 16546 + timestamp: 1609419417991 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda + sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 + md5: 844d9eb3b43095b031874477f7d70088 + depends: + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/pycparser?source=hash-mapping + size: 105098 + timestamp: 1711811634025 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + purls: + - pkg:pypi/pygments?source=hash-mapping + size: 879295 + timestamp: 1714846885370 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda + sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 + md5: c03d61f31f38fdb9facf70c29958bf7a + 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=hash-mapping + size: 258293 + timestamp: 1725977334143 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda + sha256: ec2a69babe41085a5bcec4ef80b2d5bade2ca399d971f57894dfb96cf59a18d1 + md5: 50dd5529812447e2b4e2a5dd6a6f1655 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.8 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + purls: + - pkg:pypi/rich?source=hash-mapping + size: 185320 + timestamp: 1729623039134 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda + sha256: 6725235722095c547edd24275053c615158d6163f396550840aebd6e209e4738 + md5: d5cd48392c67fb6849ba459c2c2b671f + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/setuptools?source=hash-mapping + size: 777462 + timestamp: 1727249510532 +- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + md5: d08db09a552699ee9e7eec56b4eb3899 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/shellingham?source=hash-mapping + size: 14568 + timestamp: 1698144516278 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b + md5: 490730480d76cf9c8f8f2849719c6e2b + depends: + - python >=3.7 + license: Apache-2.0 + license_family: Apache + purls: + - pkg:pypi/sniffio?source=hash-mapping + size: 15064 + timestamp: 1708953086199 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda + sha256: 5e742ba856168b606ac3c814d247657b1c33b8042371f1a08000bdc5075bc0cc + md5: e977934e00b355ff55ed154904044727 + depends: + - python >=3.7 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli?source=hash-mapping + size: 18203 + timestamp: 1727974767524 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda + sha256: 25b88bb2c4e79be642d8e5b5738781404055cd596403a20511e6fa30f0c71585 + md5: 2c5eb5b3a0fd2c4787d8162f57da2a20 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomli-w?source=hash-mapping + size: 12323 + timestamp: 1728405537678 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda + sha256: 2ccfe8dafdc1f1af944bca6bdf28fa97b5fa6125d84b8895a4e918a020853c12 + md5: 0062a5f3347733f67b0f33ca48cc21dd + depends: + - python >=3.8 + license: MIT + license_family: MIT + purls: + - pkg:pypi/tomlkit?source=hash-mapping + size: 37279 + timestamp: 1723631592742 +- conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda + sha256: 591e4ffdc95660b9e596c15b65cad35a70b36235f02dbd089ccc198dd5af0e71 + md5: 501f6d3288160a31d99a2f1321e77393 depends: - - __osx >=11.0 - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.7.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - license: HPND + - python >=3.7 + license: Apache-2.0 + license_family: Apache purls: - - pkg:pypi/pillow?source=hash-mapping - size: 41737424 - timestamp: 1729065920347 -- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.4.0-py312h381445a_1.conda - sha256: 0b52e708ac4b72e6e1608de517cd4c8e6517dd525e23163a69bf73c7261399fc - md5: c57e54ae4acca720fb3a44bee93cb5b9 + - pkg:pypi/trove-classifiers?source=hash-mapping + size: 18429 + timestamp: 1729552033760 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda + sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb + md5: ebe6952715e1d5eb567eeebf25250fa7 depends: - - freetype >=2.12.1,<3.0a0 - - lcms2 >=2.16,<3.0a0 - - libjpeg-turbo >=3.0.0,<4.0a0 - - libtiff >=4.6.0,<4.8.0a0 - - libwebp-base >=1.4.0,<2.0a0 - - libxcb >=1.16,<2.0.0a0 - - libzlib >=1.3.1,<2.0a0 - - openjpeg >=2.5.2,<3.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - tk >=8.6.13,<8.7.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: HPND + - python >=3.8 + license: PSF-2.0 + license_family: PSF purls: - - pkg:pypi/pillow?source=hash-mapping - size: 42468305 - timestamp: 1726075694989 -- conda: https://conda.anaconda.org/conda-forge/noarch/pip-24.2-pyh8b19718_1.conda - sha256: d820e5358bcb117fa6286e55d4550c60b0332443df62121df839eab2d11c890b - md5: 6c78fbb8ddfd64bcb55b5cbafd2d2c43 + - pkg:pypi/typing-extensions?source=hash-mapping + size: 39888 + timestamp: 1717802653893 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda + sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf + md5: 8ac3367aafb1cc0a068483c580af8015 + license: LicenseRef-Public-Domain + purls: [] + size: 122354 + timestamp: 1728047496079 +- conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 + sha256: c8cbddd625340e1b00b53bafabc764526ee85f7ddb91018424bab0eea057796d + md5: 5bf074c9253a3bf914becfc50757406f depends: - - python >=3.8,<3.13.0a0 - - setuptools - - wheel + - click + - python >=3.6 license: MIT license_family: MIT purls: - - pkg:pypi/pip?source=hash-mapping - size: 1237976 - timestamp: 1724954490262 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.3.6-pyhd8ed1ab_0.conda - sha256: c81bdeadc4adcda216b2c7b373f0335f5c78cc480d1d55d10f21823590d7e46f - md5: fd8f2b18b65bbf62e8f653100690c8d2 + - pkg:pypi/userpath?source=hash-mapping + size: 17423 + timestamp: 1632758637093 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda + sha256: 18bae5ff9f02793ca56d295f0a5f1d4443623ee3be09a6805eb7d4b18245968c + md5: a6ed1227ba6ec37cfc2b25e6512f729f depends: + - distlib <1,>=0.3.7 + - filelock <4,>=3.12.2 + - platformdirs <5,>=3.9.1 - python >=3.8 license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs?source=hash-mapping - size: 20625 - timestamp: 1726613611845 -- pypi: https://files.pythonhosted.org/packages/31/dc/121be574222fc74d12ac42921728fb6ba8ac17264a1fdab1993263389082/playwright-1.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: playwright - version: 1.48.0 - sha256: 8ff8303409ebed76bed4c3d655340320b768817d900ba208b394fdd7d7939a5c - requires_dist: - - greenlet==3.1.1 - - pyee==12.0.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/45/88/b6459c93a8bc0b96e7a33b6744bbef2740a0b78b0534542a037d220427f0/playwright-1.48.0-py3-none-win_amd64.whl - name: playwright - version: 1.48.0 - sha256: e0e87b0c4dc8fce83c725dd851aec37bc4e882bb225ec8a96bd83cf32d4f1623 - requires_dist: - - greenlet==3.1.1 - - pyee==12.0.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/64/41/d77c47743800fbeb86657611e651e56a17cbb4ebfefa1da0318dc39092df/playwright-1.48.0-py3-none-macosx_11_0_arm64.whl - name: playwright - version: 1.48.0 - sha256: 7da2eb51a19c7f3b523e9faa9d98e7af92e52eb983a099979ea79c9668e3cbf7 - requires_dist: - - greenlet==3.1.1 - - pyee==12.0.0 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/f9/0c/8cde1a86a9a7449a0ba95197f42156198083be1749b717831fba16ab2b5f/playwright-1.48.0-py3-none-manylinux1_x86_64.whl - name: playwright - version: 1.48.0 - sha256: 8dabb80e62f667fe2640a8b694e26a7b884c0b4803f7514a3954fc849126227b - requires_dist: - - greenlet==3.1.1 - - pyee==12.0.0 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda - sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 - md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + - pkg:pypi/virtualenv?source=hash-mapping + size: 2952166 + timestamp: 1729243861344 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda + sha256: d828764736babb4322b8102094de38074dedfc71f5ff405c9dfee89191c14ebc + md5: d44e3b085abcaef02983c6305b84b584 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/linux-64/pnpm-9.12.2-h6417eb3_0.conda - sha256: 0caf7ddacb1d8adb16144a93cfaf7a70bff2f83e22cbaae4d3d91b71f28f9caf - md5: 711bc7fb6b870f4b5b180c181786d710 + - pkg:pypi/wheel?source=hash-mapping + size: 58585 + timestamp: 1722797131787 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda + sha256: 1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322 + md5: 4daaed111c05672ae669f7036ee5bba3 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - - nodejs >=22.6.0,<23.0a0 + - python >=3.8 license: MIT license_family: MIT + purls: + - pkg:pypi/zipp?source=hash-mapping + size: 21409 + timestamp: 1726248679175 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h99b78c6_7.conda + sha256: adfa71f158cbd872a36394c56c3568e6034aa55c623634b37a4836bd036e6b91 + md5: fc6948412dbbbe9a4c9ddbbcfe0a79ab + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD purls: [] - size: 3466596 - timestamp: 1729713864150 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pnpm-9.12.2-hbf5023e_0.conda - sha256: aa25e9d0085be78115c5104ff905f9930d8585901a7a8d7278083f87ff4f6d25 - md5: 15d1e168a06119b34c9bd39187ce2af3 + size: 122909 + timestamp: 1720974522888 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.8.30-hf0a4a13_0.conda + sha256: 2db1733f4b644575dbbdd7994a8f338e6ef937f5ebdb74acd557e9dda0211709 + md5: 40dec13fd8348dbe303e57be74bd3d35 + license: ISC + purls: [] + size: 158482 + timestamp: 1725019034582 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-1.17.1-py312h0fad829_0.conda + sha256: 8d91a0d01358b5c3f20297c6c536c5d24ccd3e0c2ddd37f9d0593d0f0070226f + md5: 19a5456f72f505881ba493979777b24e depends: - - libgcc >=13 - - libstdcxx >=13 - - nodejs >=22.6.0,<23.0a0 + - __osx >=11.0 + - libffi >=3.4,<4.0a0 + - pycparser + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 license: MIT license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 281206 + timestamp: 1725560813378 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.12.1-hadb7bae_2.conda + sha256: 791673127e037a2dc0eebe122dc4f904cb3f6e635bb888f42cbe1a76b48748d9 + md5: e6085e516a3e304ce41a8ee08b9b89ad + depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: GPL-2.0-only OR FTL purls: [] - size: 3516854 - timestamp: 1729713906302 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda - sha256: 6fd70df2e5e5a25aede2dfadd17530b2e7ecc0c41da43af89efd09dbbda8ca38 - md5: 8a157c984a8e384507438d62275868d5 + size: 596430 + timestamp: 1694616332835 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-75.1-hfee45f7_0.conda + sha256: 9ba12c93406f3df5ab0a43db8a4b4ef67a5871dfd401010fbe29b218b2cbe620 + md5: 5eb22c1d7b3fc4abb50d92d621583137 depends: - __osx >=11.0 - - libcxx >=17 - - nodejs >=22.9.0,<23.0a0 license: MIT license_family: MIT purls: [] - size: 3473615 - timestamp: 1729714099186 -- conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda - sha256: ce0c2e4268cd81308b8c069564b9f7885d9c21ddd8b83120f0fabc66d9ab58d3 - md5: c70ffc202c1f5d9223a13a12310c874d + size: 11857802 + timestamp: 1720853997952 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/jq-1.7.1-h93a5062_0.conda + sha256: e530cf5800e937bce7847a023a998db504e333a928b469c45a1752535593e762 + md5: dbf665694fb28d86d77cca18e5dd530c depends: - - nodejs >=22.9.0,<23.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - oniguruma 6.9.* + - oniguruma >=6.9.9,<6.10.0a0 license: MIT license_family: MIT purls: [] - size: 3319869 - timestamp: 1729714702980 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 - md5: b3c17d95b5a10c6e64a21fa17573e70e + size: 317604 + timestamp: 1702501287237 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda + sha256: 151e0c84feb7e0747fabcc85006b8973b22f5abbc3af76a9add0b0ef0320ebe4 + md5: 66f6c134e76fe13cce8a9ea5814b5dd5 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 license: MIT license_family: MIT purls: [] - size: 8252 - timestamp: 1726802366959 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba - md5: bb5a90c93e3bac3d5690acf76b4a6386 + size: 211959 + timestamp: 1701647962657 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + sha256: 6f068bb53dfb6147d3147d981bb851bb5477e769407ad4e6a68edf482fdcb958 + md5: de462d5aacda3b30721b512c5da4e742 + depends: + - libcxx >=13.0.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 215721 + timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.2-ha82da77_0.conda + sha256: 9c714110264f4fe824d40e11ad39b0eda65251f87826c81f4d67ccf8a3348d29 + md5: ba89ad7c5477e6a9d020020fcdadd37d depends: - - libgcc >=13 - license: MIT - license_family: MIT + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache purls: [] - size: 8342 - timestamp: 1726803319942 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 - md5: 415816daf82e0b23a736a069a75e9da7 + size: 521199 + timestamp: 1729038190391 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda + md5: 2d3e3f3d8ab315748420ef58d5a3ae0f depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 8381 - timestamp: 1726802424786 -- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 - sha256: bb5a6ddf1a609a63addd6d7b488b0f58d05092ea84e9203283409bff539e202a - md5: a1f820480193ea83582b13249a7e7bd9 + size: 54089 + timestamp: 1728177149927 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.3-hf9b8971_0.conda + sha256: 5cbe5a199fba14ade55457a468ce663aac0b54832c39aa54470b3889b4c75c4a + md5: 5f22f07c2ab2dea8c66fe9585a062c96 depends: - - m2w64-gcc-libs + - __osx >=11.0 + constrains: + - expat 2.6.3.* license: MIT license_family: MIT purls: [] - size: 6417 - timestamp: 1606147814351 -- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2 - sha256: fb31e006a25eb2e18f3440eb8d17be44c8ccfae559499199f73584566d0a444a - md5: 359eeb6536da0e687af562ed265ec263 - depends: - - python - license: ISC - purls: - - pkg:pypi/ptyprocess?source=hash-mapping - size: 16546 - timestamp: 1609419417991 -- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda - sha256: 406001ebf017688b1a1554b49127ca3a4ac4626ec0fd51dc75ffa4415b720b64 - md5: 844d9eb3b43095b031874477f7d70088 - depends: - - python >=3.8 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pycparser?source=hash-mapping - size: 105098 - timestamp: 1711811634025 -- pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl - name: pyee - version: 12.0.0 - sha256: 7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990 - requires_dist: - - typing-extensions - - build ; extra == 'dev' - - flake8 ; extra == 'dev' - - flake8-black ; extra == 'dev' - - pytest ; extra == 'dev' - - black ; extra == 'dev' - - isort ; extra == 'dev' - - jupyter-console ; extra == 'dev' - - mkdocs ; extra == 'dev' - - mkdocs-include-markdown-plugin ; extra == 'dev' - - mkdocstrings[python] ; extra == 'dev' - - sphinx ; extra == 'dev' - - toml ; extra == 'dev' - - tox ; extra == 'dev' - - trio ; extra == 'dev' - - twine ; extra == 'dev' - - twisted ; extra == 'dev' - - validate-pyproject[all] ; extra == 'dev' - - trio ; python_full_version >= '3.7' and extra == 'dev' - - trio-typing ; python_full_version >= '3.7' and extra == 'dev' - - pytest-asyncio ; python_full_version >= '3.4' and extra == 'dev' - - pytest-trio ; python_full_version >= '3.7' and extra == 'dev' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda - sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b - md5: b7f5c092b8f9800150d998a71b76d5a1 - depends: - - python >=3.8 - license: BSD-2-Clause - license_family: BSD - purls: - - pkg:pypi/pygments?source=hash-mapping - size: 879295 - timestamp: 1714846885370 -- pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl - name: pyodide-py - version: 0.26.3 - sha256: b63b6847c8906aa8f3c17df362135d0407aabf1d4b023557aed721d822e347a8 - requires_python: '>=3.12' -- pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl - name: pysocks - version: 1.7.1 - sha256: 2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 - requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.3-pyhd8ed1ab_0.conda - sha256: e99376d0068455712109d233f5790458ff861aeceb458bfda74e353338e4d815 - md5: c03d61f31f38fdb9facf70c29958bf7a - depends: - - colorama - - exceptiongroup >=1.0.0rc8 - - iniconfig - - packaging - - pluggy <2,>=1.5 - - python >=3.8 - - tomli >=1 - constrains: - - pytest-faulthandler >=2 + size: 63895 + timestamp: 1725568783033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 license: MIT license_family: MIT - purls: - - pkg:pypi/pytest?source=hash-mapping - size: 258293 - timestamp: 1725977334143 -- pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl - name: pytest-asyncio - version: 0.24.0 - sha256: a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b - requires_dist: - - pytest>=8.2,<9 - - sphinx>=5.3 ; extra == 'docs' - - sphinx-rtd-theme>=1.0 ; extra == 'docs' - - coverage>=6.2 ; extra == 'testing' - - hypothesis>=5.7.1 ; extra == 'testing' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl - name: pytest-pyodide - version: 0.58.3 - sha256: 6425d8ac868090da70337bdef33bd8a082a353a4ecdb89f5371bcf58ac7390e7 - requires_dist: - - hypothesis - - pexpect - - playwright - - pytest - - pytest-asyncio - - selenium - - tblib>=3 - - build ; extra == 'test' - - pytest-cov ; extra == 'test' - - requests ; extra == 'test' - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.7-hc5c86c4_0_cpython.conda - sha256: 674be31ff152d9f0e0fe16959a45e3803a730fc4f54d87df6a9ac4e6a698c41d - md5: 0515111a9cdf69f83278f7c197db9807 - depends: - - __glibc >=2.17,<3.0.a0 - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 + purls: [] + size: 39020 + timestamp: 1636488587153 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda + sha256: a42054eaa38e84fc1e5ab443facac4bbc9d1b6b6f23f54b7bf4f1eb687e1d993 + md5: 3ff1e053dc3a2b8e36b9bfa4256a58d1 constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 31574780 - timestamp: 1728059777603 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.7-h5d932e8_0_cpython.conda - sha256: 25570873d92d4d9490c6db780cc85e6c28bd3ff61dc1ece79f602cf82bc73bc1 - md5: e6cab21bb5787270388939cf41cc5f43 + size: 547541 + timestamp: 1694475104253 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.44-hc14010f_0.conda + sha256: 38f8759a3eb8060deabd4db41f0f023514d853e46ddcbd0ba21768fc4e563bb1 + md5: fb36e93f0ea6a6f5d2b99984f34b049e depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-aarch64 >=2.36.1 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libgcc >=13 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.46.1,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 + - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 + license: zlib-acknowledgement purls: [] - size: 13762126 - timestamp: 1728057461028 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda - sha256: 45d7ca2074aa92594bd2f91a9003b338cc1df8a46b9492b7fc8167110783c3ef - md5: e0d82e57ebb456077565e6d82cd4a323 + size: 263385 + timestamp: 1726234714421 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.0-hbaaea75_0.conda + sha256: 76aa4bbbaa2334689b16048f04ac4c7406e9bfb1f225ac7107fd2a73f85329cf + md5: 5bbe4802d5460b80620411fe1da8fec3 depends: - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 - libzlib >=1.3.1,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.3.2,<4.0a0 - - readline >=8.2,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 + license: Unlicense purls: [] - size: 12975439 - timestamp: 1728057819519 -- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda - sha256: 2308cfa9ec563360d29ced7fd13a6b60b9a7b3cf8961a95c78c69f486211d018 - md5: 21f1f7c6ccf6b747c5086d2422c230e1 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.6.3,<3.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.46.1,<4.0a0 + size: 837789 + timestamp: 1729592072314 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-hfce79cd_1.conda + sha256: 97ba24c74750b6e731b3fe0d2a751cda6148b4937d2cc3f72d43bf7b3885c39d + md5: b9abf45f7c64caf3303725f1aa0e9a4d + depends: + - __osx >=11.0 + - lerc >=4.0.0,<5.0a0 + - libcxx >=17 + - libdeflate >=1.22,<1.23.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libwebp-base >=1.4.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.3.2,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.12.* *_cp312 - license: Python-2.0 - purls: [] - size: 15987537 - timestamp: 1728057382072 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: d10e93d759931ffb6372b45d65ff34d95c6000c61a07e298d162a3bc2accebb0 - md5: 0424ae29b104430108f5218a66db7260 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 6238 - timestamp: 1723823388266 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 5ccdad9981753cc4a2d126e356673a21c0cd5b34e209cb8d476a3947d4ad9b39 - md5: 62b20f305498284a07dc6c45fd0e5c87 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD + - zstd >=1.5.6,<1.6.0a0 + license: HPND purls: [] - size: 6329 - timestamp: 1723823366253 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 - md5: b76f9b1c862128e56ac7aa8cd2333de9 - constrains: - - python 3.12.* *_cpython - license: BSD-3-Clause - license_family: BSD + size: 366323 + timestamp: 1728232400072 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.49.2-h7ab814d_0.conda + sha256: 0e5176af1e788ad5006cf261c4ea5a288a935fda48993b0240ddd2e562dc3d02 + md5: 4bc348e3a1a74d20a3f9beb866d75e0a + depends: + - __osx >=11.0 + license: MIT + license_family: MIT purls: [] - size: 6278 - timestamp: 1723823099686 -- conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda - build_number: 5 - sha256: 9486662af81a219e96d343449eff242f38d7c5128ced5ce5acf85857265058d6 - md5: e8681f534453af7afab4cd2bc1423eec + size: 410500 + timestamp: 1729322654121 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.4.0-h93a5062_0.conda + sha256: 0d4bad713a512d79bfeb4d61821f447afab8b0792aca823f505ce6b195e9fde5 + md5: c0af0edfebe780b19940e94871f1a765 constrains: - - python 3.12.* *_cpython + - libwebp 1.4.0 license: BSD-3-Clause license_family: BSD purls: [] - size: 6730 - timestamp: 1723823139725 -- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py312h2e8e312_1.conda - sha256: 3e3b97740b4ec2f54debf7bfdbaa9a81a7aabd4549051b926de91d05304c4948 - md5: c5f1cb65c56ec74687801960f8a31eb5 - depends: - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/pywin32-ctypes?source=hash-mapping - size: 57449 - timestamp: 1727282288065 -- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 - md5: 47d31b792659ce70f470b5c82fdfb7a4 + size: 287750 + timestamp: 1713200194013 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT purls: [] - size: 281456 - timestamp: 1679532220005 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda - sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd - md5: 105eb1e16bf83bfb2eb380a48032b655 + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 depends: - - libgcc-ng >=12 - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other purls: [] - size: 294092 - timestamp: 1679532238805 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 - md5: 8cbb776a2f641b943d413b3e19df71f4 + size: 46438 + timestamp: 1727963202283 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h7bae524_1.conda + sha256: 27d0b9ff78ad46e1f3a6c96c479ab44beda5f96def88e2fe626e0a49429d8afc + md5: cb2b0ea909b97b3d70cd3921d1445e1a depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL + - __osx >=11.0 + license: X11 AND BSD-3-Clause purls: [] - size: 250351 - timestamp: 1679532511311 -- conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.9.3-pyhd8ed1ab_0.conda - sha256: ec2a69babe41085a5bcec4ef80b2d5bade2ca399d971f57894dfb96cf59a18d1 - md5: 50dd5529812447e2b4e2a5dd6a6f1655 + size: 802321 + timestamp: 1724658775723 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nodejs-22.9.0-h08fde81_0.conda + sha256: 736a4738aba32a03401aa25c8f740e4afe4aea02bc06651b59b06f0fdc024fdf + md5: 3771a3a6abe5a8db8910d5ebf144811b depends: - - markdown-it-py >=2.2.0 - - pygments >=2.13.0,<3.0.0 - - python >=3.8 - - typing_extensions >=4.0.0,<5.0.0 + - __osx >=11.0 + - icu >=75.1,<76.0a0 + - libcxx >=17 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - zlib license: MIT license_family: MIT - purls: - - pkg:pypi/rich?source=hash-mapping - size: 185320 - timestamp: 1729623039134 -- conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.3.3-py312h7900ff3_3.conda - sha256: c6d5d0bc7fb6cbfa3b8be8f2399a3c1308b3392a4e20bd1a0f29a828fda5ab20 - md5: 4840da9db2808db946a0d979603c6de4 + purls: [] + size: 14859715 + timestamp: 1726671037225 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/oniguruma-6.9.9-h93a5062_0.conda + sha256: 66632aeef5b74e15746161db8fa8b5150a191ab05823d7d2f1587bdf96674c7b + md5: 770c654e0d5bfa3aa1e6ac5440815cda + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 223231 + timestamp: 1697485732214 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.2-h9f1df11_0.conda + sha256: 472d6eaffc1996e6af35ec8e91c967f472a536a470079bfa56383cc0dbf4d463 + md5: 5029846003f0bc14414b9128a1f7c84b depends: - - cryptography - - dbus - - jeepney >=0.6 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause + - libcxx >=16 + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-2-Clause license_family: BSD - purls: - - pkg:pypi/secretstorage?source=hash-mapping - size: 31601 - timestamp: 1725915741329 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/secretstorage-3.3.3-py312h8025657_3.conda - sha256: fd6bc45ba0c6bb097ad98037ad8d2ddf2449f28c2eedf57dfff54eeceefe90c6 - md5: 4ae02e3717828f5e92dfae068845afdd + purls: [] + size: 316603 + timestamp: 1709159627299 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.2-h8359307_0.conda + sha256: 940fa01c4dc6152158fe8943e05e55a1544cab639df0994e3b35937839e4f4d1 + md5: 1773ebccdc13ec603356e8ff1db9e958 depends: - - cryptography - - dbus - - jeepney >=0.6 + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2882450 + timestamp: 1725410638874 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.0.0-py312haf37ca6_0.conda + sha256: 727b4c3faecdb6f6809cf20c5f32d2df4af34e0d5b9146b7588383bcba7990e8 + md5: dc9b51fbd2b6f7fea9b5123458864dbb + depends: + - __osx >=11.0 + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.7.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD + - tk >=8.6.13,<8.7.0a0 + license: HPND purls: - - pkg:pypi/secretstorage?source=hash-mapping - size: 31394 - timestamp: 1725917363210 -- pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl - name: selenium - version: 4.25.0 - sha256: 3798d2d12b4a570bc5790163ba57fef10b2afee958bf1d80f2a3cf07c4141f33 - requires_dist: - - urllib3[socks]>=1.26,<3 - - trio~=0.17 - - trio-websocket~=0.9 - - certifi>=2021.10.8 - - typing-extensions~=4.9 - - websocket-client~=1.8 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-75.1.0-pyhd8ed1ab_0.conda - sha256: 6725235722095c547edd24275053c615158d6163f396550840aebd6e209e4738 - md5: d5cd48392c67fb6849ba459c2c2b671f + - pkg:pypi/pillow?source=hash-mapping + size: 41737424 + timestamp: 1729065920347 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pnpm-9.12.2-hef028c3_0.conda + sha256: 6fd70df2e5e5a25aede2dfadd17530b2e7ecc0c41da43af89efd09dbbda8ca38 + md5: 8a157c984a8e384507438d62275868d5 depends: - - python >=3.8 + - __osx >=11.0 + - libcxx >=17 + - nodejs >=22.9.0,<23.0a0 license: MIT license_family: MIT - purls: - - pkg:pypi/setuptools?source=hash-mapping - size: 777462 - timestamp: 1727249510532 -- conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda - sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb - md5: d08db09a552699ee9e7eec56b4eb3899 + purls: [] + size: 3473615 + timestamp: 1729714099186 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 depends: - - python >=3.7 + - __osx >=11.0 license: MIT license_family: MIT - purls: - - pkg:pypi/shellingham?source=hash-mapping - size: 14568 - timestamp: 1698144516278 -- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda - sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b - md5: 490730480d76cf9c8f8f2849719c6e2b - depends: - - python >=3.7 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/sniffio?source=hash-mapping - size: 15064 - timestamp: 1708953086199 -- pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl - name: sortedcontainers - version: 2.4.0 - sha256: a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 -- pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl - name: tblib - version: 3.0.0 - sha256: 80a6c77e59b55e83911e1e607c649836a69c103963c5f28a46cbeef44acf8129 - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e - md5: d453b98d9c83e71da0741bb0ff4d76bc + purls: [] + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.7-h739c21a_0_cpython.conda + sha256: 45d7ca2074aa92594bd2f91a9003b338cc1df8a46b9492b7fc8167110783c3ef + md5: e0d82e57ebb456077565e6d82cd4a323 depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 12975439 + timestamp: 1728057819519 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 49d624e4b809c799d2bf257b22c23cf3fc4460f5570d9a58e7ad86350aeaa1f4 + md5: b76f9b1c862128e56ac7aa8cd2333de9 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause license_family: BSD purls: [] - size: 3318875 - timestamp: 1699202167581 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda - sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 - md5: f75105e0585851f818e0009dd1dde4dc + size: 6278 + timestamp: 1723823099686 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: TCL - license_family: BSD + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL purls: [] - size: 3351802 - timestamp: 1695506242997 + size: 250351 + timestamp: 1679532511311 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 md5: b50a57ba89c32b62428b71a875291c9b @@ -4117,522 +3390,592 @@ packages: purls: [] size: 3145523 timestamp: 1699202432999 -- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 - md5: fc048363eb8f03cd1737600a5d08aafe +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda + sha256: f9530088e0a7319946c0dbc51c2e82bfa964fa3cb548e986053c7d8b6698056d + md5: 8beaeac747a7887e458e7de7e3d9fd6d depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: TCL - license_family: BSD + - __osx >=11.0 + - libcxx >=17 + constrains: + - __osx >=11.0 + license: Apache-2.0 OR MIT purls: [] - size: 3503410 - timestamp: 1699202577803 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.2-pyhd8ed1ab_0.conda - sha256: 5e742ba856168b606ac3c814d247657b1c33b8042371f1a08000bdc5075bc0cc - md5: e977934e00b355ff55ed154904044727 - depends: - - python >=3.7 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli?source=hash-mapping - size: 18203 - timestamp: 1727974767524 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.1.0-pyhd8ed1ab_0.conda - sha256: 25b88bb2c4e79be642d8e5b5738781404055cd596403a20511e6fa30f0c71585 - md5: 2c5eb5b3a0fd2c4787d8162f57da2a20 - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/tomli-w?source=hash-mapping - size: 12323 - timestamp: 1728405537678 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.2-pyha770c72_0.conda - sha256: 2ccfe8dafdc1f1af944bca6bdf28fa97b5fa6125d84b8895a4e918a020853c12 - md5: 0062a5f3347733f67b0f33ca48cc21dd + size: 8421278 + timestamp: 1729775629422 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda + sha256: 7113618021cf6c80831a429b2ebb9d639f3c43cf7fe2257d235dc6ae0ab43289 + md5: 7e0125f8fb619620a0011dc9297e2493 depends: - - python >=3.8 + - __osx >=11.0 license: MIT license_family: MIT - purls: - - pkg:pypi/tomlkit?source=hash-mapping - size: 37279 - timestamp: 1723631592742 -- pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl - name: trio - version: 0.27.0 - sha256: 68eabbcf8f457d925df62da780eff15ff5dc68fd6b367e2dde59f7aaf2a0b884 - requires_dist: - - attrs>=23.2.0 - - sortedcontainers - - idna - - outcome - - sniffio>=1.3.0 - - cffi>=1.14 ; implementation_name != 'pypy' and os_name == 'nt' - - exceptiongroup ; python_full_version < '3.11' - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl - name: trio-websocket - version: 0.11.1 - sha256: 520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 - requires_dist: - - trio>=0.11 - - wsproto>=0.14 - - exceptiongroup ; python_full_version < '3.11' - requires_python: '>=3.7' -- conda: https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2024.10.21.16-pyhd8ed1ab_0.conda - sha256: 591e4ffdc95660b9e596c15b65cad35a70b36235f02dbd089ccc198dd5af0e71 - md5: 501f6d3288160a31d99a2f1321e77393 - depends: - - python >=3.7 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/trove-classifiers?source=hash-mapping - size: 18429 - timestamp: 1729552033760 -- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda - sha256: 0fce54f8ec3e59f5ef3bb7641863be4e1bf1279623e5af3d3fa726e8f7628ddb - md5: ebe6952715e1d5eb567eeebf25250fa7 - depends: - - python >=3.8 - license: PSF-2.0 - license_family: PSF - purls: - - pkg:pypi/typing-extensions?source=hash-mapping - size: 39888 - timestamp: 1717802653893 -- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024b-hc8b5060_0.conda - sha256: 4fde5c3008bf5d2db82f2b50204464314cc3c91c1d953652f7bd01d9e52aefdf - md5: 8ac3367aafb1cc0a068483c580af8015 - license: LicenseRef-Public-Domain - purls: [] - size: 122354 - timestamp: 1728047496079 -- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda - sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 - md5: 6797b005cd0f439c4c5c9ac565783700 - constrains: - - vs2015_runtime >=14.29.30037 - license: LicenseRef-MicrosoftWindowsSDK10 purls: [] - size: 559710 - timestamp: 1728377334097 -- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl - name: urllib3 - version: 2.2.3 - sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac - requires_dist: - - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' - - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' - - h2>=4,<5 ; extra == 'h2' - - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' - - zstandard>=0.18.0 ; extra == 'zstd' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/userpath-1.7.0-pyhd8ed1ab_0.tar.bz2 - sha256: c8cbddd625340e1b00b53bafabc764526ee85f7ddb91018424bab0eea057796d - md5: 5bf074c9253a3bf914becfc50757406f + size: 13515 + timestamp: 1727034783560 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda + sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 + md5: 77c447f48cab5d3a15ac224edb86a968 depends: - - click - - python >=3.6 + - __osx >=11.0 license: MIT license_family: MIT - purls: - - pkg:pypi/userpath?source=hash-mapping - size: 17423 - timestamp: 1632758637093 -- conda: https://conda.anaconda.org/conda-forge/linux-64/uv-0.4.26-h0f3a69f_0.conda - sha256: 4f05a61c3c3127ce7e487001215d20f49da0563fa4335462b2f6cc0028bb265b - md5: c4316a4c2b47ae154259fa5caffd53f1 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 - constrains: - - __glibc >=2.17 - license: Apache-2.0 OR MIT purls: [] - size: 9446110 - timestamp: 1729774270770 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uv-0.4.26-h2016286_0.conda - sha256: f63f7ab9e410899daf66e7ff343020b4bb8cf5f52413acca0dcb95ae9b04f854 - md5: f3f6ad5ca3aca4e0e5fd0f7f5f156093 + size: 18487 + timestamp: 1727795205022 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 235693 + timestamp: 1660346961024 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 + md5: e3170d898ca6cb48f1bb567afb92f775 depends: - - libgcc >=13 - - libstdcxx >=13 - constrains: - - __glibc >=2.17 - license: Apache-2.0 OR MIT + - __osx >=11.0 + - libzlib 1.3.1 h8359307_2 + license: Zlib + license_family: Other purls: [] - size: 8929757 - timestamp: 1729774724816 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uv-0.4.26-h41fe3af_0.conda - sha256: f9530088e0a7319946c0dbc51c2e82bfa964fa3cb548e986053c7d8b6698056d - md5: 8beaeac747a7887e458e7de7e3d9fd6d + size: 77606 + timestamp: 1727963209370 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda + sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb + md5: a4cde595509a7ad9c13b1a3809bcfe51 depends: - __osx >=11.0 - - libcxx >=17 - constrains: + - cffi >=1.11 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - zstd >=1.5.6,<1.5.7.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/zstandard?source=hash-mapping + size: 330788 + timestamp: 1725305806565 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda + sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 + md5: d96942c06c3e84bfcc5efb038724a7fd + depends: - __osx >=11.0 - license: Apache-2.0 OR MIT + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD purls: [] - size: 8421278 - timestamp: 1729775629422 -- conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda - sha256: 57691a29d941ffbbae312c6dedccc303b6303e58487803e84db20a3304c0d269 - md5: a09f8193bdf8d1512340e8ec2432e82d + size: 405089 + timestamp: 1714723101397 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - license: Apache-2.0 OR MIT - purls: [] - size: 10344775 - timestamp: 1729775595022 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda - sha256: 2a47c5bd8bec045959afada7063feacd074ad66b170c1ea92dd139b389fcf8fd - md5: 311c9ba1dfdd2895a8cb08346ff26259 - depends: - - vc14_runtime >=14.38.33135 - track_features: - - vc14 - license: BSD-3-Clause + license: bzip2-1.0.6 license_family: BSD purls: [] - size: 17447 - timestamp: 1728400826998 -- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda - sha256: 4c669c65007f88a7cdd560192f7e6d5679d191ac71610db724e18b2410964d64 - md5: ce23a4b980ee0556a118ed96550ff3f3 + size: 54927 + timestamp: 1720974860185 +- conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 + md5: 4c4fd67c18619be5aa65dc5b6c72e490 + license: ISC + purls: [] + size: 158773 + timestamp: 1725019107649 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-1.17.1-py312h4389bb4_0.conda + sha256: ac007bf5fd56d13e16d95eea036433012f2e079dc015505c8a79efebbad1fcbc + md5: 08310c1a22ef957d537e547f8d484f92 + depends: + - pycparser + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + purls: + - pkg:pypi/cffi?source=hash-mapping + size: 288142 + timestamp: 1725560896359 +- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-hdaf720e_2.conda + sha256: 2c53ee8879e05e149a9e525481d36adfd660a6abda26fd731376fa64ff03e728 + md5: 3761b23693f768dc75a8fd0a73ca053f depends: + - libpng >=1.6.39,<1.7.0a0 + - libzlib >=1.2.13,<2.0.0a0 - ucrt >=10.0.20348.0 - constrains: - - vs2015_runtime 14.40.33810.* *_22 - license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime - license_family: Proprietary + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: GPL-2.0-only OR FTL purls: [] - size: 750719 - timestamp: 1728401055788 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.27.0-pyhd8ed1ab_0.conda - sha256: 18bae5ff9f02793ca56d295f0a5f1d4443623ee3be09a6805eb7d4b18245968c - md5: a6ed1227ba6ec37cfc2b25e6512f729f + size: 510306 + timestamp: 1694616398888 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.16-h67d730c_0.conda + sha256: f9fd9e80e46358a57d9bb97b1e37a03da4022143b019aa3c4476d8a7795de290 + md5: d3592435917b62a8becff3a60db674f6 depends: - - distlib <1,>=0.3.7 - - filelock <4,>=3.12.2 - - platformdirs <5,>=3.9.1 - - python >=3.8 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - purls: - - pkg:pypi/virtualenv?source=hash-mapping - size: 2952166 - timestamp: 1729243861344 -- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda - sha256: 80aa9932203d65a96f817b8be4fafc176fb2b3fe6cf6899ede678b8f0317fbff - md5: 8c6b061d44cafdfc8e8c6eb5f100caf0 + purls: [] + size: 507632 + timestamp: 1701648249706 +- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 + sha256: f4f39d7f6a2f9b407f8fb567a6c25755270421731d70f0ff331f5de4fa367488 + md5: 1900cb3cab5055833cfddb0ba233b074 depends: - - vc14_runtime >=14.40.33810 - license: BSD-3-Clause - license_family: BSD + - vc >=14.2,<15 + - vs2015_runtime >=14.29.30037 + license: Apache-2.0 + license_family: Apache purls: [] - size: 17453 - timestamp: 1728400827536 -- pypi: https://files.pythonhosted.org/packages/54/83/83d598af08eb297f1a644e678ce2d6c335f015c9f3c8c2532e289801293b/wasmtime-38.0.0-py3-none-macosx_11_0_arm64.whl - name: wasmtime - version: 38.0.0 - sha256: 479529425f68cd69f8f4c369abf50d6f44a0e2395f5ce2b9a506c8a695aef65b - requires_dist: - - importlib-resources>=5.10 - - coverage ; extra == 'testing' - - pycparser ; extra == 'testing' - - pytest-mypy ; extra == 'testing' - - pytest ; extra == 'testing' - - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/54/de/7b8898c9e7f73a2f4c20b621279143cfc27836dba0db676e9a923cd0a461/wasmtime-38.0.0-py3-none-manylinux1_x86_64.whl - name: wasmtime - version: 38.0.0 - sha256: f6c87bfe9de9a35de5b28fbdac192e2526486e3d0a3be48e107789cf117925fd - requires_dist: - - importlib-resources>=5.10 - - coverage ; extra == 'testing' - - pycparser ; extra == 'testing' - - pytest-mypy ; extra == 'testing' - - pytest ; extra == 'testing' - - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/66/99/6da689c6534b16b2e6959321533f0000228854e5f4211eb00bfa7b6bcebc/wasmtime-38.0.0-py3-none-win_amd64.whl - name: wasmtime - version: 38.0.0 - sha256: c0f7ac800575e592e74ce7d111e04ad7b3dbbff421bfac00c94432300ee39bfe - requires_dist: - - importlib-resources>=5.10 - - coverage ; extra == 'testing' - - pycparser ; extra == 'testing' - - pytest-mypy ; extra == 'testing' - - pytest ; extra == 'testing' - - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fc/7b/8e6f9670ea1476735517b28b99b2595e9000d46ee0a276d0e0b547cc928c/wasmtime-38.0.0-py3-none-manylinux2014_aarch64.whl - name: wasmtime - version: 38.0.0 - sha256: d5455bd83e82b04db32c226524b1c084a71d5d9d4ada3c5d0cf5cccaf2563253 - requires_dist: - - importlib-resources>=5.10 - - coverage ; extra == 'testing' - - pycparser ; extra == 'testing' - - pytest-mypy ; extra == 'testing' - - pytest ; extra == 'testing' - - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl - name: websocket-client - version: 1.8.0 - sha256: 17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 - requires_dist: - - sphinx>=6.0 ; extra == 'docs' - - sphinx-rtd-theme>=1.1.0 ; extra == 'docs' - - myst-parser>=2.0.0 ; extra == 'docs' - - python-socks ; extra == 'optional' - - wsaccel ; extra == 'optional' - - websockets ; extra == 'test' - requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.44.0-pyhd8ed1ab_0.conda - sha256: d828764736babb4322b8102094de38074dedfc71f5ff405c9dfee89191c14ebc - md5: d44e3b085abcaef02983c6305b84b584 + size: 194365 + timestamp: 1657977692274 +- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.22-h2466b09_0.conda + sha256: 579c634b7de8869cb1d76eccd4c032dc275d5a017212128502ea4dc828a5b361 + md5: a3439ce12d4e3cd887270d9436f9a4c8 depends: - - python >=3.8 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - purls: - - pkg:pypi/wheel?source=hash-mapping - size: 58585 - timestamp: 1722797131787 -- pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl - name: wsproto - version: 1.2.0 - sha256: b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 - requires_dist: - - h11>=0.9.0,<1 - requires_python: '>=3.7.0' -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hb9d3cd8_1.conda - sha256: 532a046fee0b3a402db867b6ec55c84ba4cdedb91d817147c8feeae9766be3d6 - md5: 77cbc488235ebbaab2b6e912d3934bae + purls: [] + size: 155506 + timestamp: 1728177485361 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda + sha256: 9543965d155b8da96fc67dd81705fe5c2571c7c00becc8de5534c850393d4e3c + md5: 21415fbf4d0de6767a621160b43e5dea depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - expat 2.6.3.* license: MIT license_family: MIT purls: [] - size: 14679 - timestamp: 1727034741045 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.11-h86ecc28_1.conda - sha256: a00c4c6054209c84fb460c5e4ae7193c335a9ee1851645c9ad59312438e853f7 - md5: c5f72a733c461aa7785518d29b997cc8 + size: 138992 + timestamp: 1725569106114 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 depends: - - libgcc >=13 + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 license: MIT license_family: MIT purls: [] - size: 15690 - timestamp: 1727036097294 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.11-hd74edd7_1.conda - sha256: 7113618021cf6c80831a429b2ebb9d639f3c43cf7fe2257d235dc6ae0ab43289 - md5: 7e0125f8fb619620a0011dc9297e2493 + size: 42063 + timestamp: 1636489106777 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.0.0-hcfcfb64_1.conda + sha256: 4e7808e3098b4b4ed7e287f63bb24f9045cc4d95bfd39f0db870fc2837d74dff + md5: 3f1b948619c45b1ca714d60c7389092c depends: - - __osx >=11.0 - license: MIT - license_family: MIT + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 13515 - timestamp: 1727034783560 -- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda - sha256: 8c5b976e3b36001bdefdb41fb70415f9c07eff631f1f0155f3225a7649320e77 - md5: c46ba8712093cb0114404ae8a7582e1a + size: 822966 + timestamp: 1694475223854 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.44-h3ca93ac_0.conda + sha256: 0d3d6ff9225f6918ac225e3839c0d91e5af1da08a4ebf59cac1bfd86018db945 + md5: 639ac6b55a40aa5de7b8c1b4d78f9e81 + depends: + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: zlib-acknowledgement + purls: [] + size: 348933 + timestamp: 1726235196095 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.47.0-h2466b09_0.conda + sha256: 4f3cd0477c831eab48fb7fa3ed91d918aeb644fad9b4014726d445339750cdcc + md5: 964bef59135d876c596ae67b3315e812 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + purls: [] + size: 884970 + timestamp: 1729592254351 +- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.0-hfc51747_1.conda + sha256: 902cb9f7f54d17dcfd54ce050b1ce2bc944b9bbd1748913342c2ea1e1140f8bb + md5: eac317ed1cc6b9c0af0c27297e364665 + depends: + - lerc >=4.0.0,<5.0a0 + - libdeflate >=1.22,<1.23.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: HPND + purls: [] + size: 978865 + timestamp: 1728232594877 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.4.0-hcfcfb64_0.conda + sha256: d0ca51cb1de9192be9a3238e71fbcca5a535619c499c4f4c9b2ed41c14d36770 + md5: abd61d0ab127ec5cd68f62c2969e6f34 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - libwebp 1.4.0 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 274359 + timestamp: 1713200524021 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.16-h013a479_1.conda + sha256: abae56e12a4c62730b899fdfb82628a9ac171c4ce144fc9f34ae024957a82a0e + md5: f0b599acdc82d5bc7e3b105833e7c5c8 depends: - m2w64-gcc-libs - m2w64-gcc-libs-core + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp license: MIT license_family: MIT purls: [] - size: 51297 - timestamp: 1684638355740 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda - sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee - md5: 8035c64cb77ed555e3f150b7b3972480 + size: 989459 + timestamp: 1724419883091 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 + md5: 41fbfac52c601159df6c01f875de31b9 depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + purls: [] + size: 55476 + timestamp: 1727963768015 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 + md5: 066552ac6b907ec6d72c0ddab29050dc + depends: + - m2w64-gcc-libs-core + - msys2-conda-epoch ==20160418 + license: GPL, LGPL, FDL, custom + purls: [] + size: 350687 + timestamp: 1608163451316 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa + md5: fe759119b8b3bfa720b8762c6fdc35de + depends: + - m2w64-gcc-libgfortran + - m2w64-gcc-libs-core + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + purls: [] + size: 532390 + timestamp: 1608163512830 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 + md5: 4289d80fb4d272f1f3b56cfe87ac90bd + depends: + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + purls: [] + size: 219240 + timestamp: 1608163481341 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 + md5: 53a1c73e1e3d185516d7e3af177596d9 + depends: + - msys2-conda-epoch ==20160418 + license: LGPL3 + purls: [] + size: 743501 + timestamp: 1608163782057 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-jq-1.6-h301d43c_0.tar.bz2 + sha256: d722a8c06f44dfb5f357608e6e1d40d1f1c926316bbee5d1e71d93823554646b + md5: 209cbf1b222dc774cb29ce57796500b3 + depends: + - m2w64-gcc-libs + - m2w64-oniguruma license: MIT license_family: MIT purls: [] - size: 19901 - timestamp: 1727794976192 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-h57736b2_0.conda - sha256: efcc150da5926cf244f757b8376d96a4db78bc15b8d90ca9f56ac6e75755971f - md5: 25a5a7b797fe6e084e04ffe2db02fc62 + size: 424702 + timestamp: 1591860215369 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 + md5: 774130a326dee16f1ceb05cc687ee4f0 depends: - - libgcc >=13 + - msys2-conda-epoch ==20160418 + license: MIT, BSD + purls: [] + size: 31928 + timestamp: 1608166099896 +- conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-oniguruma-6.9.5-h301d43c_0.tar.bz2 + sha256: 523edeac9788aa61243bd2ceb7b8bdb1a86b68c9f7f1aeb933085893d2886cc3 + md5: 61c9b808f92724106a63dd7b50979d6b + depends: + - m2w64-gcc-libs + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 426599 + timestamp: 1591828659130 +- conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 + md5: b0309b72560df66f71a9d5e34a5efdfa + purls: [] + size: 3227 + timestamp: 1608166968312 +- conda: https://conda.anaconda.org/conda-forge/win-64/nodejs-22.9.0-h57928b3_0.conda + sha256: 6d74f0dbb91eb2049199ba801a3db67965f990aef44084f9ae51a1f70c2996f6 + md5: 6aa54ed90a643a11a005491ff316b1c4 license: MIT license_family: MIT purls: [] - size: 20615 - timestamp: 1727796660574 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hd74edd7_0.conda - sha256: 9939a166d780700d81023546759102b33fdc2c5f11ef09f5f66c77210fd334c8 - md5: 77c447f48cab5d3a15ac224edb86a968 + size: 25378221 + timestamp: 1726657153171 +- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.2-h3d672ee_0.conda + sha256: dda71cbe094234ab208f3552dec1f4ca6f2e614175d010808d6cb66ecf0bc753 + md5: 7e7099ad94ac3b599808950cec30ad4e + depends: + - libpng >=1.6.43,<1.7.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + purls: [] + size: 237974 + timestamp: 1709159764160 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda + sha256: a45c42f3577294e22ac39ddb6ef5a64fd5322e8a6725afefbf4f2b4109340bf9 + md5: 1dc86753693df5e3326bb8a85b74c589 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 8396053 + timestamp: 1725412961673 +- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-10.4.0-py312h381445a_1.conda + sha256: 0b52e708ac4b72e6e1608de517cd4c8e6517dd525e23163a69bf73c7261399fc + md5: c57e54ae4acca720fb3a44bee93cb5b9 + depends: + - freetype >=2.12.1,<3.0a0 + - lcms2 >=2.16,<3.0a0 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libtiff >=4.6.0,<4.8.0a0 + - libwebp-base >=1.4.0,<2.0a0 + - libxcb >=1.16,<2.0.0a0 + - libzlib >=1.3.1,<2.0a0 + - openjpeg >=2.5.2,<3.0a0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - tk >=8.6.13,<8.7.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: HPND + purls: + - pkg:pypi/pillow?source=hash-mapping + size: 42468305 + timestamp: 1726075694989 +- conda: https://conda.anaconda.org/conda-forge/win-64/pnpm-9.12.2-haa868a1_0.conda + sha256: ce0c2e4268cd81308b8c069564b9f7885d9c21ddd8b83120f0fabc66d9ab58d3 + md5: c70ffc202c1f5d9223a13a12310c874d depends: - - __osx >=11.0 + - nodejs >=22.9.0,<23.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT purls: [] - size: 18487 - timestamp: 1727795205022 -- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 - sha256: f51205d33c07d744ec177243e5d9b874002910c731954f2c8da82459be462b93 - md5: 46878ebb6b9cbd8afcf8088d7ef00ece + size: 3319869 + timestamp: 1729714702980 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 + sha256: bb5a6ddf1a609a63addd6d7b488b0f58d05092ea84e9203283409bff539e202a + md5: a1f820480193ea83582b13249a7e7bd9 depends: - m2w64-gcc-libs license: MIT license_family: MIT purls: [] - size: 67908 - timestamp: 1610072296570 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 - md5: 2161070d867d1b1204ea749c8eec4ef0 - depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 418368 - timestamp: 1660346797927 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 - sha256: 93f58a7b393adf41fa007ac8c55978765e957e90cd31877ece1e5a343cb98220 - md5: 83baad393a31d59c20b63ba4da6592df + size: 6417 + timestamp: 1606147814351 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.7-hce54a09_0_cpython.conda + sha256: 2308cfa9ec563360d29ced7fd13a6b60b9a7b3cf8961a95c78c69f486211d018 + md5: 21f1f7c6ccf6b747c5086d2422c230e1 depends: - - libgcc-ng >=12 - license: LGPL-2.1 and GPL-2.0 - purls: [] - size: 440555 - timestamp: 1660348056328 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec - md5: 39c6b54e94014701dd157f4f576ed211 - license: LGPL-2.1 and GPL-2.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.3,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 purls: [] - size: 235693 - timestamp: 1660346961024 -- conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 - md5: 515d77642eaa3639413c6b1bc3f94219 - depends: - - vc >=14.1,<15 - - vs2015_runtime >=14.16.27033 - license: LGPL-2.1 and GPL-2.0 + size: 15987537 + timestamp: 1728057382072 +- conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-5_cp312.conda + build_number: 5 + sha256: 9486662af81a219e96d343449eff242f38d7c5128ced5ce5acf85857265058d6 + md5: e8681f534453af7afab4cd2bc1423eec + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD purls: [] - size: 217804 - timestamp: 1660346976440 -- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.20.2-pyhd8ed1ab_0.conda - sha256: 1e84fcfa41e0afdd87ff41e6fbb719c96a0e098c1f79be342293ab0bd8dea322 - md5: 4daaed111c05672ae669f7036ee5bba3 + size: 6730 + timestamp: 1723823139725 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py312h2e8e312_1.conda + sha256: 3e3b97740b4ec2f54debf7bfdbaa9a81a7aabd4549051b926de91d05304c4948 + md5: c5f1cb65c56ec74687801960f8a31eb5 depends: - - python >=3.8 - license: MIT - license_family: MIT + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD purls: - - pkg:pypi/zipp?source=hash-mapping - size: 21409 - timestamp: 1726248679175 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 + - pkg:pypi/pywin32-ctypes?source=hash-mapping + size: 57449 + timestamp: 1727282288065 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 - license: Zlib - license_family: Other + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD purls: [] - size: 92286 - timestamp: 1727963153079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 - md5: bc230abb5d21b63ff4799b0e75204783 - depends: - - libgcc >=13 - - libzlib 1.3.1 h86ecc28_2 - license: Zlib - license_family: Other + size: 3503410 + timestamp: 1699202577803 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_1.conda + sha256: db8dead3dd30fb1a032737554ce91e2819b43496a0db09927edf01c32b577450 + md5: 6797b005cd0f439c4c5c9ac565783700 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 purls: [] - size: 95582 - timestamp: 1727963203597 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 - md5: e3170d898ca6cb48f1bb567afb92f775 + size: 559710 + timestamp: 1728377334097 +- conda: https://conda.anaconda.org/conda-forge/win-64/uv-0.4.26-ha08ef0e_0.conda + sha256: 57691a29d941ffbbae312c6dedccc303b6303e58487803e84db20a3304c0d269 + md5: a09f8193bdf8d1512340e8ec2432e82d depends: - - __osx >=11.0 - - libzlib 1.3.1 h8359307_2 - license: Zlib - license_family: Other + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Apache-2.0 OR MIT purls: [] - size: 77606 - timestamp: 1727963209370 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312hef9b889_1.conda - sha256: b97015e146437283f2213ff0e95abdc8e2480150634d81fbae6b96ee09f5e50b - md5: 8b7069e9792ee4e5b4919a7a306d2e67 + size: 10344775 + timestamp: 1729775595022 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_22.conda + sha256: 2a47c5bd8bec045959afada7063feacd074ad66b170c1ea92dd139b389fcf8fd + md5: 311c9ba1dfdd2895a8cb08346ff26259 depends: - - __glibc >=2.17,<3.0.a0 - - cffi >=1.11 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 + - vc14_runtime >=14.38.33135 + track_features: + - vc14 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 419552 - timestamp: 1725305670210 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstandard-0.23.0-py312hb698573_1.conda - sha256: 2681c2a249752bdc7978e59ee2f34fcdfcbfda80029b84b8e5fec8dbc9e3af25 - md5: ffcb8e97e62af42075e0e5f46bb9856e + purls: [] + size: 17447 + timestamp: 1728400826998 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-hcc2c482_22.conda + sha256: 4c669c65007f88a7cdd560192f7e6d5679d191ac71610db724e18b2410964d64 + md5: ce23a4b980ee0556a118ed96550ff3f3 depends: - - cffi >=1.11 - - libgcc >=13 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 392496 - timestamp: 1725305808244 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstandard-0.23.0-py312h15fbf35_1.conda - sha256: d00ca25c1e28fd31199b26a94f8c96574475704a825d244d7a6351ad3745eeeb - md5: a4cde595509a7ad9c13b1a3809bcfe51 + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.40.33810.* *_22 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + purls: [] + size: 750719 + timestamp: 1728401055788 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_22.conda + sha256: 80aa9932203d65a96f817b8be4fafc176fb2b3fe6cf6899ede678b8f0317fbff + md5: 8c6b061d44cafdfc8e8c6eb5f100caf0 depends: - - __osx >=11.0 - - cffi >=1.11 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - - zstd >=1.5.6,<1.5.7.0a0 - - zstd >=1.5.6,<1.6.0a0 + - vc14_runtime >=14.40.33810 license: BSD-3-Clause license_family: BSD - purls: - - pkg:pypi/zstandard?source=hash-mapping - size: 330788 - timestamp: 1725305806565 + purls: [] + size: 17453 + timestamp: 1728400827536 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda + sha256: 8c5b976e3b36001bdefdb41fb70415f9c07eff631f1f0155f3225a7649320e77 + md5: c46ba8712093cb0114404ae8a7582e1a + depends: + - m2w64-gcc-libs + - m2w64-gcc-libs-core + license: MIT + license_family: MIT + purls: [] + size: 51297 + timestamp: 1684638355740 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 + sha256: f51205d33c07d744ec177243e5d9b874002910c731954f2c8da82459be462b93 + md5: 46878ebb6b9cbd8afcf8088d7ef00ece + depends: + - m2w64-gcc-libs + license: MIT + license_family: MIT + purls: [] + size: 67908 + timestamp: 1610072296570 +- conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 217804 + timestamp: 1660346976440 - conda: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.23.0-py312h7606c53_1.conda sha256: 3e0c718aa18dcac7f080844dbe0aea41a9cea75083019ce02e8a784926239826 md5: a92cc3435b2fd6f51463f5a4db5c50b1 @@ -4651,41 +3994,6 @@ packages: - pkg:pypi/zstandard?source=hash-mapping size: 320624 timestamp: 1725305934189 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda - sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b - md5: 4d056880988120e29d75bfff282e0f45 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 554846 - timestamp: 1714722996770 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.6-h02f22dd_0.conda - sha256: 484f9d0722c77685ae379fbff3ccd662af9ead7e59eb39cd6d0c677cdf25ff6c - md5: be8d5f8cf21aed237b8b182ea86b3dd6 - depends: - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 539937 - timestamp: 1714723130243 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.6-hb46c0d2_0.conda - sha256: 2d4fd1ff7ee79cd954ca8e81abf11d9d49954dd1fef80f27289e2402ae9c2e09 - md5: d96942c06c3e84bfcc5efb038724a7fd - depends: - - __osx >=11.0 - - libzlib >=1.2.13,<2.0.0a0 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 405089 - timestamp: 1714723101397 - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.6-h0ea2cb4_0.conda sha256: 768e30dc513568491818fb068ee867c57c514b553915536da09e5d10b4ebf3c3 md5: 9a17230f95733c04dc40a2b1e5491d74 @@ -4699,3 +4007,736 @@ packages: purls: [] size: 349143 timestamp: 1714723445995 +- pypi: ./python/itkwasm-downsample + name: itkwasm-downsample + requires_dist: + - itkwasm-downsample-emscripten ; sys_platform == 'emscripten' + - itkwasm-downsample-wasi ; sys_platform != 'emscripten' + - itkwasm>=1.0b185 + requires_python: '>=3.8' +- pypi: ./python/itkwasm-downsample-wasi + name: itkwasm-downsample-wasi + requires_dist: + - importlib-resources + - itkwasm>=1.0b185 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/08/48/c1ae6fa5fa77d735a6411a764e6e3937a023bd4c3b124ac6301ee174a194/itkwasm_compare_images-5.2.3-py3-none-any.whl + name: itkwasm-compare-images + version: 5.2.3 + sha256: 60a5f25ca54caf0f9823750cef72adebc443157979b028f01bfab3d6c35f9cea + requires_dist: + - itkwasm-compare-images-emscripten>=1.0.1 ; sys_platform == 'emscripten' + - itkwasm-compare-images-wasi>=1.0.1 ; sys_platform != 'emscripten' + - itkwasm>=1.0b171 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/0b/dc/c0c76414440ea1520b496801b9ee82f7cfbe5c4c1643e1e82c383897b3ae/itk-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk + version: 5.4.0 + sha256: a1b4e5511c2274025bffe80d081ef79ee41de580df80311007af1ec05e2774db + requires_dist: + - itk-core==5.4.0 + - itk-numerics==5.4.0 + - itk-io==5.4.0 + - itk-filtering==5.4.0 + - itk-registration==5.4.0 + - itk-segmentation==5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/11/61/cfd1cc04d2cd6c603c0abcd1f4bc0d65bff6ee9b84ebcbd828277b807887/itk_io-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-io + version: 5.4.0 + sha256: 393d711f9edb248aed402e7fc9613045536dbd6b45fc8db638a28d0a409fe974 + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/12/80/53ebf3fb5a6f1139da37fe365ac0a24e7d6588dc6729943626da8a506505/itkwasm_transform_io_wasi-1.1.0-py3-none-any.whl + name: itkwasm-transform-io-wasi + version: 1.1.0 + sha256: d5ccb1eb0c2efe58b2e535ec730f828f00233d1dc36f5b607b44631b61d47fe9 + requires_dist: + - importlib-resources + - itkwasm>=1.0b185 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/16/33/4d3617f48f853878750dc249d84bbfe4509469e82df58908a8612d469b2c/itk_filtering-5.4.0-cp311-abi3-win_amd64.whl + name: itk-filtering + version: 5.4.0 + sha256: ad59e6066dba25d6b0803023e95c7633a80e7b9c1a9ff89a41c97eae5a60e06f + requires_dist: + - itk-numerics==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1a/e5/94a596fba3dbecdea33059b455294fbfea91fcfc0d6cfd92372e10a6da93/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-segmentation + version: 5.4.0 + sha256: ff2ca7cdf42c8c32b20e1ecf7ee0a0be68e885ce673c565e72a4876b28d2e2f3 + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1d/0d/95993c08c721ec68892547f2117e8f9dfbcef2ca71e098533541b4a54d5f/pyee-12.0.0-py3-none-any.whl + name: pyee + version: 12.0.0 + sha256: 7b14b74320600049ccc7d0e0b1becd3b4bd0a03c745758225e31a59f4095c990 + requires_dist: + - typing-extensions + - build ; extra == 'dev' + - flake8 ; extra == 'dev' + - flake8-black ; extra == 'dev' + - pytest ; extra == 'dev' + - black ; extra == 'dev' + - isort ; extra == 'dev' + - jupyter-console ; extra == 'dev' + - mkdocs ; extra == 'dev' + - mkdocs-include-markdown-plugin ; extra == 'dev' + - mkdocstrings[python] ; extra == 'dev' + - sphinx ; extra == 'dev' + - toml ; extra == 'dev' + - tox ; extra == 'dev' + - trio ; extra == 'dev' + - twine ; extra == 'dev' + - twisted ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - trio ; python_full_version >= '3.7' and extra == 'dev' + - trio-typing ; python_full_version >= '3.7' and extra == 'dev' + - pytest-asyncio ; python_full_version >= '3.4' and extra == 'dev' + - pytest-trio ; python_full_version >= '3.7' and extra == 'dev' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1d/5d/e542c16e7647a544fd51ced24c6ca8d8c154a4f62d42bcd6bfa65b5c1a12/itk_io-5.4.0-cp311-abi3-win_amd64.whl + name: itk-io + version: 5.4.0 + sha256: 8c0eacb3aa100e4b369a673bb0e65c3c48c411bc4b716069bce4cee8c3f9e1cc + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1d/df/5ba47e12638ac537a8166a454c497032af83f2d5eb826bca81024ac8f78c/itkwasm-1.0b195-py3-none-any.whl + name: itkwasm + version: 1.0b195 + sha256: c98eaf4263a89cd3e639f40da0c1e0b021f85903fdfad54606b994c42e0d057a + requires_dist: + - importlib-metadata ; python_full_version < '3.10' + - numpy + - platformdirs ; sys_platform != 'emscripten' + - typing-extensions + - wasmtime>=28.0.0 ; sys_platform != 'emscripten' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/2b/3e/d1dfc24f22415a35c743fdd8dc8b8315454f4bcee6ecbb740aa9d440baa0/itk_numerics-5.4.0-cp311-abi3-win_amd64.whl + name: itk-numerics + version: 5.4.0 + sha256: 31f24c218c763b2c15953453cc366c5ba09e7a5c7d47d432a24c0b6b12249206 + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/2d/7f/b28465e289ce6217b3e1fbebb9956e73e334a5c5f76a6426ba6843310943/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-numerics + version: 5.4.0 + sha256: 5cd8ab0781e08a4022e36094bb60652d0ee2b7cd1912f325e8f32d8bd5501fcf + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/31/dc/121be574222fc74d12ac42921728fb6ba8ac17264a1fdab1993263389082/playwright-1.48.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: playwright + version: 1.48.0 + sha256: 8ff8303409ebed76bed4c3d655340320b768817d900ba208b394fdd7d7939a5c + requires_dist: + - greenlet==3.1.1 + - pyee==12.0.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + name: sortedcontainers + version: 2.4.0 + sha256: a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +- pypi: https://files.pythonhosted.org/packages/33/46/f5b38109ab08d0adf7dd63ebc130a1d25b3f001f2eb9464091825fab8271/itkwasm_transform_io-1.1.0-py3-none-any.whl + name: itkwasm-transform-io + version: 1.1.0 + sha256: b9f64f481f52877a554764dc09dd41d4dfa55ddf46a657c14b9c5ad97b17e74f + requires_dist: + - itkwasm-transform-io-emscripten ; sys_platform == 'emscripten' + - itkwasm-transform-io-wasi ; sys_platform != 'emscripten' + - itkwasm>=1.0b185 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3a/92/7d32413898fe4068f0b2da97ab783057e6af84123aa6c54af3706476fed9/itk_segmentation-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-segmentation + version: 5.4.0 + sha256: b3c154e7a92be2ad48e6bf8bd5a8a17610f890bb420abb54dd2bde15b1c9c52c + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3b/b8/5f1269e17191228c7702cd81fc6e83f1814ab49a235fcba62230bac81cb4/itk_numerics-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-numerics + version: 5.4.0 + sha256: 583b665d6b8578ac93691afb796faf69e30b8db8a205754cdc746707f9589fcd + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/3c/83/ec3196c360afffbc5b342ead48d1eb7393dd74fa70bca75d33905a86f211/trio-0.27.0-py3-none-any.whl + name: trio + version: 0.27.0 + sha256: 68eabbcf8f457d925df62da780eff15ff5dc68fd6b367e2dde59f7aaf2a0b884 + requires_dist: + - attrs>=23.2.0 + - sortedcontainers + - idna + - outcome + - sniffio>=1.3.0 + - cffi>=1.14 ; implementation_name != 'pypy' and os_name == 'nt' + - exceptiongroup ; python_full_version < '3.11' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl + name: greenlet + version: 3.1.1 + sha256: 7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/45/88/b6459c93a8bc0b96e7a33b6744bbef2740a0b78b0534542a037d220427f0/playwright-1.48.0-py3-none-win_amd64.whl + name: playwright + version: 1.48.0 + sha256: e0e87b0c4dc8fce83c725dd851aec37bc4e882bb225ec8a96bd83cf32d4f1623 + requires_dist: + - greenlet==3.1.1 + - pyee==12.0.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/48/be/a9ae5f50cad5b6f85bd2574c2c923730098530096e170c1ce7452394d7aa/trio_websocket-0.11.1-py3-none-any.whl + name: trio-websocket + version: 0.11.1 + sha256: 520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 + requires_dist: + - trio>=0.11 + - wsproto>=0.14 + - exceptiongroup ; python_full_version < '3.11' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/4a/a2/ef05890cd456cdb8d6d2e539f2f4c38392fa44155a1e35cedd05e4221b49/itk_meshtopolydata-0.11.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-meshtopolydata + version: 0.11.0 + sha256: 3c10f157bddbdf86b596ec2742f17bcc35cd6ce7bd64bba712a2a0c0858c2dc7 + requires_dist: + - itk-core~=5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/4c/0b/682adf8c2455d68a3c08f14b20511b5513e810100b4f58dc50bd9bf85428/hypothesis-6.115.5-py3-none-any.whl + name: hypothesis + version: 6.115.5 + sha256: b7733459ae9a93020fac3b91b41473c9b85e975139a152a70d88f3a5caa3fa3f + requires_dist: + - attrs>=22.2.0 + - sortedcontainers>=2.1.0,<3.0.0 + - exceptiongroup>=1.0.0 ; python_full_version < '3.11' + - black>=19.10b0 ; extra == 'all' + - click>=7.0 ; extra == 'all' + - crosshair-tool>=0.0.74 ; extra == 'all' + - django>=4.2 ; extra == 'all' + - dpcontracts>=0.4 ; extra == 'all' + - hypothesis-crosshair>=0.0.16 ; extra == 'all' + - lark>=0.10.1 ; extra == 'all' + - libcst>=0.3.16 ; extra == 'all' + - numpy>=1.19.3 ; extra == 'all' + - pandas>=1.1 ; extra == 'all' + - pytest>=4.6 ; extra == 'all' + - python-dateutil>=1.4 ; extra == 'all' + - pytz>=2014.1 ; extra == 'all' + - redis>=3.0.0 ; extra == 'all' + - rich>=9.0.0 ; extra == 'all' + - tzdata>=2024.2 ; (sys_platform == 'emscripten' and extra == 'all') or (sys_platform == 'win32' and extra == 'all') + - click>=7.0 ; extra == 'cli' + - black>=19.10b0 ; extra == 'cli' + - rich>=9.0.0 ; extra == 'cli' + - libcst>=0.3.16 ; extra == 'codemods' + - hypothesis-crosshair>=0.0.16 ; extra == 'crosshair' + - crosshair-tool>=0.0.74 ; extra == 'crosshair' + - python-dateutil>=1.4 ; extra == 'dateutil' + - django>=4.2 ; extra == 'django' + - dpcontracts>=0.4 ; extra == 'dpcontracts' + - black>=19.10b0 ; extra == 'ghostwriter' + - lark>=0.10.1 ; extra == 'lark' + - numpy>=1.19.3 ; extra == 'numpy' + - pandas>=1.1 ; extra == 'pandas' + - pytest>=4.6 ; extra == 'pytest' + - pytz>=2014.1 ; extra == 'pytz' + - redis>=3.0.0 ; extra == 'redis' + - tzdata>=2024.2 ; (sys_platform == 'emscripten' and extra == 'zoneinfo') or (sys_platform == 'win32' and extra == 'zoneinfo') + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/4c/79/73735a6a5dad6059c085f240a4e74c9270feccd2bc66e4d31b5ca01d329c/numpy-2.1.2-cp312-cp312-win_amd64.whl + name: numpy + version: 2.1.2 + sha256: 456e3b11cb79ac9946c822a56346ec80275eaf2950314b249b512896c0d2505e + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/51/61/45c8709b872d28bb37c0cdbf9f1cd87772f0a0198564d7af39f0d98438f6/itk_io-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-io + version: 5.4.0 + sha256: d969a2ab2775b2ace36edee274ffe4839b21c7ccd634844082028f9f373dfedb + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/54/83/83d598af08eb297f1a644e678ce2d6c335f015c9f3c8c2532e289801293b/wasmtime-38.0.0-py3-none-macosx_11_0_arm64.whl + name: wasmtime + version: 38.0.0 + sha256: 479529425f68cd69f8f4c369abf50d6f44a0e2395f5ce2b9a506c8a695aef65b + requires_dist: + - importlib-resources>=5.10 + - coverage ; extra == 'testing' + - pycparser ; extra == 'testing' + - pytest-mypy ; extra == 'testing' + - pytest ; extra == 'testing' + - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/54/de/7b8898c9e7f73a2f4c20b621279143cfc27836dba0db676e9a923cd0a461/wasmtime-38.0.0-py3-none-manylinux1_x86_64.whl + name: wasmtime + version: 38.0.0 + sha256: f6c87bfe9de9a35de5b28fbdac192e2526486e3d0a3be48e107789cf117925fd + requires_dist: + - importlib-resources>=5.10 + - coverage ; extra == 'testing' + - pycparser ; extra == 'testing' + - pytest-mypy ; extra == 'testing' + - pytest ; extra == 'testing' + - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl + name: outcome + version: 1.3.0.post0 + sha256: e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b + requires_dist: + - attrs>=19.2.0 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl + name: websocket-client + version: 1.8.0 + sha256: 17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 + requires_dist: + - sphinx>=6.0 ; extra == 'docs' + - sphinx-rtd-theme>=1.1.0 ; extra == 'docs' + - myst-parser>=2.0.0 ; extra == 'docs' + - python-socks ; extra == 'optional' + - wsaccel ; extra == 'optional' + - websockets ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/60/be/5e7d2f70bb03a8ef78ca076c22d0e3c633b330be1ca310a6dcebfefaaea3/itk_core-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-core + version: 5.4.0 + sha256: 21c7b5c451f73c8073eb3b5dd85f7c654399cdc25dd51669bfbbafa611aa4649 + requires_dist: + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/64/41/d77c47743800fbeb86657611e651e56a17cbb4ebfefa1da0318dc39092df/playwright-1.48.0-py3-none-macosx_11_0_arm64.whl + name: playwright + version: 1.48.0 + sha256: 7da2eb51a19c7f3b523e9faa9d98e7af92e52eb983a099979ea79c9668e3cbf7 + requires_dist: + - greenlet==3.1.1 + - pyee==12.0.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/66/99/6da689c6534b16b2e6959321533f0000228854e5f4211eb00bfa7b6bcebc/wasmtime-38.0.0-py3-none-win_amd64.whl + name: wasmtime + version: 38.0.0 + sha256: c0f7ac800575e592e74ce7d111e04ad7b3dbbff421bfac00c94432300ee39bfe + requires_dist: + - importlib-resources>=5.10 + - coverage ; extra == 'testing' + - pycparser ; extra == 'testing' + - pytest-mypy ; extra == 'testing' + - pytest ; extra == 'testing' + - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/66/d4/c8c04958870f482459ab5956c2942c4ec35cac7fe245527f1039837c17a9/greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: greenlet + version: 3.1.1 + sha256: f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl + name: attrs + version: 24.2.0 + sha256: 81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 + requires_dist: + - importlib-metadata ; python_full_version < '3.8' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'benchmark' + - hypothesis ; extra == 'benchmark' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'benchmark' + - pympler ; extra == 'benchmark' + - pytest-codspeed ; extra == 'benchmark' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'benchmark' + - pytest-xdist[psutil] ; extra == 'benchmark' + - pytest>=4.3.0 ; extra == 'benchmark' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'cov' + - coverage[toml]>=5.3 ; extra == 'cov' + - hypothesis ; extra == 'cov' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'cov' + - pympler ; extra == 'cov' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'cov' + - pytest-xdist[psutil] ; extra == 'cov' + - pytest>=4.3.0 ; extra == 'cov' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'dev' + - hypothesis ; extra == 'dev' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'dev' + - pre-commit ; extra == 'dev' + - pympler ; extra == 'dev' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'dev' + - pytest-xdist[psutil] ; extra == 'dev' + - pytest>=4.3.0 ; extra == 'dev' + - cogapp ; extra == 'docs' + - furo ; extra == 'docs' + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-notfound-page ; extra == 'docs' + - sphinxcontrib-towncrier ; extra == 'docs' + - towncrier<24.7 ; extra == 'docs' + - cloudpickle ; platform_python_implementation == 'CPython' and extra == 'tests' + - hypothesis ; extra == 'tests' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests' + - pympler ; extra == 'tests' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests' + - pytest-xdist[psutil] ; extra == 'tests' + - pytest>=4.3.0 ; extra == 'tests' + - mypy>=1.11.1 ; python_full_version >= '3.9' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + - pytest-mypy-plugins ; python_full_version >= '3.9' and python_full_version < '3.13' and platform_python_implementation == 'CPython' and extra == 'tests-mypy' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/6c/cf/af6554bd0fd831ba2f8ed7840904a1b0828b1ea348b5000b78ad34c5688f/itk_webassemblyinterface-1.0b175-cp311-abi3-win_amd64.whl + name: itk-webassemblyinterface + version: 1.0b175 + sha256: 0b787ee92418a1f965c52eea1fd41a7aef4424eb6e07a290b0e1ddebf50a09e1 + requires_dist: + - itk==5.4.* + - itk-meshtopolydata==0.11.* + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/6e/5c/eeaa8d362f97ecbb832d6e88cab4d3c13afd602a01befb4d38712afacf4f/itk_core-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-core + version: 5.4.0 + sha256: b6af0e82dae0efa95ad87f36ccd55a955383b34a6bd8a036894fb96a3933615a + requires_dist: + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/6f/ec/70457045923b005761b19f78b85b467a64808e886c10c449f7758a1ba5f7/pyodide_py-0.26.3-py3-none-any.whl + name: pyodide-py + version: 0.26.3 + sha256: b63b6847c8906aa8f3c17df362135d0407aabf1d4b023557aed721d822e347a8 + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/77/66/73fa21a0439eacae5156c73611b35eec2c9c3d83ae4f987754043fce1d67/itk_webassemblyinterface-1.0b175-cp311-abi3-macosx_11_0_arm64.whl + name: itk-webassemblyinterface + version: 1.0b175 + sha256: ee3defc13dc65f56127e468c145e9249265c275b63ea3c530c1b88f1df4a7033 + requires_dist: + - itk==5.4.* + - itk-meshtopolydata==0.11.* + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/77/8d/916c078544ac29a5ac215d2e5a2b07c9314b515b63136be92d6856a41f55/itk_segmentation-5.4.0-cp311-abi3-win_amd64.whl + name: itk-segmentation + version: 5.4.0 + sha256: 45374d3c38884ed02e0dfebf73f363e265184a50f7c46d55d8c9217e690a571f + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl + name: wsproto + version: 1.2.0 + sha256: b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 + requires_dist: + - h11>=0.9.0,<1 + requires_python: '>=3.7.0' +- pypi: https://files.pythonhosted.org/packages/79/b9/ba9598bb8b7ee3962980d481065a58f75569c5a2df1d01520083288894b0/itk_segmentation-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-segmentation + version: 5.4.0 + sha256: 8dd071dbb1ba1c8fcf26a4011fc3b7069d444e10bc56279d7b26fd3193ac58aa + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7d/ec/bad1ac26764d26aa1353216fcbfa4670050f66d445448aafa227f8b16e80/greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl + name: greenlet + version: 3.1.1 + sha256: 4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/7d/ee/4a4bd7a8f381d391fa293dcfde3437d891c7e9dc7db8764e85506d6cc753/itkwasm_compare_images_wasi-5.2.3-py3-none-any.whl + name: itkwasm-compare-images-wasi + version: 5.2.3 + sha256: d363d00507ed7da55e57099ec659cf7d13314141d432f9750f83af94250a0bd6 + requires_dist: + - importlib-resources + - itkwasm>=1.0b171 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7e/14/577a2a26c81ab6e2db821d7a5da3c6ff8dbf27ab3d8ebe74a3d4f203ab38/itk-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk + version: 5.4.0 + sha256: 0f0dcce9df862831e705eebf0ffa95de554b17027f69d67b31b30dcb8d838019 + requires_dist: + - itk-core==5.4.0 + - itk-numerics==5.4.0 + - itk-io==5.4.0 + - itk-filtering==5.4.0 + - itk-registration==5.4.0 + - itk-segmentation==5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/88/99/3db052a349efaf1ddbb51252e7e4c7a6a10ed5b3b87e2076afb622b711fd/itk_registration-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-registration + version: 5.4.0 + sha256: 15eab6a72bebeccfb8a0fb291b65c305e46776a18a8f3cb91f199fc8ecd137a1 + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/89/f6/686c2d2650065495720889c2e6ebcf6af2e5c2692fc6d8768793b08c641a/itk_registration-5.4.0-cp311-abi3-win_amd64.whl + name: itk-registration + version: 5.4.0 + sha256: 8a2d3f2872375a9c2694bb34a2e061a4d2666f8c13390f03d94219ba8370649e + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8a/0b/46eaffa04ac7a15d2bea1f40e179df6152c00bf709f8d08b81c5514a9e12/itk_numerics-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-numerics + version: 5.4.0 + sha256: e2dcda0a07ccb6b9b518d3cc4413387a44c30a313c22e15bf818af06c7da8bfd + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8a/a0/732ddb5575a5be47d1088def8b1db91c799263a8d583181341271a4f6e6d/itk-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk + version: 5.4.0 + sha256: 88344f4c7e8a74dfdeb98e20232d1a9565eb7c381d8242534588ecc4e745ffb3 + requires_dist: + - itk-core==5.4.0 + - itk-numerics==5.4.0 + - itk-io==5.4.0 + - itk-filtering==5.4.0 + - itk-registration==5.4.0 + - itk-segmentation==5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl + name: pysocks + version: 1.7.1 + sha256: 2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/8d/f0/0fb8ad41cddcd0580689450d304757211a19f8e3426ae42d30577d10ac19/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-filtering + version: 5.4.0 + sha256: 6e8600df87c59233968013d162c5a353ca4c8f843c76117b52347aec20ff1620 + requires_dist: + - itk-numerics==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/96/31/6607dab48616902f76885dfcf62c08d929796fc3b2d2318faf9fd54dbed9/pytest_asyncio-0.24.0-py3-none-any.whl + name: pytest-asyncio + version: 0.24.0 + sha256: a811296ed596b69bf0b6f3dc40f83bcaf341b155a269052d82efa2b25ac7037b + requires_dist: + - pytest>=8.2,<9 + - sphinx>=5.3 ; extra == 'docs' + - sphinx-rtd-theme>=1.0 ; extra == 'docs' + - coverage>=6.2 ; extra == 'testing' + - hypothesis>=5.7.1 ; extra == 'testing' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9b/87/ce70db7cae60e67851eb94e1a2127d4abb573d3866d2efd302ceb0d4d2a5/tblib-3.0.0-py3-none-any.whl + name: tblib + version: 3.0.0 + sha256: 80a6c77e59b55e83911e1e607c649836a69c103963c5f28a46cbeef44acf8129 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/9b/b4/e3c7e6fab0f77fff6194afa173d1f2342073d91b1d3b4b30b17c3fb4407a/numpy-2.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: numpy + version: 2.1.2 + sha256: 6d95f286b8244b3649b477ac066c6906fbb2905f8ac19b170e2175d3d799f4df + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a6/3c/ac3bad4ff24fe2b07064be5e44db8f4ed32a4e3708dff084e3b58c5b608c/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-webassemblyinterface + version: 1.0b175 + sha256: 72f82fab54c4ee4c6c579cfd5c963cba9a84ecc9909e61f3641caa9fef94b40c + requires_dist: + - itk==5.4.* + - itk-meshtopolydata==0.11.* + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/aa/85/fa44f23dd5d5066a72f7c4304cce4b5ff9a6e7fd92431a48b2c63fbf63ec/selenium-4.25.0-py3-none-any.whl + name: selenium + version: 4.25.0 + sha256: 3798d2d12b4a570bc5790163ba57fef10b2afee958bf1d80f2a3cf07c4141f33 + requires_dist: + - urllib3[socks]>=1.26,<3 + - trio~=0.17 + - trio-websocket~=0.9 + - certifi>=2021.10.8 + - typing-extensions~=4.9 + - websocket-client~=1.8 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b0/29/cb48a402ea879e645b16218718f3f7d9588a77d674a9dcf22e4c43487636/numpy-2.1.2-cp312-cp312-macosx_11_0_arm64.whl + name: numpy + version: 2.1.2 + sha256: b1d0fcae4f0949f215d4632be684a539859b295e2d0cb14f78ec231915d644db + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b8/2a/5f599b21625876da5a1afb88192375d095fa73805054a7dfa3a3db92849d/itkwasm_image_io_wasi-1.3.0-py3-none-any.whl + name: itkwasm-image-io-wasi + version: 1.3.0 + sha256: 13fe5cad7942dc9fc94ece5711d5b342b5cb90dc93f764558de195674a2b183b + requires_dist: + - importlib-resources + - itkwasm>=1.0b131 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/bb/23/06d0a850a7e525ede537e3e37fd8efd7f5858e261d6170d6f0697cb663dd/itk_filtering-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-filtering + version: 5.4.0 + sha256: 86026c853f1fd0b13e282f952cff7455df0ac131cc608df8669ce335633eef0a + requires_dist: + - itk-numerics==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/be/17/b1a8b50187cdc81a979eb0f23dba13133bc0c4b5a355fa02eac39108134f/itkwasm_image_io-1.6.0-py3-none-any.whl + name: itkwasm-image-io + version: 1.6.0 + sha256: 55122f55b37b7b3c834952bfdc40ff51bdf1da05482e5c5aeba5b4fec418b8f7 + requires_dist: + - itkwasm-image-io-emscripten ; sys_platform == 'emscripten' + - itkwasm-image-io-wasi ; sys_platform != 'emscripten' + - itkwasm>=1.0b186 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/c4/a7/af3329fda3c3ec31d9b650e42bbcd3422fc62a765cbb1405fde4177a0996/numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl + name: numpy + version: 2.1.2 + sha256: 1b8cde4f11f0a975d1fd59373b32e2f5a562ade7cde4f85b7137f3de8fbb29a0 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cb/49/098970cb18aa7f84c6d41ece00c8dd2072d3a890973ae4e2a069fe9d8cc2/itk_filtering-5.4.0-cp311-abi3-macosx_11_0_arm64.whl + name: itk-filtering + version: 5.4.0 + sha256: e8d90842d703877c4ce777efece3db478c8ed5e3a18488e277a480f05d61ebb0 + requires_dist: + - itk-numerics==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/cd/98/7a2d160bd1a997c6fc422647ccf907fcc1b14b8e4a89790fa1427b8f4d16/pytest_pyodide-0.58.3-py3-none-any.whl + name: pytest-pyodide + version: 0.58.3 + sha256: 6425d8ac868090da70337bdef33bd8a082a353a4ecdb89f5371bcf58ac7390e7 + requires_dist: + - hypothesis + - pexpect + - playwright + - pytest + - pytest-asyncio + - selenium + - tblib>=3 + - build ; extra == 'test' + - pytest-cov ; extra == 'test' + - requests ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl + name: urllib3 + version: 2.2.3 + sha256: ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac + requires_dist: + - brotli>=1.0.9 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - zstandard>=0.18.0 ; extra == 'zstd' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d6/79/acd142f3052c408eb41f5e6934b954decb49b6129370262647cfda343208/itk_io-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-io + version: 5.4.0 + sha256: 11a34ac45b960aa883e1758ead15c5394814964573c93d736fc04f021c18cd22 + requires_dist: + - itk-core==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d8/0f/15f4f1953ad4358fb9fc191a3432f3c521d209faf671ef13b386692c7ff8/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-meshtopolydata + version: 0.11.0 + sha256: 914cae65049842affc820471e149b2cdd55d305ff1a740c34a47e1b1af567361 + requires_dist: + - itk-core~=5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/dc/58/ec1bf790ed9657fd8a651189d40eedd765bf1cd75355ffa3f8f9bd67f4df/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-registration + version: 5.4.0 + sha256: 3f41cff2136f69ae5c2ce6166191dff86e4722097411aaaba07a74884d36ff73 + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e6/05/b876851fc885a3e3cb85f4167bcbc35020da23b98d50da3947041fc82224/itk-5.4.0-cp311-abi3-win_amd64.whl + name: itk + version: 5.4.0 + sha256: e5ffacab2c8609979c78c2d2e02ee7e6abd611261aac0613289d98e7c277cd83 + requires_dist: + - itk-core==5.4.0 + - itk-numerics==5.4.0 + - itk-io==5.4.0 + - itk-filtering==5.4.0 + - itk-registration==5.4.0 + - itk-segmentation==5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e6/55/01ab1b8f98e35f90fac200ed3aad19714c6d9058a43c68bbe3186cbfdc70/itk_meshtopolydata-0.11.0-cp311-abi3-win_amd64.whl + name: itk-meshtopolydata + version: 0.11.0 + sha256: b8b746f6d5597687d0b50dd81d650da0293f2c3c90f31212baefdf46edb727d6 + requires_dist: + - itk-core~=5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e7/f0/a21ddf56263ad6c5f87164032aaeb2235ee2de688cb8a8eeec01a5f01bd7/itk_registration-5.4.0-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-registration + version: 5.4.0 + sha256: dde112dbb9b695c1908692a0086f60da8d5a123f7e959ebc5aaec2825aaf9793 + requires_dist: + - itk-filtering==5.4.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f1/66/033e58a50fd9ec9df00a8671c74f1f3a320564c6415a4ed82a1c651654ba/greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: greenlet + version: 3.1.1 + sha256: 1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9 + requires_dist: + - sphinx ; extra == 'docs' + - furo ; extra == 'docs' + - objgraph ; extra == 'test' + - psutil ; extra == 'test' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/f2/f5/cd8ed297bd1b9f816d7492bfa857c53bd8fd68aefc2aa9bef7a0d5a61d85/itk_webassemblyinterface-1.0b175-cp311-abi3-manylinux_2_28_aarch64.whl + name: itk-webassemblyinterface + version: 1.0b175 + sha256: eff3cd27756e96ebd31500ef258d0cc4a56e48c2c25c4533300469246623d7aa + requires_dist: + - itk==5.4.* + - itk-meshtopolydata==0.11.* + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f3/8a/6388ca285140894109b17f8ae912ce7d13f69c8216af0b5c0e45adca6676/itk_core-5.4.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-core + version: 5.4.0 + sha256: 8ca83de9c269e6b20648f2391aa2bf96903b8ed645c3d8cd40d90b939dda439e + requires_dist: + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f4/94/424a2efabc1ae2c6f46cb250d21bf82cb791e113486d614b77b75788e8f5/itk_meshtopolydata-0.11.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: itk-meshtopolydata + version: 0.11.0 + sha256: 84bd859eeb17aed3de39f0b3357525a4bfac0db17263a8d36cd641e5f8c49b46 + requires_dist: + - itk-core~=5.4.0 + - numpy + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f9/0c/8cde1a86a9a7449a0ba95197f42156198083be1749b717831fba16ab2b5f/playwright-1.48.0-py3-none-manylinux1_x86_64.whl + name: playwright + version: 1.48.0 + sha256: 8dabb80e62f667fe2640a8b694e26a7b884c0b4803f7514a3954fc849126227b + requires_dist: + - greenlet==3.1.1 + - pyee==12.0.0 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/fc/7b/8e6f9670ea1476735517b28b99b2595e9000d46ee0a276d0e0b547cc928c/wasmtime-38.0.0-py3-none-manylinux2014_aarch64.whl + name: wasmtime + version: 38.0.0 + sha256: d5455bd83e82b04db32c226524b1c084a71d5d9d4ada3c5d0cf5cccaf2563253 + requires_dist: + - importlib-resources>=5.10 + - coverage ; extra == 'testing' + - pycparser ; extra == 'testing' + - pytest-mypy ; extra == 'testing' + - pytest ; extra == 'testing' + - componentize-py ; (sys_platform != 'win32' and extra == 'testing') or (platform_machine == 'AMD64' and extra == 'testing') + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fd/35/1fbc801f430858f1054c6b64e5d8316b9a319c2eaca2b6723c98ee7a0358/itk_core-5.4.0-cp311-abi3-win_amd64.whl + name: itk-core + version: 5.4.0 + sha256: 6affe6986927fd176c176f5464d9ea9e737b85d8745f5c4129da910fd16235cb + requires_dist: + - numpy + requires_python: '>=3.8' diff --git a/packages/downsample/pixi.toml b/packages/downsample/pixi.toml index 9db1bbb86..62d21ff23 100644 --- a/packages/downsample/pixi.toml +++ b/packages/downsample/pixi.toml @@ -88,6 +88,7 @@ pytest-pyodide = ">=0.58.3, <0.59" itk-webassemblyinterface = ">=1.0b175, <2" itkwasm-image-io = ">=1.6.0, <2" itkwasm-compare-images = ">=5.2.3, <6" +itkwasm-transform-io = ">=1.1.0, <2" [feature.python.tasks.test-wasi] cmd = "pytest" diff --git a/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/__init__.py b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/__init__.py index 9ec5194bf..b3f1319d1 100644 --- a/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/__init__.py +++ b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/__init__.py @@ -8,5 +8,6 @@ from .downsample_async import downsample_async from .gaussian_kernel_radius_async import gaussian_kernel_radius_async from .resample_bounding_box_async import resample_bounding_box_async +from .resample_to_reference_async import resample_to_reference_async from ._version import __version__ diff --git a/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/js_package.py b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/js_package.py index 8663f3aff..e1ff4f058 100644 --- a/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/js_package.py +++ b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_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,dmFyIGlJPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgb0k9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSlpSShBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIGdJPSIxLjguMSIsSWU9Z0k7dmFyIG5JPXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sTj1uSTt2YXIgYUk9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LFg9YUk7ZnVuY3Rpb24gc0koQSxlKXtsZXQgdD1udWxsO3N3aXRjaChBKXtjYXNlIE4uVUludDg6e3Q9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBOLkludDg6e3Q9bmV3IEludDhBcnJheShlKTticmVha31jYXNlIE4uVUludDE2Ont0PW5ldyBVaW50MTZBcnJheShlKTticmVha31jYXNlIE4uSW50MTY6e3Q9bmV3IEludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSBOLlVJbnQzMjp7dD1uZXcgVWludDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSBOLkludDMyOnt0PW5ldyBJbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgTi5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ1VpbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBOLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP3Q9bmV3IEJpZ0ludDY0QXJyYXkoZSk6dD1uZXcgVWludDhBcnJheShlKTticmVha31jYXNlIFguRmxvYXQzMjp7dD1uZXcgRmxvYXQzMkFycmF5KGUpO2JyZWFrfWNhc2UgWC5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIFA9c0k7dmFyIENJPXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm1MaXN0OiJUcmFuc2Zvcm1MaXN0IixKc29uQ29tcGF0aWJsZToiSnNvbkNvbXBhdGlibGUifSxkPUNJO3ZhciBqZT1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxCST1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxvZT1TeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5IikscmU9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLGJBPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSx2ZT1BPT50eXBlb2YgQT09Im9iamVjdCImJkEhPT1udWxsfHx0eXBlb2YgQT09ImZ1bmN0aW9uIixRST17Y2FuSGFuZGxlOkE9PnZlKEEpJiZBW2plXSxzZXJpYWxpemUoQSl7bGV0e3BvcnQxOmUscG9ydDI6dH09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBaZShBLGUpLFt0LFt0XV19LGRlc2VyaWFsaXplKEEpe3JldHVybiBBLnN0YXJ0KCksZ2UoQSl9fSxFST17Y2FuSGFuZGxlOkE9PnZlKEEpJiZiQSBpbiBBLHNlcmlhbGl6ZSh7dmFsdWU6QX0pe2xldCBlO3JldHVybiBBIGluc3RhbmNlb2YgRXJyb3I/ZT17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTpBLm1lc3NhZ2UsbmFtZTpBLm5hbWUsc3RhY2s6QS5zdGFja319OmU9e2lzRXJyb3I6ITEsdmFsdWU6QX0sW2UsW11dfSxkZXNlcmlhbGl6ZShBKXt0aHJvdyBBLmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoQS52YWx1ZS5tZXNzYWdlKSxBLnZhbHVlKTpBLnZhbHVlfX0sX2U9bmV3IE1hcChbWyJwcm94eSIsUUldLFsidGhyb3ciLEVJXV0pO2Z1bmN0aW9uIGxJKEEsZSl7Zm9yKGxldCB0IG9mIEEpaWYoZT09PXR8fHQ9PT0iKiJ8fHQgaW5zdGFuY2VvZiBSZWdFeHAmJnQudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBaZShBLGU9Z2xvYmFsVGhpcyx0PVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIEkocil7aWYoIXJ8fCFyLmRhdGEpcmV0dXJuO2lmKCFsSSh0LHIub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtyLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDppLHR5cGU6byxwYXRoOmF9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LHIuZGF0YSksUT0oci5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcCh6KSxDO3RyeXtsZXQgZz1hLnNsaWNlKDAsLTEpLnJlZHVjZSgoZixCKT0+ZltCXSxBKSxzPWEucmVkdWNlKChmLEIpPT5mW0JdLEEpO3N3aXRjaChvKXtjYXNlIkdFVCI6Qz1zO2JyZWFrO2Nhc2UiU0VUIjpnW2Euc2xpY2UoLTEpWzBdXT16KHIuZGF0YS52YWx1ZSksQz0hMDticmVhaztjYXNlIkFQUExZIjpDPXMuYXBwbHkoZyxRKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBmPW5ldyBzKC4uLlEpO0M9cEkoZil9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpmLHBvcnQyOkJ9PW5ldyBNZXNzYWdlQ2hhbm5lbDtaZShBLEIpLEM9bmUoZixbZl0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6Qz12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKGcpe0M9e3ZhbHVlOmcsW2JBXTowfX1Qcm9taXNlLnJlc29sdmUoQykuY2F0Y2goZz0+KHt2YWx1ZTpnLFtiQV06MH0pKS50aGVuKGc9PntsZXRbcyxmXT1NQShnKTtlLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxzKSx7aWQ6aX0pLGYpLG89PT0iUkVMRUFTRSImJihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEkpLFZlKGUpLHJlIGluIEEmJnR5cGVvZiBBW3JlXT09ImZ1bmN0aW9uIiYmQVtyZV0oKSl9KS5jYXRjaChnPT57bGV0W3MsZl09TUEoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtiQV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHMpLHtpZDppfSksZil9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBjSShBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBWZShBKXtjSShBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIGdlKEEsZSl7cmV0dXJuIGllKEEsW10sZSl9ZnVuY3Rpb24gR0EoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIFhlKEEpe3JldHVybiBlQShBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntWZShBKX0pfXZhciBMQT1uZXcgV2Vha01hcCxKQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgZT0oTEEuZ2V0KEEpfHwwKS0xO0xBLnNldChBLGUpLGU9PT0wJiZYZShBKX0pO2Z1bmN0aW9uIGZJKEEsZSl7bGV0IHQ9KExBLmdldChlKXx8MCkrMTtMQS5zZXQoZSx0KSxKQSYmSkEucmVnaXN0ZXIoQSxlLEEpfWZ1bmN0aW9uIHVJKEEpe0pBJiZKQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIGllKEEsZT1bXSx0PWZ1bmN0aW9uKCl7fSl7bGV0IEk9ITEscj1uZXcgUHJveHkodCx7Z2V0KGksbyl7aWYoR0EoSSksbz09PW9lKXJldHVybigpPT57dUkociksWGUoQSksST0hMH07aWYobz09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5yfTtsZXQgYT1lQShBLHt0eXBlOiJHRVQiLHBhdGg6ZS5tYXAoUT0+US50b1N0cmluZygpKX0pLnRoZW4oeik7cmV0dXJuIGEudGhlbi5iaW5kKGEpfXJldHVybiBpZShBLFsuLi5lLG9dKX0sc2V0KGksbyxhKXtHQShJKTtsZXRbUSxDXT1NQShhKTtyZXR1cm4gZUEoQSx7dHlwZToiU0VUIixwYXRoOlsuLi5lLG9dLm1hcChnPT5nLnRvU3RyaW5nKCkpLHZhbHVlOlF9LEMpLnRoZW4oeil9LGFwcGx5KGksbyxhKXtHQShJKTtsZXQgUT1lW2UubGVuZ3RoLTFdO2lmKFE9PT1CSSlyZXR1cm4gZUEoQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbih6KTtpZihRPT09ImJpbmQiKXJldHVybiBpZShBLGUuc2xpY2UoMCwtMSkpO2xldFtDLGddPVdlKGEpO3JldHVybiBlQShBLHt0eXBlOiJBUFBMWSIscGF0aDplLm1hcChzPT5zLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpDfSxnKS50aGVuKHopfSxjb25zdHJ1Y3QoaSxvKXtHQShJKTtsZXRbYSxRXT1XZShvKTtyZXR1cm4gZUEoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOmUubWFwKEM9PkMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OmF9LFEpLnRoZW4oeil9fSk7cmV0dXJuIGZJKHIsQSkscn1mdW5jdGlvbiBkSShBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBXZShBKXtsZXQgZT1BLm1hcChNQSk7cmV0dXJuW2UubWFwKHQ9PnRbMF0pLGRJKGUubWFwKHQ9PnRbMV0pKV19dmFyIHplPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIG5lKEEsZSl7cmV0dXJuIHplLnNldChBLGUpLEF9ZnVuY3Rpb24gcEkoQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W2plXTohMH0pfWZ1bmN0aW9uIE1BKEEpe2ZvcihsZXRbZSx0XW9mIF9lKWlmKHQuY2FuSGFuZGxlKEEpKXtsZXRbSSxyXT10LnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6ZSx2YWx1ZTpJfSxyXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0semUuZ2V0KEEpfHxbXV19ZnVuY3Rpb24geihBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBfZS5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIGVBKEEsZSx0KXtyZXR1cm4gbmV3IFByb21pc2UoST0+e2xldCByPWhJKCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBpKG8peyFvLmRhdGF8fCFvLmRhdGEuaWR8fG8uZGF0YS5pZCE9PXJ8fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLEkoby5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpyfSxlKSx0KX0pfWZ1bmN0aW9uIGhJKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBFQShBLGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBLmFwcGx5KGUsYXJndW1lbnRzKX19dmFye3RvU3RyaW5nOkRJfT1PYmplY3QucHJvdG90eXBlLHtnZXRQcm90b3R5cGVPZjpZQX09T2JqZWN0LHtpdGVyYXRvcjpPQSx0b1N0cmluZ1RhZzpJdH09U3ltYm9sLHFBPShBPT5lPT57bGV0IHQ9REkuY2FsbChlKTtyZXR1cm4gQVt0XXx8KEFbdF09dC5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpKX0pKE9iamVjdC5jcmVhdGUobnVsbCkpLFQ9QT0+KEE9QS50b0xvd2VyQ2FzZSgpLGU9PnFBKGUpPT09QSksVEE9QT0+ZT0+dHlwZW9mIGU9PT1BLHtpc0FycmF5OklBfT1BcnJheSx0QT1UQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gbEEoQSl7cmV0dXJuIEEhPT1udWxsJiYhdEEoQSkmJkEuY29uc3RydWN0b3IhPT1udWxsJiYhdEEoQS5jb25zdHJ1Y3RvcikmJkcoQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikmJkEuY29uc3RydWN0b3IuaXNCdWZmZXIoQSl9dmFyIHJ0PVQoIkFycmF5QnVmZmVyIik7ZnVuY3Rpb24geUkoQSl7bGV0IGU7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz9lPUFycmF5QnVmZmVyLmlzVmlldyhBKTplPUEmJkEuYnVmZmVyJiZydChBLmJ1ZmZlciksZX12YXIgd0k9VEEoInN0cmluZyIpLEc9VEEoImZ1bmN0aW9uIiksaXQ9VEEoIm51bWJlciIpLGNBPUE9PkEhPT1udWxsJiZ0eXBlb2YgQT09Im9iamVjdCIsbUk9QT0+QT09PSEwfHxBPT09ITEsSEE9QT0+e2lmKHFBKEEpIT09Im9iamVjdCIpcmV0dXJuITE7bGV0IGU9WUEoQSk7cmV0dXJuKGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09bnVsbCkmJiEoSXQgaW4gQSkmJiEoT0EgaW4gQSl9LFNJPUE9PntpZighY0EoQSl8fGxBKEEpKXJldHVybiExO3RyeXtyZXR1cm4gT2JqZWN0LmtleXMoQSkubGVuZ3RoPT09MCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKEEpPT09T2JqZWN0LnByb3RvdHlwZX1jYXRjaHtyZXR1cm4hMX19LFJJPVQoIkRhdGUiKSxGST1UKCJGaWxlIiksa0k9QT0+ISEoQSYmdHlwZW9mIEEudXJpPCJ1IiksVUk9QT0+QSYmdHlwZW9mIEEuZ2V0UGFydHM8InUiLE5JPVQoIkJsb2IiKSxHST1UKCJGaWxlTGlzdCIpLGJJPUE9PmNBKEEpJiZHKEEucGlwZSk7ZnVuY3Rpb24gTEkoKXtyZXR1cm4gdHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp7fX12YXIgQXQ9TEkoKSxldD10eXBlb2YgQXQuRm9ybURhdGE8InUiP0F0LkZvcm1EYXRhOnZvaWQgMCxKST1BPT57aWYoIUEpcmV0dXJuITE7aWYoZXQmJkEgaW5zdGFuY2VvZiBldClyZXR1cm4hMDtsZXQgZT1ZQShBKTtpZighZXx8ZT09PU9iamVjdC5wcm90b3R5cGV8fCFHKEEuYXBwZW5kKSlyZXR1cm4hMTtsZXQgdD1xQShBKTtyZXR1cm4gdD09PSJmb3JtZGF0YSJ8fHQ9PT0ib2JqZWN0IiYmRyhBLnRvU3RyaW5nKSYmQS50b1N0cmluZygpPT09IltvYmplY3QgRm9ybURhdGFdIn0sTUk9VCgiVVJMU2VhcmNoUGFyYW1zIiksW0hJLFlJLE9JLHFJXT1bIlJlYWRhYmxlU3RyZWFtIiwiUmVxdWVzdCIsIlJlc3BvbnNlIiwiSGVhZGVycyJdLm1hcChUKSxUST1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywiIik7ZnVuY3Rpb24gZkEoQSxlLHthbGxPd25LZXlzOnQ9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgSSxyO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxJQShBKSlmb3IoST0wLHI9QS5sZW5ndGg7STxyO0krKyllLmNhbGwobnVsbCxBW0ldLEksQSk7ZWxzZXtpZihsQShBKSlyZXR1cm47bGV0IGk9dD9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKTpPYmplY3Qua2V5cyhBKSxvPWkubGVuZ3RoLGE7Zm9yKEk9MDtJPG87SSsrKWE9aVtJXSxlLmNhbGwobnVsbCxBW2FdLGEsQSl9fWZ1bmN0aW9uIG90KEEsZSl7aWYobEEoQSkpcmV0dXJuIG51bGw7ZT1lLnRvTG93ZXJDYXNlKCk7bGV0IHQ9T2JqZWN0LmtleXMoQSksST10Lmxlbmd0aCxyO2Zvcig7SS0tID4wOylpZihyPXRbSV0sZT09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4gcjtyZXR1cm4gbnVsbH12YXIgJD10eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6Z2xvYmFsLGd0PUE9PiF0QShBKSYmQSE9PSQ7ZnVuY3Rpb24gYWUoKXtsZXR7Y2FzZWxlc3M6QSxza2lwVW5kZWZpbmVkOmV9PWd0KHRoaXMpJiZ0aGlzfHx7fSx0PXt9LEk9KHIsaSk9PntpZihpPT09Il9fcHJvdG9fXyJ8fGk9PT0iY29uc3RydWN0b3IifHxpPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBvPUEmJm90KHQsaSl8fGk7SEEodFtvXSkmJkhBKHIpP3Rbb109YWUodFtvXSxyKTpIQShyKT90W29dPWFlKHt9LHIpOklBKHIpP3Rbb109ci5zbGljZSgpOighZXx8IXRBKHIpKSYmKHRbb109cil9O2ZvcihsZXQgcj0wLGk9YXJndW1lbnRzLmxlbmd0aDtyPGk7cisrKWFyZ3VtZW50c1tyXSYmZkEoYXJndW1lbnRzW3JdLEkpO3JldHVybiB0fXZhciBLST0oQSxlLHQse2FsbE93bktleXM6SX09e30pPT4oZkEoZSwocixpKT0+e3QmJkcocik/T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsaSx7dmFsdWU6RUEocix0KSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLGkse3ZhbHVlOnIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0se2FsbE93bktleXM6SX0pLEEpLFBJPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSkseEk9KEEsZSx0LEkpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSxJKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQS5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix7dmFsdWU6QSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse3ZhbHVlOmUucHJvdG90eXBlfSksdCYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSx0KX0sV0k9KEEsZSx0LEkpPT57bGV0IHIsaSxvLGE9e307aWYoZT1lfHx7fSxBPT1udWxsKXJldHVybiBlO2Rve2ZvcihyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLGk9ci5sZW5ndGg7aS0tID4wOylvPXJbaV0sKCFJfHxJKG8sQSxlKSkmJiFhW29dJiYoZVtvXT1BW29dLGFbb109ITApO0E9dCE9PSExJiZZQShBKX13aGlsZShBJiYoIXR8fHQoQSxlKSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gZX0sakk9KEEsZSx0KT0+e0E9U3RyaW5nKEEpLCh0PT09dm9pZCAwfHx0PkEubGVuZ3RoKSYmKHQ9QS5sZW5ndGgpLHQtPWUubGVuZ3RoO2xldCBJPUEuaW5kZXhPZihlLHQpO3JldHVybiBJIT09LTEmJkk9PT10fSx2ST1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoSUEoQSkpcmV0dXJuIEE7bGV0IGU9QS5sZW5ndGg7aWYoIWl0KGUpKXJldHVybiBudWxsO2xldCB0PW5ldyBBcnJheShlKTtmb3IoO2UtLSA+MDspdFtlXT1BW2VdO3JldHVybiB0fSxfST0oQT0+ZT0+QSYmZSBpbnN0YW5jZW9mIEEpKHR5cGVvZiBVaW50OEFycmF5PCJ1IiYmWUEoVWludDhBcnJheSkpLFpJPShBLGUpPT57bGV0IEk9KEEmJkFbT0FdKS5jYWxsKEEpLHI7Zm9yKDsocj1JLm5leHQoKSkmJiFyLmRvbmU7KXtsZXQgaT1yLnZhbHVlO2UuY2FsbChBLGlbMF0saVsxXSl9fSxWST0oQSxlKT0+e2xldCB0LEk9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspSS5wdXNoKHQpO3JldHVybiBJfSxYST1UKCJIVE1MRm9ybUVsZW1lbnQiKSx6ST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LEkscil7cmV0dXJuIEkudG9VcHBlckNhc2UoKStyfSksdHQ9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLCRJPVQoIlJlZ0V4cCIpLG50PShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSksST17fTtmQSh0LChyLGkpPT57bGV0IG87KG89ZShyLGksQSkpIT09ITEmJihJW2ldPW98fHIpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxJKX0sQXI9QT0+e250KEEsKGUsdCk9PntpZihHKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YodCkhPT0tMSlyZXR1cm4hMTtsZXQgST1BW3RdO2lmKEcoSSkpe2lmKGUuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gZSl7ZS53cml0YWJsZT0hMTtyZXR1cm59ZS5zZXR8fChlLnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCAnIit0KyInIil9KX19KX0sZXI9KEEsZSk9PntsZXQgdD17fSxJPXI9PntyLmZvckVhY2goaT0+e3RbaV09ITB9KX07cmV0dXJuIElBKEEpP0koQSk6SShTdHJpbmcoQSkuc3BsaXQoZSkpLHR9LHRyPSgpPT57fSxJcj0oQSxlKT0+QSE9bnVsbCYmTnVtYmVyLmlzRmluaXRlKEE9K0EpP0E6ZTtmdW5jdGlvbiBycihBKXtyZXR1cm4hIShBJiZHKEEuYXBwZW5kKSYmQVtJdF09PT0iRm9ybURhdGEiJiZBW09BXSl9dmFyIGlyPUE9PntsZXQgZT1uZXcgQXJyYXkoMTApLHQ9KEkscik9PntpZihjQShJKSl7aWYoZS5pbmRleE9mKEkpPj0wKXJldHVybjtpZihsQShJKSlyZXR1cm4gSTtpZighKCJ0b0pTT04iaW4gSSkpe2Vbcl09STtsZXQgaT1JQShJKT9bXTp7fTtyZXR1cm4gZkEoSSwobyxhKT0+e2xldCBRPXQobyxyKzEpOyF0QShRKSYmKGlbYV09USl9KSxlW3JdPXZvaWQgMCxpfX1yZXR1cm4gSX07cmV0dXJuIHQoQSwwKX0sb3I9VCgiQXN5bmNGdW5jdGlvbiIpLGdyPUE9PkEmJihjQShBKXx8RyhBKSkmJkcoQS50aGVuKSYmRyhBLmNhdGNoKSxhdD0oKEEsZSk9PkE/c2V0SW1tZWRpYXRlOmU/KCh0LEkpPT4oJC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoe3NvdXJjZTpyLGRhdGE6aX0pPT57cj09PSQmJmk9PT10JiZJLmxlbmd0aCYmSS5zaGlmdCgpKCl9LCExKSxyPT57SS5wdXNoKHIpLCQucG9zdE1lc3NhZ2UodCwiKiIpfSkpKGBheGlvc0Ake01hdGgucmFuZG9tKCl9YCxbXSk6dD0+c2V0VGltZW91dCh0KSkodHlwZW9mIHNldEltbWVkaWF0ZT09ImZ1bmN0aW9uIixHKCQucG9zdE1lc3NhZ2UpKSxucj10eXBlb2YgcXVldWVNaWNyb3Rhc2s8InUiP3F1ZXVlTWljcm90YXNrLmJpbmQoJCk6dHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLm5leHRUaWNrfHxhdCxhcj1BPT5BIT1udWxsJiZHKEFbT0FdKSxuPXtpc0FycmF5OklBLGlzQXJyYXlCdWZmZXI6cnQsaXNCdWZmZXI6bEEsaXNGb3JtRGF0YTpKSSxpc0FycmF5QnVmZmVyVmlldzp5SSxpc1N0cmluZzp3SSxpc051bWJlcjppdCxpc0Jvb2xlYW46bUksaXNPYmplY3Q6Y0EsaXNQbGFpbk9iamVjdDpIQSxpc0VtcHR5T2JqZWN0OlNJLGlzUmVhZGFibGVTdHJlYW06SEksaXNSZXF1ZXN0OllJLGlzUmVzcG9uc2U6T0ksaXNIZWFkZXJzOnFJLGlzVW5kZWZpbmVkOnRBLGlzRGF0ZTpSSSxpc0ZpbGU6RkksaXNSZWFjdE5hdGl2ZUJsb2I6a0ksaXNSZWFjdE5hdGl2ZTpVSSxpc0Jsb2I6TkksaXNSZWdFeHA6JEksaXNGdW5jdGlvbjpHLGlzU3RyZWFtOmJJLGlzVVJMU2VhcmNoUGFyYW1zOk1JLGlzVHlwZWRBcnJheTpfSSxpc0ZpbGVMaXN0OkdJLGZvckVhY2g6ZkEsbWVyZ2U6YWUsZXh0ZW5kOktJLHRyaW06VEksc3RyaXBCT006UEksaW5oZXJpdHM6eEksdG9GbGF0T2JqZWN0OldJLGtpbmRPZjpxQSxraW5kT2ZUZXN0OlQsZW5kc1dpdGg6akksdG9BcnJheTp2SSxmb3JFYWNoRW50cnk6WkksbWF0Y2hBbGw6VkksaXNIVE1MRm9ybTpYSSxoYXNPd25Qcm9wZXJ0eTp0dCxoYXNPd25Qcm9wOnR0LHJlZHVjZURlc2NyaXB0b3JzOm50LGZyZWV6ZU1ldGhvZHM6QXIsdG9PYmplY3RTZXQ6ZXIsdG9DYW1lbENhc2U6ekksbm9vcDp0cix0b0Zpbml0ZU51bWJlcjpJcixmaW5kS2V5Om90LGdsb2JhbDokLGlzQ29udGV4dERlZmluZWQ6Z3QsaXNTcGVjQ29tcGxpYW50Rm9ybTpycix0b0pTT05PYmplY3Q6aXIsaXNBc3luY0ZuOm9yLGlzVGhlbmFibGU6Z3Isc2V0SW1tZWRpYXRlOmF0LGFzYXA6bnIsaXNJdGVyYWJsZTphcn07dmFyIEY9Y2xhc3MgQSBleHRlbmRzIEVycm9ye3N0YXRpYyBmcm9tKGUsdCxJLHIsaSxvKXtsZXQgYT1uZXcgQShlLm1lc3NhZ2UsdHx8ZS5jb2RlLEkscixpKTtyZXR1cm4gYS5jYXVzZT1lLGEubmFtZT1lLm5hbWUsZS5zdGF0dXMhPW51bGwmJmEuc3RhdHVzPT1udWxsJiYoYS5zdGF0dXM9ZS5zdGF0dXMpLG8mJk9iamVjdC5hc3NpZ24oYSxvKSxhfWNvbnN0cnVjdG9yKGUsdCxJLHIsaSl7c3VwZXIoZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHt2YWx1ZTplLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0aGlzLmlzQXhpb3NFcnJvcj0hMCx0JiYodGhpcy5jb2RlPXQpLEkmJih0aGlzLmNvbmZpZz1JKSxyJiYodGhpcy5yZXF1ZXN0PXIpLGkmJih0aGlzLnJlc3BvbnNlPWksdGhpcy5zdGF0dXM9aS5zdGF0dXMpfXRvSlNPTigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpuLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMuc3RhdHVzfX19O0YuRVJSX0JBRF9PUFRJT05fVkFMVUU9IkVSUl9CQURfT1BUSU9OX1ZBTFVFIjtGLkVSUl9CQURfT1BUSU9OPSJFUlJfQkFEX09QVElPTiI7Ri5FQ09OTkFCT1JURUQ9IkVDT05OQUJPUlRFRCI7Ri5FVElNRURPVVQ9IkVUSU1FRE9VVCI7Ri5FUlJfTkVUV09SSz0iRVJSX05FVFdPUksiO0YuRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUz0iRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyI7Ri5FUlJfREVQUkVDQVRFRD0iRVJSX0RFUFJFQ0FURUQiO0YuRVJSX0JBRF9SRVNQT05TRT0iRVJSX0JBRF9SRVNQT05TRSI7Ri5FUlJfQkFEX1JFUVVFU1Q9IkVSUl9CQURfUkVRVUVTVCI7Ri5FUlJfQ0FOQ0VMRUQ9IkVSUl9DQU5DRUxFRCI7Ri5FUlJfTk9UX1NVUFBPUlQ9IkVSUl9OT1RfU1VQUE9SVCI7Ri5FUlJfSU5WQUxJRF9VUkw9IkVSUl9JTlZBTElEX1VSTCI7Ri5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEPSJFUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEIjt2YXIgdT1GO3ZhciBLQT1udWxsO2Z1bmN0aW9uIENlKEEpe3JldHVybiBuLmlzUGxhaW5PYmplY3QoQSl8fG4uaXNBcnJheShBKX1mdW5jdGlvbiBzdChBKXtyZXR1cm4gbi5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBzZShBLGUsdCl7cmV0dXJuIEE/QS5jb25jYXQoZSkubWFwKGZ1bmN0aW9uKHIsaSl7cmV0dXJuIHI9c3QociksIXQmJmk/IlsiK3IrIl0iOnJ9KS5qb2luKHQ/Ii4iOiIiKTplfWZ1bmN0aW9uIHNyKEEpe3JldHVybiBuLmlzQXJyYXkoQSkmJiFBLnNvbWUoQ2UpfXZhciBDcj1uLnRvRmxhdE9iamVjdChuLHt9LG51bGwsZnVuY3Rpb24oZSl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KGUpfSk7ZnVuY3Rpb24gQnIoQSxlLHQpe2lmKCFuLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO2U9ZXx8bmV3KEtBfHxGb3JtRGF0YSksdD1uLnRvRmxhdE9iamVjdCh0LHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oRSxwKXtyZXR1cm4hbi5pc1VuZGVmaW5lZChwW0VdKX0pO2xldCBJPXQubWV0YVRva2VucyxyPXQudmlzaXRvcnx8cyxpPXQuZG90cyxvPXQuaW5kZXhlcyxhPXQuQmxvYnx8dHlwZW9mIEJsb2I8InUiJiZCbG9iLFE9dC5tYXhEZXB0aD09PXZvaWQgMD8xMDA6dC5tYXhEZXB0aCxDPWEmJm4uaXNTcGVjQ29tcGxpYW50Rm9ybShlKTtpZighbi5pc0Z1bmN0aW9uKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gZyhjKXtpZihjPT09bnVsbClyZXR1cm4iIjtpZihuLmlzRGF0ZShjKSlyZXR1cm4gYy50b0lTT1N0cmluZygpO2lmKG4uaXNCb29sZWFuKGMpKXJldHVybiBjLnRvU3RyaW5nKCk7aWYoIUMmJm4uaXNCbG9iKGMpKXRocm93IG5ldyB1KCJCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLiIpO3JldHVybiBuLmlzQXJyYXlCdWZmZXIoYyl8fG4uaXNUeXBlZEFycmF5KGMpP0MmJnR5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFtjXSk6QnVmZmVyLmZyb20oYyk6Y31mdW5jdGlvbiBzKGMsRSxwKXtsZXQgSj1jO2lmKG4uaXNSZWFjdE5hdGl2ZShlKSYmbi5pc1JlYWN0TmF0aXZlQmxvYihjKSlyZXR1cm4gZS5hcHBlbmQoc2UocCxFLGkpLGcoYykpLCExO2lmKGMmJiFwJiZ0eXBlb2YgYz09Im9iamVjdCIpe2lmKG4uZW5kc1dpdGgoRSwie30iKSlFPUk/RTpFLnNsaWNlKDAsLTIpLGM9SlNPTi5zdHJpbmdpZnkoYyk7ZWxzZSBpZihuLmlzQXJyYXkoYykmJnNyKGMpfHwobi5pc0ZpbGVMaXN0KGMpfHxuLmVuZHNXaXRoKEUsIltdIikpJiYoSj1uLnRvQXJyYXkoYykpKXJldHVybiBFPXN0KEUpLEouZm9yRWFjaChmdW5jdGlvbih5LGspeyEobi5pc1VuZGVmaW5lZCh5KXx8eT09PW51bGwpJiZlLmFwcGVuZChvPT09ITA/c2UoW0VdLGssaSk6bz09PW51bGw/RTpFKyJbXSIsZyh5KSl9KSwhMX1yZXR1cm4gQ2UoYyk/ITA6KGUuYXBwZW5kKHNlKHAsRSxpKSxnKGMpKSwhMSl9bGV0IGY9W10sQj1PYmplY3QuYXNzaWduKENyLHtkZWZhdWx0VmlzaXRvcjpzLGNvbnZlcnRWYWx1ZTpnLGlzVmlzaXRhYmxlOkNlfSk7ZnVuY3Rpb24gbChjLEUscD0wKXtpZighbi5pc1VuZGVmaW5lZChjKSl7aWYocD5RKXRocm93IG5ldyB1KCJPYmplY3QgaXMgdG9vIGRlZXBseSBuZXN0ZWQgKCIrcCsiIGxldmVscykuIE1heCBkZXB0aDogIitRLHUuRVJSX0ZPUk1fREFUQV9ERVBUSF9FWENFRURFRCk7aWYoZi5pbmRleE9mKGMpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK0Uuam9pbigiLiIpKTtmLnB1c2goYyksbi5mb3JFYWNoKGMsZnVuY3Rpb24oRCx5KXsoIShuLmlzVW5kZWZpbmVkKEQpfHxEPT09bnVsbCkmJnIuY2FsbChlLEQsbi5pc1N0cmluZyh5KT95LnRyaW0oKTp5LEUsQikpPT09ITAmJmwoRCxFP0UuY29uY2F0KHkpOlt5XSxwKzEpfSksZi5wb3AoKX19aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSBtdXN0IGJlIGFuIG9iamVjdCIpO3JldHVybiBsKEEpLGV9dmFyIHY9QnI7ZnVuY3Rpb24gQ3QoQSl7bGV0IGU9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwL2csZnVuY3Rpb24oSSl7cmV0dXJuIGVbSV19KX1mdW5jdGlvbiBCdChBLGUpe3RoaXMuX3BhaXJzPVtdLEEmJnYoQSx0aGlzLGUpfXZhciBRdD1CdC5wcm90b3R5cGU7UXQuYXBwZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy5fcGFpcnMucHVzaChbZSx0XSl9O1F0LnRvU3RyaW5nPWZ1bmN0aW9uKGUpe2xldCB0PWU/ZnVuY3Rpb24oSSl7cmV0dXJuIGUuY2FsbCh0aGlzLEksQ3QpfTpDdDtyZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uKHIpe3JldHVybiB0KHJbMF0pKyI9Iit0KHJbMV0pfSwiIikuam9pbigiJiIpfTt2YXIgUEE9QnQ7ZnVuY3Rpb24gUXIoQSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIil9ZnVuY3Rpb24gdUEoQSxlLHQpe2lmKCFlKXJldHVybiBBO2xldCBJPXQmJnQuZW5jb2RlfHxRcixyPW4uaXNGdW5jdGlvbih0KT97c2VyaWFsaXplOnR9OnQsaT1yJiZyLnNlcmlhbGl6ZSxvO2lmKGk/bz1pKGUscik6bz1uLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcgUEEoZSxyKS50b1N0cmluZyhJKSxvKXtsZXQgYT1BLmluZGV4T2YoIiMiKTthIT09LTEmJihBPUEuc2xpY2UoMCxhKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrb31yZXR1cm4gQX12YXIgQmU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQsSSl7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpJP0kuc3luY2hyb25vdXM6ITEscnVuV2hlbjpJP0kucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe24uZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKEkpe0khPT1udWxsJiZlKEkpfSl9fSxRZT1CZTt2YXIgckE9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITEsbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzohMH07dmFyIEV0PXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM8InUiP1VSTFNlYXJjaFBhcmFtczpQQTt2YXIgbHQ9dHlwZW9mIEZvcm1EYXRhPCJ1Ij9Gb3JtRGF0YTpudWxsO3ZhciBjdD10eXBlb2YgQmxvYjwidSI/QmxvYjpudWxsO3ZhciBmdD17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczpFdCxGb3JtRGF0YTpsdCxCbG9iOmN0fSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07dmFyIGNlPXt9O29JKGNlLHtoYXNCcm93c2VyRW52OigpPT5sZSxoYXNTdGFuZGFyZEJyb3dzZXJFbnY6KCk9PkVyLGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjooKT0+bHIsbmF2aWdhdG9yOigpPT5FZSxvcmlnaW46KCk9PmNyfSk7dmFyIGxlPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLEVlPXR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3J8fHZvaWQgMCxFcj1sZSYmKCFFZXx8WyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZihFZS5wcm9kdWN0KTwwKSxscj10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8InUiJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsY3I9bGUmJndpbmRvdy5sb2NhdGlvbi5ocmVmfHwiaHR0cDovL2xvY2FsaG9zdCI7dmFyIGg9ey4uLmNlLC4uLmZ0fTtmdW5jdGlvbiBmZShBLGUpe3JldHVybiB2KEEsbmV3IGguY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMse3Zpc2l0b3I6ZnVuY3Rpb24odCxJLHIsaSl7cmV0dXJuIGguaXNOb2RlJiZuLmlzQnVmZmVyKHQpPyh0aGlzLmFwcGVuZChJLHQudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6aS5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LC4uLmV9KX1mdW5jdGlvbiBmcihBKXtyZXR1cm4gbi5tYXRjaEFsbCgvXHcrfFxbKFx3KildL2csQSkubWFwKGU9PmVbMF09PT0iW10iPyIiOmVbMV18fGVbMF0pfWZ1bmN0aW9uIHVyKEEpe2xldCBlPXt9LHQ9T2JqZWN0LmtleXMoQSksSSxyPXQubGVuZ3RoLGk7Zm9yKEk9MDtJPHI7SSsrKWk9dFtJXSxlW2ldPUFbaV07cmV0dXJuIGV9ZnVuY3Rpb24gZHIoQSl7ZnVuY3Rpb24gZSh0LEkscixpKXtsZXQgbz10W2krK107aWYobz09PSJfX3Byb3RvX18iKXJldHVybiEwO2xldCBhPU51bWJlci5pc0Zpbml0ZSgrbyksUT1pPj10Lmxlbmd0aDtyZXR1cm4gbz0hbyYmbi5pc0FycmF5KHIpP3IubGVuZ3RoOm8sUT8obi5oYXNPd25Qcm9wKHIsbyk/cltvXT1uLmlzQXJyYXkocltvXSk/cltvXS5jb25jYXQoSSk6W3Jbb10sSV06cltvXT1JLCFhKTooKCFyW29dfHwhbi5pc09iamVjdChyW29dKSkmJihyW29dPVtdKSxlKHQsSSxyW29dLGkpJiZuLmlzQXJyYXkocltvXSkmJihyW29dPXVyKHJbb10pKSwhYSl9aWYobi5pc0Zvcm1EYXRhKEEpJiZuLmlzRnVuY3Rpb24oQS5lbnRyaWVzKSl7bGV0IHQ9e307cmV0dXJuIG4uZm9yRWFjaEVudHJ5KEEsKEkscik9PntlKGZyKEkpLHIsdCwwKX0pLHR9cmV0dXJuIG51bGx9dmFyIHhBPWRyO3ZhciBpQT0oQSxlKT0+QSE9bnVsbCYmbi5oYXNPd25Qcm9wKEEsZSk/QVtlXTp2b2lkIDA7ZnVuY3Rpb24gcHIoQSxlLHQpe2lmKG4uaXNTdHJpbmcoQSkpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShBKSxuLnRyaW0oQSl9Y2F0Y2goSSl7aWYoSS5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBJfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkoQSl9dmFyIHVlPXt0cmFuc2l0aW9uYWw6ckEsYWRhcHRlcjpbInhociIsImh0dHAiLCJmZXRjaCJdLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7bGV0IEk9dC5nZXRDb250ZW50VHlwZSgpfHwiIixyPUkuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpPi0xLGk9bi5pc09iamVjdChlKTtpZihpJiZuLmlzSFRNTEZvcm0oZSkmJihlPW5ldyBGb3JtRGF0YShlKSksbi5pc0Zvcm1EYXRhKGUpKXJldHVybiByP0pTT04uc3RyaW5naWZ5KHhBKGUpKTplO2lmKG4uaXNBcnJheUJ1ZmZlcihlKXx8bi5pc0J1ZmZlcihlKXx8bi5pc1N0cmVhbShlKXx8bi5pc0ZpbGUoZSl8fG4uaXNCbG9iKGUpfHxuLmlzUmVhZGFibGVTdHJlYW0oZSkpcmV0dXJuIGU7aWYobi5pc0FycmF5QnVmZmVyVmlldyhlKSlyZXR1cm4gZS5idWZmZXI7aWYobi5pc1VSTFNlYXJjaFBhcmFtcyhlKSlyZXR1cm4gdC5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLCExKSxlLnRvU3RyaW5nKCk7bGV0IGE7aWYoaSl7bGV0IFE9aUEodGhpcywiZm9ybVNlcmlhbGl6ZXIiKTtpZihJLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpPi0xKXJldHVybiBmZShlLFEpLnRvU3RyaW5nKCk7aWYoKGE9bi5pc0ZpbGVMaXN0KGUpKXx8SS5pbmRleE9mKCJtdWx0aXBhcnQvZm9ybS1kYXRhIik+LTEpe2xldCBDPWlBKHRoaXMsImVudiIpLGc9QyYmQy5Gb3JtRGF0YTtyZXR1cm4gdihhP3siZmlsZXNbXSI6ZX06ZSxnJiZuZXcgZyxRKX19cmV0dXJuIGl8fHI/KHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iLCExKSxwcihlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXtsZXQgdD1pQSh0aGlzLCJ0cmFuc2l0aW9uYWwiKXx8dWUudHJhbnNpdGlvbmFsLEk9dCYmdC5mb3JjZWRKU09OUGFyc2luZyxyPWlBKHRoaXMsInJlc3BvbnNlVHlwZSIpLGk9cj09PSJqc29uIjtpZihuLmlzUmVzcG9uc2UoZSl8fG4uaXNSZWFkYWJsZVN0cmVhbShlKSlyZXR1cm4gZTtpZihlJiZuLmlzU3RyaW5nKGUpJiYoSSYmIXJ8fGkpKXtsZXQgYT0hKHQmJnQuc2lsZW50SlNPTlBhcnNpbmcpJiZpO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShlLGlBKHRoaXMsInBhcnNlUmV2aXZlciIpKX1jYXRjaChRKXtpZihhKXRocm93IFEubmFtZT09PSJTeW50YXhFcnJvciI/dS5mcm9tKFEsdS5FUlJfQkFEX1JFU1BPTlNFLHRoaXMsbnVsbCxpQSh0aGlzLCJyZXNwb25zZSIpKTpRfX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLGVudjp7Rm9ybURhdGE6aC5jbGFzc2VzLkZvcm1EYXRhLEJsb2I6aC5jbGFzc2VzLkJsb2J9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiwiQ29udGVudC1UeXBlIjp2b2lkIDB9fX07bi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCJdLEE9Pnt1ZS5oZWFkZXJzW0FdPXt9fSk7dmFyIG9BPXVlO3ZhciBocj1uLnRvT2JqZWN0U2V0KFsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0pLHV0PUE9PntsZXQgZT17fSx0LEkscjtyZXR1cm4gQSYmQS5zcGxpdChgCmApLmZvckVhY2goZnVuY3Rpb24obyl7cj1vLmluZGV4T2YoIjoiKSx0PW8uc3Vic3RyaW5nKDAscikudHJpbSgpLnRvTG93ZXJDYXNlKCksST1vLnN1YnN0cmluZyhyKzEpLnRyaW0oKSwhKCF0fHxlW3RdJiZoclt0XSkmJih0PT09InNldC1jb29raWUiP2VbdF0/ZVt0XS5wdXNoKEkpOmVbdF09W0ldOmVbdF09ZVt0XT9lW3RdKyIsICIrSTpJKX0pLGV9O3ZhciBkdD1TeW1ib2woImludGVybmFscyIpLERyPS9bXlx4MDlceDIwLVx4N0VceDgwLVx4RkZdL2c7ZnVuY3Rpb24geXIoQSl7bGV0IGU9MCx0PUEubGVuZ3RoO2Zvcig7ZTx0Oyl7bGV0IEk9QS5jaGFyQ29kZUF0KGUpO2lmKEkhPT05JiZJIT09MzIpYnJlYWs7ZSs9MX1mb3IoO3Q+ZTspe2xldCBJPUEuY2hhckNvZGVBdCh0LTEpO2lmKEkhPT05JiZJIT09MzIpYnJlYWs7dC09MX1yZXR1cm4gZT09PTAmJnQ9PT1BLmxlbmd0aD9BOkEuc2xpY2UoZSx0KX1mdW5jdGlvbiBkQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHdyKEEpe3JldHVybiB5cihBLnJlcGxhY2UoRHIsIiIpKX1mdW5jdGlvbiBXQShBKXtyZXR1cm4gQT09PSExfHxBPT1udWxsP0E6bi5pc0FycmF5KEEpP0EubWFwKFdBKTp3cihTdHJpbmcoQSkpfWZ1bmN0aW9uIG1yKEEpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD0vKFteXHMsOz1dKylccyooPzo9XHMqKFteLDtdKykpPy9nLEk7Zm9yKDtJPXQuZXhlYyhBKTspZVtJWzFdXT1JWzJdO3JldHVybiBlfXZhciBTcj1BPT4vXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBkZShBLGUsdCxJLHIpe2lmKG4uaXNGdW5jdGlvbihJKSlyZXR1cm4gSS5jYWxsKHRoaXMsZSx0KTtpZihyJiYoZT10KSwhIW4uaXNTdHJpbmcoZSkpe2lmKG4uaXNTdHJpbmcoSSkpcmV0dXJuIGUuaW5kZXhPZihJKSE9PS0xO2lmKG4uaXNSZWdFeHAoSSkpcmV0dXJuIEkudGVzdChlKX19ZnVuY3Rpb24gUnIoQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcZF0pKFx3KikvZywoZSx0LEkpPT50LnRvVXBwZXJDYXNlKCkrSSl9ZnVuY3Rpb24gRnIoQSxlKXtsZXQgdD1uLnRvQ2FtZWxDYXNlKCIgIitlKTtbImdldCIsInNldCIsImhhcyJdLmZvckVhY2goST0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLEkrdCx7dmFsdWU6ZnVuY3Rpb24ocixpLG8pe3JldHVybiB0aGlzW0ldLmNhbGwodGhpcyxlLHIsaSxvKX0sY29uZmlndXJhYmxlOiEwfSl9KX12YXIgZ0E9Y2xhc3N7Y29uc3RydWN0b3IoZSl7ZSYmdGhpcy5zZXQoZSl9c2V0KGUsdCxJKXtsZXQgcj10aGlzO2Z1bmN0aW9uIGkoYSxRLEMpe2xldCBnPWRBKFEpO2lmKCFnKXRocm93IG5ldyBFcnJvcigiaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtsZXQgcz1uLmZpbmRLZXkocixnKTsoIXN8fHJbc109PT12b2lkIDB8fEM9PT0hMHx8Qz09PXZvaWQgMCYmcltzXSE9PSExKSYmKHJbc3x8UV09V0EoYSkpfWxldCBvPShhLFEpPT5uLmZvckVhY2goYSwoQyxnKT0+aShDLGcsUSkpO2lmKG4uaXNQbGFpbk9iamVjdChlKXx8ZSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpbyhlLHQpO2Vsc2UgaWYobi5pc1N0cmluZyhlKSYmKGU9ZS50cmltKCkpJiYhU3IoZSkpbyh1dChlKSx0KTtlbHNlIGlmKG4uaXNPYmplY3QoZSkmJm4uaXNJdGVyYWJsZShlKSl7bGV0IGE9e30sUSxDO2ZvcihsZXQgZyBvZiBlKXtpZighbi5pc0FycmF5KGcpKXRocm93IFR5cGVFcnJvcigiT2JqZWN0IGl0ZXJhdG9yIG11c3QgcmV0dXJuIGEga2V5LXZhbHVlIHBhaXIiKTthW0M9Z1swXV09KFE9YVtDXSk/bi5pc0FycmF5KFEpP1suLi5RLGdbMV1dOltRLGdbMV1dOmdbMV19byhhLHQpfWVsc2UgZSE9bnVsbCYmaSh0LGUsSSk7cmV0dXJuIHRoaXN9Z2V0KGUsdCl7aWYoZT1kQShlKSxlKXtsZXQgST1uLmZpbmRLZXkodGhpcyxlKTtpZihJKXtsZXQgcj10aGlzW0ldO2lmKCF0KXJldHVybiByO2lmKHQ9PT0hMClyZXR1cm4gbXIocik7aWYobi5pc0Z1bmN0aW9uKHQpKXJldHVybiB0LmNhbGwodGhpcyxyLEkpO2lmKG4uaXNSZWdFeHAodCkpcmV0dXJuIHQuZXhlYyhyKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJwYXJzZXIgbXVzdCBiZSBib29sZWFufHJlZ2V4cHxmdW5jdGlvbiIpfX19aGFzKGUsdCl7aWYoZT1kQShlKSxlKXtsZXQgST1uLmZpbmRLZXkodGhpcyxlKTtyZXR1cm4hIShJJiZ0aGlzW0ldIT09dm9pZCAwJiYoIXR8fGRlKHRoaXMsdGhpc1tJXSxJLHQpKSl9cmV0dXJuITF9ZGVsZXRlKGUsdCl7bGV0IEk9dGhpcyxyPSExO2Z1bmN0aW9uIGkobyl7aWYobz1kQShvKSxvKXtsZXQgYT1uLmZpbmRLZXkoSSxvKTthJiYoIXR8fGRlKEksSVthXSxhLHQpKSYmKGRlbGV0ZSBJW2FdLHI9ITApfX1yZXR1cm4gbi5pc0FycmF5KGUpP2UuZm9yRWFjaChpKTppKGUpLHJ9Y2xlYXIoZSl7bGV0IHQ9T2JqZWN0LmtleXModGhpcyksST10Lmxlbmd0aCxyPSExO2Zvcig7SS0tOyl7bGV0IGk9dFtJXTsoIWV8fGRlKHRoaXMsdGhpc1tpXSxpLGUsITApKSYmKGRlbGV0ZSB0aGlzW2ldLHI9ITApfXJldHVybiByfW5vcm1hbGl6ZShlKXtsZXQgdD10aGlzLEk9e307cmV0dXJuIG4uZm9yRWFjaCh0aGlzLChyLGkpPT57bGV0IG89bi5maW5kS2V5KEksaSk7aWYobyl7dFtvXT1XQShyKSxkZWxldGUgdFtpXTtyZXR1cm59bGV0IGE9ZT9ScihpKTpTdHJpbmcoaSkudHJpbSgpO2EhPT1pJiZkZWxldGUgdFtpXSx0W2FdPVdBKHIpLElbYV09ITB9KSx0aGlzfWNvbmNhdCguLi5lKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywuLi5lKX10b0pTT04oZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gbi5mb3JFYWNoKHRoaXMsKEkscik9PntJIT1udWxsJiZJIT09ITEmJih0W3JdPWUmJm4uaXNBcnJheShJKT9JLmpvaW4oIiwgIik6SSl9KSx0fVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKX10b1N0cmluZygpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtlLHRdKT0+ZSsiOiAiK3QpLmpvaW4oYApgKX1nZXRTZXRDb29raWUoKXtyZXR1cm4gdGhpcy5nZXQoInNldC1jb29raWUiKXx8W119Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iQXhpb3NIZWFkZXJzIn1zdGF0aWMgZnJvbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXM/ZTpuZXcgdGhpcyhlKX1zdGF0aWMgY29uY2F0KGUsLi4udCl7bGV0IEk9bmV3IHRoaXMoZSk7cmV0dXJuIHQuZm9yRWFjaChyPT5JLnNldChyKSksSX1zdGF0aWMgYWNjZXNzb3IoZSl7bGV0IEk9KHRoaXNbZHRdPXRoaXNbZHRdPXthY2Nlc3NvcnM6e319KS5hY2Nlc3NvcnMscj10aGlzLnByb3RvdHlwZTtmdW5jdGlvbiBpKG8pe2xldCBhPWRBKG8pO0lbYV18fChGcihyLG8pLElbYV09ITApfXJldHVybiBuLmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGkpOmkoZSksdGhpc319O2dBLmFjY2Vzc29yKFsiQ29udGVudC1UeXBlIiwiQ29udGVudC1MZW5ndGgiLCJBY2NlcHQiLCJBY2NlcHQtRW5jb2RpbmciLCJVc2VyLUFnZW50IiwiQXV0aG9yaXphdGlvbiJdKTtuLnJlZHVjZURlc2NyaXB0b3JzKGdBLnByb3RvdHlwZSwoe3ZhbHVlOkF9LGUpPT57bGV0IHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQoSSl7dGhpc1t0XT1JfX19KTtuLmZyZWV6ZU1ldGhvZHMoZ0EpO3ZhciBTPWdBO2Z1bmN0aW9uIHBBKEEsZSl7bGV0IHQ9dGhpc3x8b0EsST1lfHx0LHI9Uy5mcm9tKEkuaGVhZGVycyksaT1JLmRhdGE7cmV0dXJuIG4uZm9yRWFjaChBLGZ1bmN0aW9uKGEpe2k9YS5jYWxsKHQsaSxyLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLHIubm9ybWFsaXplKCksaX1mdW5jdGlvbiBoQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfXZhciBwZT1jbGFzcyBleHRlbmRzIHV7Y29uc3RydWN0b3IoZSx0LEkpe3N1cGVyKGU/PyJjYW5jZWxlZCIsdS5FUlJfQ0FOQ0VMRUQsdCxJKSx0aGlzLm5hbWU9IkNhbmNlbGVkRXJyb3IiLHRoaXMuX19DQU5DRUxfXz0hMH19LHg9cGU7ZnVuY3Rpb24gREEoQSxlLHQpe2xldCBJPXQuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyF0LnN0YXR1c3x8IUl8fEkodC5zdGF0dXMpP0EodCk6ZShuZXcgdSgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Quc3RhdHVzLFt1LkVSUl9CQURfUkVRVUVTVCx1LkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IodC5zdGF0dXMvMTAwKS00XSx0LmNvbmZpZyx0LnJlcXVlc3QsdCkpfWZ1bmN0aW9uIGhlKEEpe2xldCBlPS9eKFstK1x3XXsxLDI1fSkoOj9cL1wvfDopLy5leGVjKEEpO3JldHVybiBlJiZlWzFdfHwiIn1mdW5jdGlvbiBrcihBLGUpe0E9QXx8MTA7bGV0IHQ9bmV3IEFycmF5KEEpLEk9bmV3IEFycmF5KEEpLHI9MCxpPTAsbztyZXR1cm4gZT1lIT09dm9pZCAwP2U6MWUzLGZ1bmN0aW9uKFEpe2xldCBDPURhdGUubm93KCksZz1JW2ldO298fChvPUMpLHRbcl09USxJW3JdPUM7bGV0IHM9aSxmPTA7Zm9yKDtzIT09cjspZis9dFtzKytdLHM9cyVBO2lmKHI9KHIrMSklQSxyPT09aSYmKGk9KGkrMSklQSksQy1vPGUpcmV0dXJuO2xldCBCPWcmJkMtZztyZXR1cm4gQj9NYXRoLnJvdW5kKGYqMWUzL0IpOnZvaWQgMH19dmFyIHB0PWtyO2Z1bmN0aW9uIFVyKEEsZSl7bGV0IHQ9MCxJPTFlMy9lLHIsaSxvPShDLGc9RGF0ZS5ub3coKSk9Pnt0PWcscj1udWxsLGkmJihjbGVhclRpbWVvdXQoaSksaT1udWxsKSxBKC4uLkMpfTtyZXR1cm5bKC4uLkMpPT57bGV0IGc9RGF0ZS5ub3coKSxzPWctdDtzPj1JP28oQyxnKToocj1DLGl8fChpPXNldFRpbWVvdXQoKCk9PntpPW51bGwsbyhyKX0sSS1zKSkpfSwoKT0+ciYmbyhyKV19dmFyIGh0PVVyO3ZhciBuQT0oQSxlLHQ9Myk9PntsZXQgST0wLHI9cHQoNTAsMjUwKTtyZXR1cm4gaHQoaT0+e2xldCBvPWkubG9hZGVkLGE9aS5sZW5ndGhDb21wdXRhYmxlP2kudG90YWw6dm9pZCAwLFE9YSE9bnVsbD9NYXRoLm1pbihvLGEpOm8sQz1NYXRoLm1heCgwLFEtSSksZz1yKEMpO0k9TWF0aC5tYXgoSSxRKTtsZXQgcz17bG9hZGVkOlEsdG90YWw6YSxwcm9ncmVzczphP1EvYTp2b2lkIDAsYnl0ZXM6QyxyYXRlOmd8fHZvaWQgMCxlc3RpbWF0ZWQ6ZyYmYT8oYS1RKS9nOnZvaWQgMCxldmVudDppLGxlbmd0aENvbXB1dGFibGU6YSE9bnVsbCxbZT8iZG93bmxvYWQiOiJ1cGxvYWQiXTohMH07QShzKX0sdCl9LERlPShBLGUpPT57bGV0IHQ9QSE9bnVsbDtyZXR1cm5bST0+ZVswXSh7bGVuZ3RoQ29tcHV0YWJsZTp0LHRvdGFsOkEsbG9hZGVkOkl9KSxlWzFdXX0seWU9QT0+KC4uLmUpPT5uLmFzYXAoKCk9PkEoLi4uZSkpO3ZhciBEdD1oLmhhc1N0YW5kYXJkQnJvd3NlckVudj8oKEEsZSk9PnQ9Pih0PW5ldyBVUkwodCxoLm9yaWdpbiksQS5wcm90b2NvbD09PXQucHJvdG9jb2wmJkEuaG9zdD09PXQuaG9zdCYmKGV8fEEucG9ydD09PXQucG9ydCkpKShuZXcgVVJMKGgub3JpZ2luKSxoLm5hdmlnYXRvciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdChoLm5hdmlnYXRvci51c2VyQWdlbnQpKTooKT0+ITA7dmFyIHl0PWguaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLGUsdCxJLHIsaSxvKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybjtsZXQgYT1bYCR7QX09JHtlbmNvZGVVUklDb21wb25lbnQoZSl9YF07bi5pc051bWJlcih0KSYmYS5wdXNoKGBleHBpcmVzPSR7bmV3IERhdGUodCkudG9VVENTdHJpbmcoKX1gKSxuLmlzU3RyaW5nKEkpJiZhLnB1c2goYHBhdGg9JHtJfWApLG4uaXNTdHJpbmcocikmJmEucHVzaChgZG9tYWluPSR7cn1gKSxpPT09ITAmJmEucHVzaCgic2VjdXJlIiksbi5pc1N0cmluZyhvKSYmYS5wdXNoKGBTYW1lU2l0ZT0ke299YCksZG9jdW1lbnQuY29va2llPWEuam9pbigiOyAiKX0scmVhZChBKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBudWxsO2xldCBlPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoPzpefDsgKSIrQSsiPShbXjtdKikiKSk7cmV0dXJuIGU/ZGVjb2RlVVJJQ29tcG9uZW50KGVbMV0pOm51bGx9LHJlbW92ZShBKXt0aGlzLndyaXRlKEEsIiIsRGF0ZS5ub3coKS04NjRlNSwiLyIpfX06e3dyaXRlKCl7fSxyZWFkKCl7cmV0dXJuIG51bGx9LHJlbW92ZSgpe319O2Z1bmN0aW9uIHdlKEEpe3JldHVybiB0eXBlb2YgQSE9InN0cmluZyI/ITE6L14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChBKX1mdW5jdGlvbiBtZShBLGUpe3JldHVybiBlP0EucmVwbGFjZSgvXC8/XC8kLywiIikrIi8iK2UucmVwbGFjZSgvXlwvKy8sIiIpOkF9ZnVuY3Rpb24geUEoQSxlLHQpe2xldCBJPSF3ZShlKTtyZXR1cm4gQSYmKEl8fHQ9PT0hMSk/bWUoQSxlKTplfXZhciB3dD1BPT5BIGluc3RhbmNlb2YgUz97Li4uQX06QTtmdW5jdGlvbiBLKEEsZSl7ZT1lfHx7fTtsZXQgdD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJoYXNPd25Qcm9wZXJ0eSIse3ZhbHVlOk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtmdW5jdGlvbiBJKEMsZyxzLGYpe3JldHVybiBuLmlzUGxhaW5PYmplY3QoQykmJm4uaXNQbGFpbk9iamVjdChnKT9uLm1lcmdlLmNhbGwoe2Nhc2VsZXNzOmZ9LEMsZyk6bi5pc1BsYWluT2JqZWN0KGcpP24ubWVyZ2Uoe30sZyk6bi5pc0FycmF5KGcpP2cuc2xpY2UoKTpnfWZ1bmN0aW9uIHIoQyxnLHMsZil7aWYobi5pc1VuZGVmaW5lZChnKSl7aWYoIW4uaXNVbmRlZmluZWQoQykpcmV0dXJuIEkodm9pZCAwLEMscyxmKX1lbHNlIHJldHVybiBJKEMsZyxzLGYpfWZ1bmN0aW9uIGkoQyxnKXtpZighbi5pc1VuZGVmaW5lZChnKSlyZXR1cm4gSSh2b2lkIDAsZyl9ZnVuY3Rpb24gbyhDLGcpe2lmKG4uaXNVbmRlZmluZWQoZykpe2lmKCFuLmlzVW5kZWZpbmVkKEMpKXJldHVybiBJKHZvaWQgMCxDKX1lbHNlIHJldHVybiBJKHZvaWQgMCxnKX1mdW5jdGlvbiBhKEMsZyxzKXtpZihuLmhhc093blByb3AoZSxzKSlyZXR1cm4gSShDLGcpO2lmKG4uaGFzT3duUHJvcChBLHMpKXJldHVybiBJKHZvaWQgMCxDKX1sZXQgUT17dXJsOmksbWV0aG9kOmksZGF0YTppLGJhc2VVUkw6byx0cmFuc2Zvcm1SZXF1ZXN0Om8sdHJhbnNmb3JtUmVzcG9uc2U6byxwYXJhbXNTZXJpYWxpemVyOm8sdGltZW91dDpvLHRpbWVvdXRNZXNzYWdlOm8sd2l0aENyZWRlbnRpYWxzOm8sd2l0aFhTUkZUb2tlbjpvLGFkYXB0ZXI6byxyZXNwb25zZVR5cGU6byx4c3JmQ29va2llTmFtZTpvLHhzcmZIZWFkZXJOYW1lOm8sb25VcGxvYWRQcm9ncmVzczpvLG9uRG93bmxvYWRQcm9ncmVzczpvLGRlY29tcHJlc3M6byxtYXhDb250ZW50TGVuZ3RoOm8sbWF4Qm9keUxlbmd0aDpvLGJlZm9yZVJlZGlyZWN0Om8sdHJhbnNwb3J0Om8saHR0cEFnZW50Om8saHR0cHNBZ2VudDpvLGNhbmNlbFRva2VuOm8sc29ja2V0UGF0aDpvLGFsbG93ZWRTb2NrZXRQYXRoczpvLHJlc3BvbnNlRW5jb2Rpbmc6byx2YWxpZGF0ZVN0YXR1czphLGhlYWRlcnM6KEMsZyxzKT0+cih3dChDKSx3dChnKSxzLCEwKX07cmV0dXJuIG4uZm9yRWFjaChPYmplY3Qua2V5cyh7Li4uQSwuLi5lfSksZnVuY3Rpb24oZyl7aWYoZz09PSJfX3Byb3RvX18ifHxnPT09ImNvbnN0cnVjdG9yInx8Zz09PSJwcm90b3R5cGUiKXJldHVybjtsZXQgcz1uLmhhc093blByb3AoUSxnKT9RW2ddOnIsZj1uLmhhc093blByb3AoQSxnKT9BW2ddOnZvaWQgMCxCPW4uaGFzT3duUHJvcChlLGcpP2VbZ106dm9pZCAwLGw9cyhmLEIsZyk7bi5pc1VuZGVmaW5lZChsKSYmcyE9PWF8fCh0W2ddPWwpfSksdH12YXIgakE9QT0+e2xldCBlPUsoe30sQSksdD1mPT5uLmhhc093blByb3AoZSxmKT9lW2ZdOnZvaWQgMCxJPXQoImRhdGEiKSxyPXQoIndpdGhYU1JGVG9rZW4iKSxpPXQoInhzcmZIZWFkZXJOYW1lIiksbz10KCJ4c3JmQ29va2llTmFtZSIpLGE9dCgiaGVhZGVycyIpLFE9dCgiYXV0aCIpLEM9dCgiYmFzZVVSTCIpLGc9dCgiYWxsb3dBYnNvbHV0ZVVybHMiKSxzPXQoInVybCIpO2lmKGUuaGVhZGVycz1hPVMuZnJvbShhKSxlLnVybD11QSh5QShDLHMsZyksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxRJiZhLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgoUS51c2VybmFtZXx8IiIpKyI6IisoUS5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoUS5wYXNzd29yZCkpOiIiKSkpLG4uaXNGb3JtRGF0YShJKSl7aWYoaC5oYXNTdGFuZGFyZEJyb3dzZXJFbnZ8fGguaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KWEuc2V0Q29udGVudFR5cGUodm9pZCAwKTtlbHNlIGlmKG4uaXNGdW5jdGlvbihJLmdldEhlYWRlcnMpKXtsZXQgZj1JLmdldEhlYWRlcnMoKSxCPVsiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiXTtPYmplY3QuZW50cmllcyhmKS5mb3JFYWNoKChbbCxjXSk9PntCLmluY2x1ZGVzKGwudG9Mb3dlckNhc2UoKSkmJmEuc2V0KGwsYyl9KX19aWYoaC5oYXNTdGFuZGFyZEJyb3dzZXJFbnYmJihuLmlzRnVuY3Rpb24ocikmJihyPXIoZSkpLHI9PT0hMHx8cj09bnVsbCYmRHQoZS51cmwpKSl7bGV0IEI9aSYmbyYmeXQucmVhZChvKTtCJiZhLnNldChpLEIpfXJldHVybiBlfTt2YXIgTnI9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1IixtdD1OciYmZnVuY3Rpb24oQSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsSSl7bGV0IHI9akEoQSksaT1yLmRhdGEsbz1TLmZyb20oci5oZWFkZXJzKS5ub3JtYWxpemUoKSx7cmVzcG9uc2VUeXBlOmEsb25VcGxvYWRQcm9ncmVzczpRLG9uRG93bmxvYWRQcm9ncmVzczpDfT1yLGcscyxmLEIsbDtmdW5jdGlvbiBjKCl7QiYmQigpLGwmJmwoKSxyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGcpLHIuc2lnbmFsJiZyLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZyl9bGV0IEU9bmV3IFhNTEh0dHBSZXF1ZXN0O0Uub3BlbihyLm1ldGhvZC50b1VwcGVyQ2FzZSgpLHIudXJsLCEwKSxFLnRpbWVvdXQ9ci50aW1lb3V0O2Z1bmN0aW9uIHAoKXtpZighRSlyZXR1cm47bGV0IEQ9Uy5mcm9tKCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gRSYmRS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksaz17ZGF0YTohYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj9FLnJlc3BvbnNlVGV4dDpFLnJlc3BvbnNlLHN0YXR1czpFLnN0YXR1cyxzdGF0dXNUZXh0OkUuc3RhdHVzVGV4dCxoZWFkZXJzOkQsY29uZmlnOkEscmVxdWVzdDpFfTtEQShmdW5jdGlvbihNKXt0KE0pLGMoKX0sZnVuY3Rpb24oTSl7SShNKSxjKCl9LGspLEU9bnVsbH0ib25sb2FkZW5kImluIEU/RS5vbmxvYWRlbmQ9cDpFLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFFfHxFLnJlYWR5U3RhdGUhPT00fHxFLnN0YXR1cz09PTAmJiEoRS5yZXNwb25zZVVSTCYmRS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQocCl9LEUub25hYm9ydD1mdW5jdGlvbigpe0UmJihJKG5ldyB1KCJSZXF1ZXN0IGFib3J0ZWQiLHUuRUNPTk5BQk9SVEVELEEsRSkpLEU9bnVsbCl9LEUub25lcnJvcj1mdW5jdGlvbih5KXtsZXQgaz15JiZ5Lm1lc3NhZ2U/eS5tZXNzYWdlOiJOZXR3b3JrIEVycm9yIixaPW5ldyB1KGssdS5FUlJfTkVUV09SSyxBLEUpO1ouZXZlbnQ9eXx8bnVsbCxJKFopLEU9bnVsbH0sRS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtsZXQgeT1yLnRpbWVvdXQ/InRpbWVvdXQgb2YgIityLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsaz1yLnRyYW5zaXRpb25hbHx8ckE7ci50aW1lb3V0RXJyb3JNZXNzYWdlJiYoeT1yLnRpbWVvdXRFcnJvck1lc3NhZ2UpLEkobmV3IHUoeSxrLmNsYXJpZnlUaW1lb3V0RXJyb3I/dS5FVElNRURPVVQ6dS5FQ09OTkFCT1JURUQsQSxFKSksRT1udWxsfSxpPT09dm9pZCAwJiZvLnNldENvbnRlbnRUeXBlKG51bGwpLCJzZXRSZXF1ZXN0SGVhZGVyImluIEUmJm4uZm9yRWFjaChvLnRvSlNPTigpLGZ1bmN0aW9uKHksayl7RS5zZXRSZXF1ZXN0SGVhZGVyKGsseSl9KSxuLmlzVW5kZWZpbmVkKHIud2l0aENyZWRlbnRpYWxzKXx8KEUud2l0aENyZWRlbnRpYWxzPSEhci53aXRoQ3JlZGVudGlhbHMpLGEmJmEhPT0ianNvbiImJihFLnJlc3BvbnNlVHlwZT1yLnJlc3BvbnNlVHlwZSksQyYmKFtmLGxdPW5BKEMsITApLEUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGYpKSxRJiZFLnVwbG9hZCYmKFtzLEJdPW5BKFEpLEUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixzKSxFLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZW5kIixCKSksKHIuY2FuY2VsVG9rZW58fHIuc2lnbmFsKSYmKGc9RD0+e0UmJihJKCFEfHxELnR5cGU/bmV3IHgobnVsbCxBLEUpOkQpLEUuYWJvcnQoKSxFPW51bGwpfSxyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnN1YnNjcmliZShnKSxyLnNpZ25hbCYmKHIuc2lnbmFsLmFib3J0ZWQ/ZygpOnIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixnKSkpO2xldCBKPWhlKHIudXJsKTtpZihKJiZoLnByb3RvY29scy5pbmRleE9mKEopPT09LTEpe0kobmV3IHUoIlVuc3VwcG9ydGVkIHByb3RvY29sICIrSisiOiIsdS5FUlJfQkFEX1JFUVVFU1QsQSkpO3JldHVybn1FLnNlbmQoaXx8bnVsbCl9KX07dmFyIEdyPShBLGUpPT57bGV0e2xlbmd0aDp0fT1BPUE/QS5maWx0ZXIoQm9vbGVhbik6W107aWYoZXx8dCl7bGV0IEk9bmV3IEFib3J0Q29udHJvbGxlcixyLGk9ZnVuY3Rpb24oQyl7aWYoIXIpe3I9ITAsYSgpO2xldCBnPUMgaW5zdGFuY2VvZiBFcnJvcj9DOnRoaXMucmVhc29uO0kuYWJvcnQoZyBpbnN0YW5jZW9mIHU/ZzpuZXcgeChnIGluc3RhbmNlb2YgRXJyb3I/Zy5tZXNzYWdlOmcpKX19LG89ZSYmc2V0VGltZW91dCgoKT0+e289bnVsbCxpKG5ldyB1KGB0aW1lb3V0IG9mICR7ZX1tcyBleGNlZWRlZGAsdS5FVElNRURPVVQpKX0sZSksYT0oKT0+e0EmJihvJiZjbGVhclRpbWVvdXQobyksbz1udWxsLEEuZm9yRWFjaChDPT57Qy51bnN1YnNjcmliZT9DLnVuc3Vic2NyaWJlKGkpOkMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGkpfSksQT1udWxsKX07QS5mb3JFYWNoKEM9PkMuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGkpKTtsZXR7c2lnbmFsOlF9PUk7cmV0dXJuIFEudW5zdWJzY3JpYmU9KCk9Pm4uYXNhcChhKSxRfX0sU3Q9R3I7dmFyIGJyPWZ1bmN0aW9uKihBLGUpe2xldCB0PUEuYnl0ZUxlbmd0aDtpZighZXx8dDxlKXt5aWVsZCBBO3JldHVybn1sZXQgST0wLHI7Zm9yKDtJPHQ7KXI9SStlLHlpZWxkIEEuc2xpY2UoSSxyKSxJPXJ9LExyPWFzeW5jIGZ1bmN0aW9uKihBLGUpe2ZvciBhd2FpdChsZXQgdCBvZiBKcihBKSl5aWVsZCpicih0LGUpfSxKcj1hc3luYyBmdW5jdGlvbiooQSl7aWYoQVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pe3lpZWxkKkE7cmV0dXJufWxldCBlPUEuZ2V0UmVhZGVyKCk7dHJ5e2Zvcig7Oyl7bGV0e2RvbmU6dCx2YWx1ZTpJfT1hd2FpdCBlLnJlYWQoKTtpZih0KWJyZWFrO3lpZWxkIEl9fWZpbmFsbHl7YXdhaXQgZS5jYW5jZWwoKX19LFNlPShBLGUsdCxJKT0+e2xldCByPUxyKEEsZSksaT0wLG8sYT1RPT57b3x8KG89ITAsSSYmSShRKSl9O3JldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe2FzeW5jIHB1bGwoUSl7dHJ5e2xldHtkb25lOkMsdmFsdWU6Z309YXdhaXQgci5uZXh0KCk7aWYoQyl7YSgpLFEuY2xvc2UoKTtyZXR1cm59bGV0IHM9Zy5ieXRlTGVuZ3RoO2lmKHQpe2xldCBmPWkrPXM7dChmKX1RLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoZykpfWNhdGNoKEMpe3Rocm93IGEoQyksQ319LGNhbmNlbChRKXtyZXR1cm4gYShRKSxyLnJldHVybigpfX0se2hpZ2hXYXRlck1hcms6Mn0pfTt2YXIgUnQ9NjQqMTAyNCx7aXNGdW5jdGlvbjp2QX09bixNcj0oKHtSZXF1ZXN0OkEsUmVzcG9uc2U6ZX0pPT4oe1JlcXVlc3Q6QSxSZXNwb25zZTplfSkpKG4uZ2xvYmFsKSx7UmVhZGFibGVTdHJlYW06RnQsVGV4dEVuY29kZXI6a3R9PW4uZ2xvYmFsLFV0PShBLC4uLmUpPT57dHJ5e3JldHVybiEhQSguLi5lKX1jYXRjaHtyZXR1cm4hMX19LEhyPUE9PntBPW4ubWVyZ2UuY2FsbCh7c2tpcFVuZGVmaW5lZDohMH0sTXIsQSk7bGV0e2ZldGNoOmUsUmVxdWVzdDp0LFJlc3BvbnNlOkl9PUEscj1lP3ZBKGUpOnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIixpPXZBKHQpLG89dkEoSSk7aWYoIXIpcmV0dXJuITE7bGV0IGE9ciYmdkEoRnQpLFE9ciYmKHR5cGVvZiBrdD09ImZ1bmN0aW9uIj8obD0+Yz0+bC5lbmNvZGUoYykpKG5ldyBrdCk6YXN5bmMgbD0+bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IHQobCkuYXJyYXlCdWZmZXIoKSkpLEM9aSYmYSYmVXQoKCk9PntsZXQgbD0hMSxjPW5ldyB0KGgub3JpZ2luLHtib2R5Om5ldyBGdCxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gbD0hMCwiaGFsZiJ9fSksRT1jLmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKTtyZXR1cm4gYy5ib2R5IT1udWxsJiZjLmJvZHkuY2FuY2VsKCksbCYmIUV9KSxnPW8mJmEmJlV0KCgpPT5uLmlzUmVhZGFibGVTdHJlYW0obmV3IEkoIiIpLmJvZHkpKSxzPXtzdHJlYW06ZyYmKGw9PmwuYm9keSl9O3ImJlsidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaChsPT57IXNbbF0mJihzW2xdPShjLEUpPT57bGV0IHA9YyYmY1tsXTtpZihwKXJldHVybiBwLmNhbGwoYyk7dGhyb3cgbmV3IHUoYFJlc3BvbnNlIHR5cGUgJyR7bH0nIGlzIG5vdCBzdXBwb3J0ZWRgLHUuRVJSX05PVF9TVVBQT1JULEUpfSl9KTtsZXQgZj1hc3luYyBsPT57aWYobD09bnVsbClyZXR1cm4gMDtpZihuLmlzQmxvYihsKSlyZXR1cm4gbC5zaXplO2lmKG4uaXNTcGVjQ29tcGxpYW50Rm9ybShsKSlyZXR1cm4oYXdhaXQgbmV3IHQoaC5vcmlnaW4se21ldGhvZDoiUE9TVCIsYm9keTpsfSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KGwpfHxuLmlzQXJyYXlCdWZmZXIobCkpcmV0dXJuIGwuYnl0ZUxlbmd0aDtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKGwpJiYobD1sKyIiKSxuLmlzU3RyaW5nKGwpKXJldHVybihhd2FpdCBRKGwpKS5ieXRlTGVuZ3RofSxCPWFzeW5jKGwsYyk9PntsZXQgRT1uLnRvRmluaXRlTnVtYmVyKGwuZ2V0Q29udGVudExlbmd0aCgpKTtyZXR1cm4gRT8/ZihjKX07cmV0dXJuIGFzeW5jIGw9PntsZXR7dXJsOmMsbWV0aG9kOkUsZGF0YTpwLHNpZ25hbDpKLGNhbmNlbFRva2VuOkQsdGltZW91dDp5LG9uRG93bmxvYWRQcm9ncmVzczprLG9uVXBsb2FkUHJvZ3Jlc3M6WixyZXNwb25zZVR5cGU6TSxoZWFkZXJzOkJBLHdpdGhDcmVkZW50aWFsczprQT0ic2FtZS1vcmlnaW4iLGZldGNoT3B0aW9uczpPZX09akEobCkscWU9ZXx8ZmV0Y2g7TT1NPyhNKyIiKS50b0xvd2VyQ2FzZSgpOiJ0ZXh0IjtsZXQgVUE9U3QoW0osRCYmRC50b0Fib3J0U2lnbmFsKCldLHkpLFFBPW51bGwsVj1VQSYmVUEudW5zdWJzY3JpYmUmJigoKT0+e1VBLnVuc3Vic2NyaWJlKCl9KSxUZTt0cnl7aWYoWiYmQyYmRSE9PSJnZXQiJiZFIT09ImhlYWQiJiYoVGU9YXdhaXQgQihCQSxwKSkhPT0wKXtsZXQgSD1uZXcgdChjLHttZXRob2Q6IlBPU1QiLGJvZHk6cCxkdXBsZXg6ImhhbGYifSksQUE7aWYobi5pc0Zvcm1EYXRhKHApJiYoQUE9SC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikpJiZCQS5zZXRDb250ZW50VHlwZShBQSksSC5ib2R5KXtsZXRbdGUsTkFdPURlKFRlLG5BKHllKFopKSk7cD1TZShILmJvZHksUnQsdGUsTkEpfX1uLmlzU3RyaW5nKGtBKXx8KGtBPWtBPyJpbmNsdWRlIjoib21pdCIpO2xldCBVPWkmJiJjcmVkZW50aWFscyJpbiB0LnByb3RvdHlwZTtpZihuLmlzRm9ybURhdGEocCkpe2xldCBIPUJBLmdldENvbnRlbnRUeXBlKCk7SCYmL15tdWx0aXBhcnRcL2Zvcm0tZGF0YS9pLnRlc3QoSCkmJiEvYm91bmRhcnk9L2kudGVzdChIKSYmQkEuZGVsZXRlKCJjb250ZW50LXR5cGUiKX1sZXQgS2U9ey4uLk9lLHNpZ25hbDpVQSxtZXRob2Q6RS50b1VwcGVyQ2FzZSgpLGhlYWRlcnM6QkEubm9ybWFsaXplKCkudG9KU09OKCksYm9keTpwLGR1cGxleDoiaGFsZiIsY3JlZGVudGlhbHM6VT9rQTp2b2lkIDB9O1FBPWkmJm5ldyB0KGMsS2UpO2xldCBqPWF3YWl0KGk/cWUoUUEsT2UpOnFlKGMsS2UpKSxQZT1nJiYoTT09PSJzdHJlYW0ifHxNPT09InJlc3BvbnNlIik7aWYoZyYmKGt8fFBlJiZWKSl7bGV0IEg9e307WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiaGVhZGVycyJdLmZvckVhY2goeGU9PntIW3hlXT1qW3hlXX0pO2xldCBBQT1uLnRvRmluaXRlTnVtYmVyKGouaGVhZGVycy5nZXQoImNvbnRlbnQtbGVuZ3RoIikpLFt0ZSxOQV09ayYmRGUoQUEsbkEoeWUoayksITApKXx8W107aj1uZXcgSShTZShqLmJvZHksUnQsdGUsKCk9PntOQSYmTkEoKSxWJiZWKCl9KSxIKX1NPU18fCJ0ZXh0IjtsZXQgckk9YXdhaXQgc1tuLmZpbmRLZXkocyxNKXx8InRleHQiXShqLGwpO3JldHVybiFQZSYmViYmVigpLGF3YWl0IG5ldyBQcm9taXNlKChILEFBKT0+e0RBKEgsQUEse2RhdGE6ckksaGVhZGVyczpTLmZyb20oai5oZWFkZXJzKSxzdGF0dXM6ai5zdGF0dXMsc3RhdHVzVGV4dDpqLnN0YXR1c1RleHQsY29uZmlnOmwscmVxdWVzdDpRQX0pfSl9Y2F0Y2goVSl7dGhyb3cgViYmVigpLFUmJlUubmFtZT09PSJUeXBlRXJyb3IiJiYvTG9hZCBmYWlsZWR8ZmV0Y2gvaS50ZXN0KFUubWVzc2FnZSk/T2JqZWN0LmFzc2lnbihuZXcgdSgiTmV0d29yayBFcnJvciIsdS5FUlJfTkVUV09SSyxsLFFBLFUmJlUucmVzcG9uc2UpLHtjYXVzZTpVLmNhdXNlfHxVfSk6dS5mcm9tKFUsVSYmVS5jb2RlLGwsUUEsVSYmVS5yZXNwb25zZSl9fX0sWXI9bmV3IE1hcCxSZT1BPT57bGV0IGU9QSYmQS5lbnZ8fHt9LHtmZXRjaDp0LFJlcXVlc3Q6SSxSZXNwb25zZTpyfT1lLGk9W0kscix0XSxvPWkubGVuZ3RoLGE9byxRLEMsZz1Zcjtmb3IoO2EtLTspUT1pW2FdLEM9Zy5nZXQoUSksQz09PXZvaWQgMCYmZy5zZXQoUSxDPWE/bmV3IE1hcDpIcihlKSksZz1DO3JldHVybiBDfSxIZz1SZSgpO3ZhciBGZT17aHR0cDpLQSx4aHI6bXQsZmV0Y2g6e2dldDpSZX19O24uZm9yRWFjaChGZSwoQSxlKT0+e2lmKEEpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwibmFtZSIse3ZhbHVlOmV9KX1jYXRjaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsImFkYXB0ZXJOYW1lIix7dmFsdWU6ZX0pfX0pO3ZhciBOdD1BPT5gLSAke0F9YCxxcj1BPT5uLmlzRnVuY3Rpb24oQSl8fEE9PT1udWxsfHxBPT09ITE7ZnVuY3Rpb24gVHIoQSxlKXtBPW4uaXNBcnJheShBKT9BOltBXTtsZXR7bGVuZ3RoOnR9PUEsSSxyLGk9e307Zm9yKGxldCBvPTA7bzx0O28rKyl7ST1BW29dO2xldCBhO2lmKHI9SSwhcXIoSSkmJihyPUZlWyhhPVN0cmluZyhJKSkudG9Mb3dlckNhc2UoKV0scj09PXZvaWQgMCkpdGhyb3cgbmV3IHUoYFVua25vd24gYWRhcHRlciAnJHthfSdgKTtpZihyJiYobi5pc0Z1bmN0aW9uKHIpfHwocj1yLmdldChlKSkpKWJyZWFrO2lbYXx8IiMiK29dPXJ9aWYoIXIpe2xldCBvPU9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW1EsQ10pPT5gYWRhcHRlciAke1F9IGArKEM9PT0hMT8iaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQiOiJpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCIpKSxhPXQ/by5sZW5ndGg+MT9gc2luY2UgOgpgK28ubWFwKE50KS5qb2luKGAKYCk6IiAiK050KG9bMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IHUoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIithLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gcn12YXIgX0E9e2dldEFkYXB0ZXI6VHIsYWRhcHRlcnM6RmV9O2Z1bmN0aW9uIGtlKEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyB4KG51bGwsQSl9ZnVuY3Rpb24gWkEoQSl7cmV0dXJuIGtlKEEpLEEuaGVhZGVycz1TLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9cEEuY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLF9BLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxvQS5hZGFwdGVyLEEpKEEpLnRoZW4oZnVuY3Rpb24oSSl7cmV0dXJuIGtlKEEpLEkuZGF0YT1wQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJKSxJLmhlYWRlcnM9Uy5mcm9tKEkuaGVhZGVycyksSX0sZnVuY3Rpb24oSSl7cmV0dXJuIGhBKEkpfHwoa2UoQSksSSYmSS5yZXNwb25zZSYmKEkucmVzcG9uc2UuZGF0YT1wQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJLnJlc3BvbnNlKSxJLnJlc3BvbnNlLmhlYWRlcnM9Uy5mcm9tKEkucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChJKX0pfXZhciBWQT0iMS4xNS4yIjt2YXIgWEE9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLGUpPT57WEFbQV09ZnVuY3Rpb24oSSl7cmV0dXJuIHR5cGVvZiBJPT09QXx8ImEiKyhlPDE/Im4gIjoiICIpK0F9fSk7dmFyIEd0PXt9O1hBLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsSSl7ZnVuY3Rpb24gcihpLG8pe3JldHVybiJbQXhpb3MgdiIrVkErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitpKyInIitvKyhJPyIuICIrSToiIil9cmV0dXJuKGksbyxhKT0+e2lmKGU9PT0hMSl0aHJvdyBuZXcgdShyKG8sIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpLHUuRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhR3Rbb10mJihHdFtvXT0hMCxjb25zb2xlLndhcm4ocihvLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLGU/ZShpLG8sYSk6ITB9fTtYQS5zcGVsbGluZz1mdW5jdGlvbihlKXtyZXR1cm4odCxJKT0+KGNvbnNvbGUud2FybihgJHtJfSBpcyBsaWtlbHkgYSBtaXNzcGVsbGluZyBvZiAke2V9YCksITApfTtmdW5jdGlvbiBLcihBLGUsdCl7aWYodHlwZW9mIEEhPSJvYmplY3QiKXRocm93IG5ldyB1KCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iix1LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtsZXQgST1PYmplY3Qua2V5cyhBKSxyPUkubGVuZ3RoO2Zvcig7ci0tID4wOyl7bGV0IGk9SVtyXSxvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpP2VbaV06dm9pZCAwO2lmKG8pe2xldCBhPUFbaV0sUT1hPT09dm9pZCAwfHxvKGEsaSxBKTtpZihRIT09ITApdGhyb3cgbmV3IHUoIm9wdGlvbiAiK2krIiBtdXN0IGJlICIrUSx1LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgbmV3IHUoIlVua25vd24gb3B0aW9uICIraSx1LkVSUl9CQURfT1BUSU9OKX19dmFyIHdBPXthc3NlcnRPcHRpb25zOktyLHZhbGlkYXRvcnM6WEF9O3ZhciBZPXdBLnZhbGlkYXRvcnMsYUE9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5kZWZhdWx0cz1lfHx7fSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgUWUscmVzcG9uc2U6bmV3IFFlfX1hc3luYyByZXF1ZXN0KGUsdCl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLl9yZXF1ZXN0KGUsdCl9Y2F0Y2goSSl7aWYoSSBpbnN0YW5jZW9mIEVycm9yKXtsZXQgcj17fTtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZShyKTpyPW5ldyBFcnJvcjtsZXQgaT0oKCk9PntpZighci5zdGFjaylyZXR1cm4iIjtsZXQgbz1yLnN0YWNrLmluZGV4T2YoYApgKTtyZXR1cm4gbz09PS0xPyIiOnIuc3RhY2suc2xpY2UobysxKX0pKCk7dHJ5e2lmKCFJLnN0YWNrKUkuc3RhY2s9aTtlbHNlIGlmKGkpe2xldCBvPWkuaW5kZXhPZihgCmApLGE9bz09PS0xPy0xOmkuaW5kZXhPZihgCmAsbysxKSxRPWE9PT0tMT8iIjppLnNsaWNlKGErMSk7U3RyaW5nKEkuc3RhY2spLmVuZHNXaXRoKFEpfHwoSS5zdGFjays9YApgK2kpfX1jYXRjaHt9fXRocm93IEl9fV9yZXF1ZXN0KGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sdD1LKHRoaXMuZGVmYXVsdHMsdCk7bGV0e3RyYW5zaXRpb25hbDpJLHBhcmFtc1NlcmlhbGl6ZXI6cixoZWFkZXJzOml9PXQ7SSE9PXZvaWQgMCYmd0EuYXNzZXJ0T3B0aW9ucyhJLHtzaWxlbnRKU09OUGFyc2luZzpZLnRyYW5zaXRpb25hbChZLmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOlkudHJhbnNpdGlvbmFsKFkuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpZLnRyYW5zaXRpb25hbChZLmJvb2xlYW4pLGxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc6WS50cmFuc2l0aW9uYWwoWS5ib29sZWFuKX0sITEpLHIhPW51bGwmJihuLmlzRnVuY3Rpb24ocik/dC5wYXJhbXNTZXJpYWxpemVyPXtzZXJpYWxpemU6cn06d0EuYXNzZXJ0T3B0aW9ucyhyLHtlbmNvZGU6WS5mdW5jdGlvbixzZXJpYWxpemU6WS5mdW5jdGlvbn0sITApKSx0LmFsbG93QWJzb2x1dGVVcmxzIT09dm9pZCAwfHwodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyE9PXZvaWQgMD90LmFsbG93QWJzb2x1dGVVcmxzPXRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHM6dC5hbGxvd0Fic29sdXRlVXJscz0hMCksd0EuYXNzZXJ0T3B0aW9ucyh0LHtiYXNlVXJsOlkuc3BlbGxpbmcoImJhc2VVUkwiKSx3aXRoWHNyZlRva2VuOlkuc3BlbGxpbmcoIndpdGhYU1JGVG9rZW4iKX0sITApLHQubWV0aG9kPSh0Lm1ldGhvZHx8dGhpcy5kZWZhdWx0cy5tZXRob2R8fCJnZXQiKS50b0xvd2VyQ2FzZSgpO2xldCBvPWkmJm4ubWVyZ2UoaS5jb21tb24saVt0Lm1ldGhvZF0pO2kmJm4uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSxsPT57ZGVsZXRlIGlbbF19KSx0LmhlYWRlcnM9Uy5jb25jYXQobyxpKTtsZXQgYT1bXSxRPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihjKXtpZih0eXBlb2YgYy5ydW5XaGVuPT0iZnVuY3Rpb24iJiZjLnJ1bldoZW4odCk9PT0hMSlyZXR1cm47UT1RJiZjLnN5bmNocm9ub3VzO2xldCBFPXQudHJhbnNpdGlvbmFsfHxyQTtFJiZFLmxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc/YS51bnNoaWZ0KGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpOmEucHVzaChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKX0pO2xldCBDPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oYyl7Qy5wdXNoKGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpfSk7bGV0IGcscz0wLGY7aWYoIVEpe2xldCBsPVtaQS5iaW5kKHRoaXMpLHZvaWQgMF07Zm9yKGwudW5zaGlmdCguLi5hKSxsLnB1c2goLi4uQyksZj1sLmxlbmd0aCxnPVByb21pc2UucmVzb2x2ZSh0KTtzPGY7KWc9Zy50aGVuKGxbcysrXSxsW3MrK10pO3JldHVybiBnfWY9YS5sZW5ndGg7bGV0IEI9dDtmb3IoO3M8Zjspe2xldCBsPWFbcysrXSxjPWFbcysrXTt0cnl7Qj1sKEIpfWNhdGNoKEUpe2MuY2FsbCh0aGlzLEUpO2JyZWFrfX10cnl7Zz1aQS5jYWxsKHRoaXMsQil9Y2F0Y2gobCl7cmV0dXJuIFByb21pc2UucmVqZWN0KGwpfWZvcihzPTAsZj1DLmxlbmd0aDtzPGY7KWc9Zy50aGVuKENbcysrXSxDW3MrK10pO3JldHVybiBnfWdldFVyaShlKXtlPUsodGhpcy5kZWZhdWx0cyxlKTtsZXQgdD15QShlLmJhc2VVUkwsZS51cmwsZS5hbGxvd0Fic29sdXRlVXJscyk7cmV0dXJuIHVBKHQsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKX19O24uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sZnVuY3Rpb24oZSl7YUEucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsSSl7cmV0dXJuIHRoaXMucmVxdWVzdChLKEl8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihJfHx7fSkuZGF0YX0pKX19KTtuLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KEkpe3JldHVybiBmdW5jdGlvbihpLG8sYSl7cmV0dXJuIHRoaXMucmVxdWVzdChLKGF8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOkk/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOmksZGF0YTpvfSkpfX1hQS5wcm90b3R5cGVbZV09dCgpLGFBLnByb3RvdHlwZVtlKyJGb3JtIl09dCghMCl9KTt2YXIgbUE9YUE7dmFyIFVlPWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihpKXt0PWl9KTtsZXQgST10aGlzO3RoaXMucHJvbWlzZS50aGVuKHI9PntpZighSS5fbGlzdGVuZXJzKXJldHVybjtsZXQgaT1JLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7aS0tID4wOylJLl9saXN0ZW5lcnNbaV0ocik7SS5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1yPT57bGV0IGksbz1uZXcgUHJvbWlzZShhPT57SS5zdWJzY3JpYmUoYSksaT1hfSkudGhlbihyKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXtJLnVuc3Vic2NyaWJlKGkpfSxvfSxlKGZ1bmN0aW9uKGksbyxhKXtJLnJlYXNvbnx8KEkucmVhc29uPW5ldyB4KGksbyxhKSx0KEkucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9dG9BYm9ydFNpZ25hbCgpe2xldCBlPW5ldyBBYm9ydENvbnRyb2xsZXIsdD1JPT57ZS5hYm9ydChJKX07cmV0dXJuIHRoaXMuc3Vic2NyaWJlKHQpLGUuc2lnbmFsLnVuc3Vic2NyaWJlPSgpPT50aGlzLnVuc3Vic2NyaWJlKHQpLGUuc2lnbmFsfXN0YXRpYyBzb3VyY2UoKXtsZXQgZTtyZXR1cm57dG9rZW46bmV3IEEoZnVuY3Rpb24ocil7ZT1yfSksY2FuY2VsOmV9fX0sYnQ9VWU7ZnVuY3Rpb24gTmUoQSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBBLmFwcGx5KG51bGwsdCl9fWZ1bmN0aW9uIEdlKEEpe3JldHVybiBuLmlzT2JqZWN0KEEpJiZBLmlzQXhpb3NFcnJvcj09PSEwfXZhciBiZT17Q29udGludWU6MTAwLFN3aXRjaGluZ1Byb3RvY29sczoxMDEsUHJvY2Vzc2luZzoxMDIsRWFybHlIaW50czoxMDMsT2s6MjAwLENyZWF0ZWQ6MjAxLEFjY2VwdGVkOjIwMixOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246MjAzLE5vQ29udGVudDoyMDQsUmVzZXRDb250ZW50OjIwNSxQYXJ0aWFsQ29udGVudDoyMDYsTXVsdGlTdGF0dXM6MjA3LEFscmVhZHlSZXBvcnRlZDoyMDgsSW1Vc2VkOjIyNixNdWx0aXBsZUNob2ljZXM6MzAwLE1vdmVkUGVybWFuZW50bHk6MzAxLEZvdW5kOjMwMixTZWVPdGhlcjozMDMsTm90TW9kaWZpZWQ6MzA0LFVzZVByb3h5OjMwNSxVbnVzZWQ6MzA2LFRlbXBvcmFyeVJlZGlyZWN0OjMwNyxQZXJtYW5lbnRSZWRpcmVjdDozMDgsQmFkUmVxdWVzdDo0MDAsVW5hdXRob3JpemVkOjQwMSxQYXltZW50UmVxdWlyZWQ6NDAyLEZvcmJpZGRlbjo0MDMsTm90Rm91bmQ6NDA0LE1ldGhvZE5vdEFsbG93ZWQ6NDA1LE5vdEFjY2VwdGFibGU6NDA2LFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDo0MDcsUmVxdWVzdFRpbWVvdXQ6NDA4LENvbmZsaWN0OjQwOSxHb25lOjQxMCxMZW5ndGhSZXF1aXJlZDo0MTEsUHJlY29uZGl0aW9uRmFpbGVkOjQxMixQYXlsb2FkVG9vTGFyZ2U6NDEzLFVyaVRvb0xvbmc6NDE0LFVuc3VwcG9ydGVkTWVkaWFUeXBlOjQxNSxSYW5nZU5vdFNhdGlzZmlhYmxlOjQxNixFeHBlY3RhdGlvbkZhaWxlZDo0MTcsSW1BVGVhcG90OjQxOCxNaXNkaXJlY3RlZFJlcXVlc3Q6NDIxLFVucHJvY2Vzc2FibGVFbnRpdHk6NDIyLExvY2tlZDo0MjMsRmFpbGVkRGVwZW5kZW5jeTo0MjQsVG9vRWFybHk6NDI1LFVwZ3JhZGVSZXF1aXJlZDo0MjYsUHJlY29uZGl0aW9uUmVxdWlyZWQ6NDI4LFRvb01hbnlSZXF1ZXN0czo0MjksUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOjQzMSxVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczo0NTEsSW50ZXJuYWxTZXJ2ZXJFcnJvcjo1MDAsTm90SW1wbGVtZW50ZWQ6NTAxLEJhZEdhdGV3YXk6NTAyLFNlcnZpY2VVbmF2YWlsYWJsZTo1MDMsR2F0ZXdheVRpbWVvdXQ6NTA0LEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOjUwNSxWYXJpYW50QWxzb05lZ290aWF0ZXM6NTA2LEluc3VmZmljaWVudFN0b3JhZ2U6NTA3LExvb3BEZXRlY3RlZDo1MDgsTm90RXh0ZW5kZWQ6NTEwLE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOjUxMSxXZWJTZXJ2ZXJJc0Rvd246NTIxLENvbm5lY3Rpb25UaW1lZE91dDo1MjIsT3JpZ2luSXNVbnJlYWNoYWJsZTo1MjMsVGltZW91dE9jY3VycmVkOjUyNCxTc2xIYW5kc2hha2VGYWlsZWQ6NTI1LEludmFsaWRTc2xDZXJ0aWZpY2F0ZTo1MjZ9O09iamVjdC5lbnRyaWVzKGJlKS5mb3JFYWNoKChbQSxlXSk9PntiZVtlXT1BfSk7dmFyIEx0PWJlO2Z1bmN0aW9uIEp0KEEpe2xldCBlPW5ldyBtQShBKSx0PUVBKG1BLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBuLmV4dGVuZCh0LG1BLnByb3RvdHlwZSxlLHthbGxPd25LZXlzOiEwfSksbi5leHRlbmQodCxlLG51bGwse2FsbE93bktleXM6ITB9KSx0LmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gSnQoSyhBLHIpKX0sdH12YXIgdz1KdChvQSk7dy5BeGlvcz1tQTt3LkNhbmNlbGVkRXJyb3I9eDt3LkNhbmNlbFRva2VuPWJ0O3cuaXNDYW5jZWw9aEE7dy5WRVJTSU9OPVZBO3cudG9Gb3JtRGF0YT12O3cuQXhpb3NFcnJvcj11O3cuQ2FuY2VsPXcuQ2FuY2VsZWRFcnJvcjt3LmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9O3cuc3ByZWFkPU5lO3cuaXNBeGlvc0Vycm9yPUdlO3cubWVyZ2VDb25maWc9Szt3LkF4aW9zSGVhZGVycz1TO3cuZm9ybVRvSlNPTj1BPT54QShuLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO3cuZ2V0QWRhcHRlcj1fQS5nZXRBZGFwdGVyO3cuSHR0cFN0YXR1c0NvZGU9THQ7dy5kZWZhdWx0PXc7dmFyIHNBPXc7dmFye0F4aW9zOk1uLEF4aW9zRXJyb3I6SG4sQ2FuY2VsZWRFcnJvcjpZbixpc0NhbmNlbDpPbixDYW5jZWxUb2tlbjpxbixWRVJTSU9OOlRuLGFsbDpLbixDYW5jZWw6UG4saXNBeGlvc0Vycm9yOnhuLHNwcmVhZDpXbix0b0Zvcm1EYXRhOmpuLEF4aW9zSGVhZGVyczp2bixIdHRwU3RhdHVzQ29kZTpfbixmb3JtVG9KU09OOlpuLGdldEFkYXB0ZXI6Vm4sbWVyZ2VDb25maWc6WG59PXNBO2FzeW5jIGZ1bmN0aW9uIFByKEEsZSl7bGV0IHQ9QSxJPW51bGw7aWYodD09bnVsbClJPW5ldyBXb3JrZXIobmV3IFVSTCgiLi93ZWItd29ya2Vycy9pdGstd2FzbS1waXBlbGluZS53b3JrZXIuanMiLGltcG9ydC5tZXRhLnVybCkse3R5cGU6Im1vZHVsZSJ9KTtlbHNlIGlmKHQuc3RhcnRzV2l0aCgiaHR0cCIpKXtsZXQgcj1hd2FpdCBzQS5nZXQodCx7cmVzcG9uc2VUeXBlOiJibG9iIixwYXJhbXM6ZX0pLGk9VVJMLmNyZWF0ZU9iamVjdFVSTChyLmRhdGEpO0k9bmV3IFdvcmtlcihpLHt0eXBlOiJtb2R1bGUifSl9ZWxzZSBJPW5ldyBXb3JrZXIodCx7dHlwZToibW9kdWxlIn0pO3JldHVybiBJfXZhciBTQT1QcjtmdW5jdGlvbiBNdChBKXtsZXQgZT1nZShBKSx0PUE7cmV0dXJuIHQudGVybWluYXRlZD0hMSx0LndvcmtlclByb3h5PWUsdC5vcmlnaW5hbFRlcm1pbmF0ZT10LnRlcm1pbmF0ZSx0LnRlcm1pbmF0ZT0oKT0+e3QudGVybWluYXRlZD0hMCx0LndvcmtlclByb3h5W29lXSgpLHQub3JpZ2luYWxUZXJtaW5hdGUoKX0se3dvcmtlclByb3h5OmUsd29ya2VyOnR9fWFzeW5jIGZ1bmN0aW9uIHhyKEEsZSx0KXtsZXQgSTtpZihBIT1udWxsKXtsZXQgaT1BO3JldHVybiBpLndvcmtlclByb3h5IT09dm9pZCAwPyhJPWkud29ya2VyUHJveHkse3dvcmtlclByb3h5Okksd29ya2VyOml9KTpNdChBKX1sZXQgcj1hd2FpdCBTQShlLHQpO3JldHVybiBNdChyKX12YXIgSHQ9eHI7dmFyIFJBLFcsSmUsTGU9e2Vudjp7ZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aDpmdW5jdGlvbihBKXtKZT1uZXcgVWludDhBcnJheShXLmV4cG9ydHMubWVtb3J5LmJ1ZmZlcil9fX0sekE9Y2xhc3N7aW5pdCgpe3JldHVybiBSQXx8KHR5cGVvZiBmZXRjaDwidSI/UkE9ZmV0Y2goImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsIitZdCkudGhlbihlPT5lLmFycmF5QnVmZmVyKCkpLnRoZW4oZT0+V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSxMZSkpLnRoZW4odGhpcy5faW5pdCk6UkE9V2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoQnVmZmVyLmZyb20oWXQsImJhc2U2NCIpLExlKS50aGVuKHRoaXMuX2luaXQpLFJBKX1faW5pdChlKXtXPWUuaW5zdGFuY2UsTGUuZW52LmVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgoMCl9ZGVjb2RlKGUsdD0wKXtpZighVyl0aHJvdyBuZXcgRXJyb3IoIlpTVEREZWNvZGVyOiBBd2FpdCAuaW5pdCgpIGJlZm9yZSBkZWNvZGluZy4iKTtsZXQgST1lLmJ5dGVMZW5ndGgscj1XLmV4cG9ydHMubWFsbG9jKEkpO0plLnNldChlLHIpLHQ9dHx8TnVtYmVyKFcuZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKHIsSSkpO2xldCBpPVcuZXhwb3J0cy5tYWxsb2ModCksbz1XLmV4cG9ydHMuWlNURF9kZWNvbXByZXNzKGksdCxyLEkpLGE9SmUuc2xpY2UoaSxpK28pO3JldHVybiBXLmV4cG9ydHMuZnJlZShyKSxXLmV4cG9ydHMuZnJlZShpKSxhfX0sWXQ9IkFHRnpiUUVBQUFBQmJnNWdBMzkvZndGL1lBRi9BWDlnQW45L0FHQUJmd0JnQlg5L2YzOS9BWDlnQTM5L2Z3QmdCSDkvZjM4QmYyQUFBWDlnQW45L0FYOWdCMzkvZjM5L2YzOEJmMkFDZjM4QmZtQUlmMzkvZjM5L2YzOEJmMkFGZjM5L2YzOEFZQTUvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9BaWNCQTJWdWRoOWxiWE5qY21sd2RHVnVYMjV2ZEdsbWVWOXRaVzF2Y25sZlozSnZkM1JvQUFNREl5SUhBQUFCQVFNSEF3RUFDUVFBQlFFSUNBRUZCZ1FFQkFNR0FBQUtBQVVMREEwR0JBVUJjQUVCQVFVSEFRR0FBb0NBQWdZSUFYOEJRWUNqQkFzSHJnRUxCbTFsYlc5eWVRSUFCbTFoYkd4dll3QUZCR1p5WldVQUJneGFVMVJFWDJselJYSnliM0lBRWhsYVUxUkVYMlpwYm1SRVpXTnZiWEJ5WlhOelpXUlRhWHBsQUJ3UFdsTlVSRjlrWldOdmJYQnlaWE56QUNJWlgxOXBibVJwY21WamRGOW1kVzVqZEdsdmJsOTBZV0pzWlFFQUVGOWZaWEp5Ym05ZmJHOWpZWFJwYjI0QUFRbHpkR0ZqYTFOaGRtVUFCd3h6ZEdGamExSmxjM1J2Y21VQUNBcHpkR0ZqYTBGc2JHOWpBQWtLaS9JQklnVUFRWVFmQ3pNQkFYOGdBZ1JBSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FEUVFGcUlRTWdBVUVCYWlFQklBSkJBV3NpQWcwQUN3c2dBQXNwQVFGL0lBSUVRQ0FBSVFNRFFDQURJQUU2QUFBZ0EwRUJhaUVESUFKQkFXc2lBZzBBQ3dzZ0FBdHNBUUovUVlBZktBSUFJZ0VnQUVFSGFrRjRjU0lDYWlFQUFrQWdBa0VBSUFBZ0FVMGJEUUFnQUQ4QVFSQjBTd1JBSUFBL0FFRVFkR3RCLy84RGFrRVFka0FBUVg5R0JIOUJBQVZCQUJBQVFRRUxSUTBCQzBHQUh5QUFOZ0lBSUFFUEMwR0VIMEV3TmdJQVFYOEx1U2NCQzM4akFFRVFheUlLSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkI5QUZOQkVCQmlCOG9BZ0FpQmtFUUlBQkJDMnBCZUhFZ0FFRUxTUnNpQlVFRGRpSUFkaUlCUVFOeEJFQUNRQ0FCUVg5elFRRnhJQUJxSWdKQkEzUWlBVUd3SDJvaUFDQUJRYmdmYWlnQ0FDSUJLQUlJSWdSR0JFQkJpQjhnQmtGK0lBSjNjVFlDQUF3QkN5QUVJQUEyQWd3Z0FDQUVOZ0lJQ3lBQlFRaHFJUUFnQVNBQ1FRTjBJZ0pCQTNJMkFnUWdBU0FDYWlJQklBRW9BZ1JCQVhJMkFnUU1Ed3NnQlVHUUh5Z0NBQ0lIVFEwQklBRUVRQUpBUVFJZ0FIUWlBa0VBSUFKcmNpQUJJQUIwY1dnaUFVRURkQ0lBUWJBZmFpSUNJQUJCdUI5cUtBSUFJZ0FvQWdnaUJFWUVRRUdJSHlBR1FYNGdBWGR4SWdZMkFnQU1BUXNnQkNBQ05nSU1JQUlnQkRZQ0NBc2dBQ0FGUVFOeU5nSUVJQUFnQldvaUNDQUJRUU4wSWdFZ0JXc2lCRUVCY2pZQ0JDQUFJQUZxSUFRMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFGQm5COG9BZ0FoQWdKL0lBWkJBU0FIUVFOMmRDSURjVVVFUUVHSUh5QURJQVp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBeUFCSUFJMkFnZ2dBeUFDTmdJTUlBSWdBVFlDRENBQ0lBTTJBZ2dMSUFCQkNHb2hBRUdjSHlBSU5nSUFRWkFmSUFRMkFnQU1Ed3RCakI4b0FnQWlDMFVOQVNBTGFFRUNkRUc0SVdvb0FnQWlBaWdDQkVGNGNTQUZheUVESUFJaEFRTkFBa0FnQVNnQ0VDSUFSUVJBSUFFb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBRmF5SUJJQU1nQVNBRFNTSUJHeUVESUFBZ0FpQUJHeUVDSUFBaEFRd0JDd3NnQWlnQ0dDRUpJQUlnQWlnQ0RDSUVSd1JBUVpnZktBSUFHaUFDS0FJSUlnQWdCRFlDRENBRUlBQTJBZ2dNRGdzZ0FrRVVhaUlCS0FJQUlnQkZCRUFnQWlnQ0VDSUFSUTBESUFKQkVHb2hBUXNEUUNBQklRZ2dBQ0lFUVJScUlnRW9BZ0FpQUEwQUlBUkJFR29oQVNBRUtBSVFJZ0FOQUFzZ0NFRUFOZ0lBREEwTFFYOGhCU0FBUWI5L1N3MEFJQUJCQzJvaUFFRjRjU0VGUVl3ZktBSUFJZ2hGRFFCQkFDQUZheUVEQWtBQ1FBSkFBbjlCQUNBRlFZQUNTUTBBR2tFZklBVkIvLy8vQjBzTkFCb2dCVUVtSUFCQkNIWm5JZ0JyZGtFQmNTQUFRUUYwYTBFK2Fnc2lCMEVDZEVHNElXb29BZ0FpQVVVRVFFRUFJUUFNQVF0QkFDRUFJQVZCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VDQTBBQ1FDQUJLQUlFUVhoeElBVnJJZ1lnQTA4TkFDQUJJUVFnQmlJRERRQkJBQ0VESUFFaEFBd0RDeUFBSUFFb0FoUWlCaUFHSUFFZ0FrRWRka0VFY1dvb0FoQWlBVVliSUFBZ0Joc2hBQ0FDUVFGMElRSWdBUTBBQ3dzZ0FDQUVja1VFUUVFQUlRUkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUdoQkFuUkJ1Q0ZxS0FJQUlRQUxJQUJGRFFFTEEwQWdBQ2dDQkVGNGNTQUZheUlDSUFOSklRRWdBaUFESUFFYklRTWdBQ0FFSUFFYklRUWdBQ2dDRUNJQkJIOGdBUVVnQUNnQ0ZBc2lBQTBBQ3dzZ0JFVU5BQ0FEUVpBZktBSUFJQVZyVHcwQUlBUW9BaGdoQnlBRUlBUW9BZ3dpQWtjRVFFR1lIeWdDQUJvZ0JDZ0NDQ0lBSUFJMkFnd2dBaUFBTmdJSURBd0xJQVJCRkdvaUFTZ0NBQ0lBUlFSQUlBUW9BaEFpQUVVTkF5QUVRUkJxSVFFTEEwQWdBU0VHSUFBaUFrRVVhaUlCS0FJQUlnQU5BQ0FDUVJCcUlRRWdBaWdDRUNJQURRQUxJQVpCQURZQ0FBd0xDeUFGUVpBZktBSUFJZ1JOQkVCQm5COG9BZ0FoQUFKQUlBUWdCV3NpQVVFUVR3UkFJQUFnQldvaUFpQUJRUUZ5TmdJRUlBQWdCR29nQVRZQ0FDQUFJQVZCQTNJMkFnUU1BUXNnQUNBRVFRTnlOZ0lFSUFBZ0JHb2lBU0FCS0FJRVFRRnlOZ0lFUVFBaEFrRUFJUUVMUVpBZklBRTJBZ0JCbkI4Z0FqWUNBQ0FBUVFocUlRQU1EUXNnQlVHVUh5Z0NBQ0lDU1FSQVFaUWZJQUlnQldzaUFUWUNBRUdnSDBHZ0h5Z0NBQ0lBSUFWcUlnSTJBZ0FnQWlBQlFRRnlOZ0lFSUFBZ0JVRURjallDQkNBQVFRaHFJUUFNRFF0QkFDRUFJQVZCTDJvaUF3Si9RZUFpS0FJQUJFQkI2Q0lvQWdBTUFRdEI3Q0pDZnpjQ0FFSGtJa0tBb0lDQWdJQUVOd0lBUWVBaUlBcEJER3BCY0hGQjJLclZxZ1Z6TmdJQVFmUWlRUUEyQWdCQnhDSkJBRFlDQUVHQUlBc2lBV29pQmtFQUlBRnJJZ2h4SWdFZ0JVME5ERUhBSWlnQ0FDSUVCRUJCdUNJb0FnQWlCeUFCYWlJSklBZE5JQVFnQ1VseURRMExBa0JCeENJdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVHZ0h5Z0NBQ0lFQkVCQnlDSWhBQU5BSUFRZ0FDZ0NBQ0lIVHdSQUlBY2dBQ2dDQkdvZ0JFc05Bd3NnQUNnQ0NDSUFEUUFMQzBFQUVBUWlBa0YvUmcwRElBRWhCa0hrSWlnQ0FDSUFRUUZySWdRZ0FuRUVRQ0FCSUFKcklBSWdCR3BCQUNBQWEzRnFJUVlMSUFVZ0JrOE5BMEhBSWlnQ0FDSUFCRUJCdUNJb0FnQWlCQ0FHYWlJSUlBUk5JQUFnQ0VseURRUUxJQVlRQkNJQUlBSkhEUUVNQlFzZ0JpQUNheUFJY1NJR0VBUWlBaUFBS0FJQUlBQW9BZ1JxUmcwQklBSWhBQXNnQUVGL1JnMEJJQVZCTUdvZ0JrMEVRQ0FBSVFJTUJBdEI2Q0lvQWdBaUFpQURJQVpyYWtFQUlBSnJjU0lDRUFSQmYwWU5BU0FDSUFacUlRWWdBQ0VDREFNTElBSkJmMGNOQWd0QnhDSkJ4Q0lvQWdCQkJISTJBZ0FMSUFFUUJDSUNRWDlHUVFBUUJDSUFRWDlHY2lBQUlBSk5jZzBGSUFBZ0Ftc2lCaUFGUVNocVRRMEZDMEc0SWtHNElpZ0NBQ0FHYWlJQU5nSUFRYndpS0FJQUlBQkpCRUJCdkNJZ0FEWUNBQXNDUUVHZ0h5Z0NBQ0lEQkVCQnlDSWhBQU5BSUFJZ0FDZ0NBQ0lCSUFBb0FnUWlCR3BHRFFJZ0FDZ0NDQ0lBRFFBTERBUUxRWmdmS0FJQUlnQkJBQ0FBSUFKTkcwVUVRRUdZSHlBQ05nSUFDMEVBSVFCQnpDSWdCallDQUVISUlpQUNOZ0lBUWFnZlFYODJBZ0JCckI5QjRDSW9BZ0EyQWdCQjFDSkJBRFlDQUFOQUlBQkJBM1FpQVVHNEgyb2dBVUd3SDJvaUJEWUNBQ0FCUWJ3ZmFpQUVOZ0lBSUFCQkFXb2lBRUVnUncwQUMwR1VIeUFHUVNocklnQkJlQ0FDYTBFSGNTSUJheUlFTmdJQVFhQWZJQUVnQW1vaUFUWUNBQ0FCSUFSQkFYSTJBZ1FnQUNBQ2FrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBUUxJQUlnQTAwZ0FTQURTM0lOQWlBQUtBSU1RUWh4RFFJZ0FDQUVJQVpxTmdJRVFhQWZJQU5CZUNBRGEwRUhjU0lBYWlJQk5nSUFRWlFmUVpRZktBSUFJQVpxSWdJZ0FHc2lBRFlDQUNBQklBQkJBWEkyQWdRZ0FpQURha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQU1MUVFBaEJBd0tDMEVBSVFJTUNBdEJtQjhvQWdBZ0Frc0VRRUdZSHlBQ05nSUFDeUFDSUFacUlRRkJ5Q0loQUFKQUFrQUNRQU5BSUFFZ0FDZ0NBRWNFUUNBQUtBSUlJZ0FOQVF3Q0N3c2dBQzBBREVFSWNVVU5BUXRCeUNJaEFBTkFJQU1nQUNnQ0FDSUJUd1JBSUFFZ0FDZ0NCR29pQkNBRFN3MERDeUFBS0FJSUlRQU1BQXNBQ3lBQUlBSTJBZ0FnQUNBQUtBSUVJQVpxTmdJRUlBSkJlQ0FDYTBFSGNXb2lCeUFGUVFOeU5nSUVJQUZCZUNBQmEwRUhjV29pQmlBRklBZHFJZ1ZySVFBZ0F5QUdSZ1JBUWFBZklBVTJBZ0JCbEI5QmxCOG9BZ0FnQUdvaUFEWUNBQ0FGSUFCQkFYSTJBZ1FNQ0F0Qm5COG9BZ0FnQmtZRVFFR2NIeUFGTmdJQVFaQWZRWkFmS0FJQUlBQnFJZ0EyQWdBZ0JTQUFRUUZ5TmdJRUlBQWdCV29nQURZQ0FBd0lDeUFHS0FJRUlnTkJBM0ZCQVVjTkJpQURRWGh4SVFrZ0EwSC9BVTBFUUNBR0tBSU1JZ0VnQmlnQ0NDSUNSZ1JBUVlnZlFZZ2ZLQUlBUVg0Z0EwRURkbmR4TmdJQURBY0xJQUlnQVRZQ0RDQUJJQUkyQWdnTUJnc2dCaWdDR0NFSUlBWWdCaWdDRENJQ1J3UkFJQVlvQWdnaUFTQUNOZ0lNSUFJZ0FUWUNDQXdGQ3lBR1FSUnFJZ0VvQWdBaUEwVUVRQ0FHS0FJUUlnTkZEUVFnQmtFUWFpRUJDd05BSUFFaEJDQURJZ0pCRkdvaUFTZ0NBQ0lERFFBZ0FrRVFhaUVCSUFJb0FoQWlBdzBBQ3lBRVFRQTJBZ0FNQkF0QmxCOGdCa0VvYXlJQVFYZ2dBbXRCQjNFaUFXc2lDRFlDQUVHZ0h5QUJJQUpxSWdFMkFnQWdBU0FJUVFGeU5nSUVJQUFnQW1wQktEWUNCRUdrSDBId0lpZ0NBRFlDQUNBRElBUkJKeUFFYTBFSGNXcEJMMnNpQUNBQUlBTkJFR3BKR3lJQlFSczJBZ1FnQVVIUUlpa0NBRGNDRUNBQlFjZ2lLUUlBTndJSVFkQWlJQUZCQ0dvMkFnQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFkUWlRUUEyQWdBZ0FVRVlhaUVBQTBBZ0FFRUhOZ0lFSUFCQkNHb2dBRUVFYWlFQUlBUkpEUUFMSUFFZ0EwWU5BQ0FCSUFFb0FnUkJmbkUyQWdRZ0F5QUJJQU5ySWdKQkFYSTJBZ1FnQVNBQ05nSUFJQUpCL3dGTkJFQWdBa0Y0Y1VHd0gyb2hBQUovUVlnZktBSUFJZ0ZCQVNBQ1FRTjJkQ0lDY1VVRVFFR0lIeUFCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQVNBQUlBTTJBZ2dnQVNBRE5nSU1JQU1nQURZQ0RDQURJQUUyQWdnTUFRdEJIeUVBSUFKQi8vLy9CMDBFUUNBQ1FTWWdBa0VJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBTWdBRFlDSENBRFFnQTNBaEFnQUVFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUJFRUJJQUIwSWdaeFJRUkFRWXdmSUFRZ0JuSTJBZ0FnQVNBRE5nSUFEQUVMSUFKQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQkFOQUlBUWlBU2dDQkVGNGNTQUNSZzBDSUFCQkhYWWhCQ0FBUVFGMElRQWdBU0FFUVFSeGFpSUdLQUlRSWdRTkFBc2dCaUFETmdJUUN5QURJQUUyQWhnZ0F5QUROZ0lNSUFNZ0F6WUNDQXdCQ3lBQktBSUlJZ0FnQXpZQ0RDQUJJQU0yQWdnZ0EwRUFOZ0lZSUFNZ0FUWUNEQ0FESUFBMkFnZ0xRWlFmS0FJQUlnQWdCVTBOQUVHVUh5QUFJQVZySWdFMkFnQkJvQjlCb0I4b0FnQWlBQ0FGYWlJQ05nSUFJQUlnQVVFQmNqWUNCQ0FBSUFWQkEzSTJBZ1FnQUVFSWFpRUFEQWdMUVlRZlFUQTJBZ0JCQUNFQURBY0xRUUFoQWdzZ0NFVU5BQUpBSUFZb0Fod2lBVUVDZEVHNElXb2lCQ2dDQUNBR1JnUkFJQVFnQWpZQ0FDQUNEUUZCakI5QmpCOG9BZ0JCZmlBQmQzRTJBZ0FNQWdzZ0NFRVFRUlFnQ0NnQ0VDQUdSaHRxSUFJMkFnQWdBa1VOQVFzZ0FpQUlOZ0lZSUFZb0FoQWlBUVJBSUFJZ0FUWUNFQ0FCSUFJMkFoZ0xJQVlvQWhRaUFVVU5BQ0FDSUFFMkFoUWdBU0FDTmdJWUN5QUFJQWxxSVFBZ0JpQUphaUlHS0FJRUlRTUxJQVlnQTBGK2NUWUNCQ0FGSUFCQkFYSTJBZ1FnQUNBRmFpQUFOZ0lBSUFCQi93Rk5CRUFnQUVGNGNVR3dIMm9oQVFKL1FZZ2ZLQUlBSWdKQkFTQUFRUU4yZENJQWNVVUVRRUdJSHlBQUlBSnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQVUyQWdnZ0FDQUZOZ0lNSUFVZ0FUWUNEQ0FGSUFBMkFnZ01BUXRCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQVVnQXpZQ0hDQUZRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlBa0VCSUFOMElnUnhSUVJBUVl3ZklBSWdCSEkyQWdBZ0FTQUZOZ0lBREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFnTkFJQUlpQVNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQWlBRFFRRjBJUU1nQVNBQ1FRUnhhaUlFS0FJUUlnSU5BQXNnQkNBRk5nSVFDeUFGSUFFMkFoZ2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUJLQUlJSWdBZ0JUWUNEQ0FCSUFVMkFnZ2dCVUVBTmdJWUlBVWdBVFlDRENBRklBQTJBZ2dMSUFkQkNHb2hBQXdDQ3dKQUlBZEZEUUFDUUNBRUtBSWNJZ0JCQW5SQnVDRnFJZ0VvQWdBZ0JFWUVRQ0FCSUFJMkFnQWdBZzBCUVl3ZklBaEJmaUFBZDNFaUNEWUNBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBUkdHMm9nQWpZQ0FDQUNSUTBCQ3lBQ0lBYzJBaGdnQkNnQ0VDSUFCRUFnQWlBQU5nSVFJQUFnQWpZQ0dBc2dCQ2dDRkNJQVJRMEFJQUlnQURZQ0ZDQUFJQUkyQWhnTEFrQWdBMEVQVFFSQUlBUWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0JHb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBUWdCVUVEY2pZQ0JDQUVJQVZxSWdJZ0EwRUJjallDQkNBQ0lBTnFJQU0yQWdBZ0EwSC9BVTBFUUNBRFFYaHhRYkFmYWlFQUFuOUJpQjhvQWdBaUFVRUJJQU5CQTNaMElnTnhSUVJBUVlnZklBRWdBM0kyQWdBZ0FBd0JDeUFBS0FJSUN5RUJJQUFnQWpZQ0NDQUJJQUkyQWd3Z0FpQUFOZ0lNSUFJZ0FUWUNDQXdCQzBFZklRQWdBMEgvLy84SFRRUkFJQU5CSmlBRFFRaDJaeUlBYTNaQkFYRWdBRUVCZEd0QlBtb2hBQXNnQWlBQU5nSWNJQUpDQURjQ0VDQUFRUUowUWJnaGFpRUJBa0FDUUNBSVFRRWdBSFFpQm5GRkJFQkJqQjhnQmlBSWNqWUNBQ0FCSUFJMkFnQU1BUXNnQTBFWklBQkJBWFpyUVFBZ0FFRWZSeHQwSVFBZ0FTZ0NBQ0VGQTBBZ0JTSUJLQUlFUVhoeElBTkdEUUlnQUVFZGRpRUdJQUJCQVhRaEFDQUJJQVpCQkhGcUlnWW9BaEFpQlEwQUN5QUdJQUkyQWhBTElBSWdBVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFFb0FnZ2lBQ0FDTmdJTUlBRWdBallDQ0NBQ1FRQTJBaGdnQWlBQk5nSU1JQUlnQURZQ0NBc2dCRUVJYWlFQURBRUxBa0FnQ1VVTkFBSkFJQUlvQWh3aUFFRUNkRUc0SVdvaUFTZ0NBQ0FDUmdSQUlBRWdCRFlDQUNBRURRRkJqQjhnQzBGK0lBQjNjVFlDQUF3Q0N5QUpRUkJCRkNBSktBSVFJQUpHRzJvZ0JEWUNBQ0FFUlEwQkN5QUVJQWsyQWhnZ0FpZ0NFQ0lBQkVBZ0JDQUFOZ0lRSUFBZ0JEWUNHQXNnQWlnQ0ZDSUFSUTBBSUFRZ0FEWUNGQ0FBSUFRMkFoZ0xBa0FnQTBFUFRRUkFJQUlnQXlBRmFpSUFRUU55TmdJRUlBQWdBbW9pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUlnQlVFRGNqWUNCQ0FDSUFWcUlnUWdBMEVCY2pZQ0JDQURJQVJxSUFNMkFnQWdCd1JBSUFkQmVIRkJzQjlxSVFCQm5COG9BZ0FoQVFKL1FRRWdCMEVEZG5RaUJTQUdjVVVFUUVHSUh5QUZJQVp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCaUFBSUFFMkFnZ2dCaUFCTmdJTUlBRWdBRFlDRENBQklBWTJBZ2dMUVp3ZklBUTJBZ0JCa0I4Z0F6WUNBQXNnQWtFSWFpRUFDeUFLUVJCcUpBQWdBQXZTQ3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQm1COG9BZ0JKRFFFZ0FDQUJhaUVBQWtBQ1FFR2NIeWdDQUNBQ1J3UkFJQUZCL3dGTkJFQWdBVUVEZGlFRUlBSW9BZ3dpQVNBQ0tBSUlJZ05HQkVCQmlCOUJpQjhvQWdCQmZpQUVkM0UyQWdBTUJRc2dBeUFCTmdJTUlBRWdBellDQ0F3RUN5QUNLQUlZSVFZZ0FpQUNLQUlNSWdGSEJFQWdBaWdDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFKQkZHb2lCQ2dDQUNJRFJRUkFJQUlvQWhBaUEwVU5BaUFDUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRktBSUVJZ0ZCQTNGQkEwY05Ba0dRSHlBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQlNBQU5nSUFEd3RCQUNFQkN5QUdSUTBBQWtBZ0FpZ0NIQ0lEUVFKMFFiZ2hhaUlFS0FJQUlBSkdCRUFnQkNBQk5nSUFJQUVOQVVHTUgwR01IeWdDQUVGK0lBTjNjVFlDQUF3Q0N5QUdRUkJCRkNBR0tBSVFJQUpHRzJvZ0FUWUNBQ0FCUlEwQkN5QUJJQVkyQWhnZ0FpZ0NFQ0lEQkVBZ0FTQUROZ0lRSUFNZ0FUWUNHQXNnQWlnQ0ZDSURSUTBBSUFFZ0F6WUNGQ0FESUFFMkFoZ0xJQUlnQlU4TkFDQUZLQUlFSWdGQkFYRkZEUUFDUUFKQUFrQUNRQ0FCUVFKeFJRUkFRYUFmS0FJQUlBVkdCRUJCb0I4Z0FqWUNBRUdVSDBHVUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FDUVp3ZktBSUFSdzBHUVpBZlFRQTJBZ0JCbkI5QkFEWUNBQThMUVp3ZktBSUFJQVZHQkVCQm5COGdBallDQUVHUUgwR1FIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQUlBSnFJQUEyQWdBUEN5QUJRWGh4SUFCcUlRQWdBVUgvQVUwRVFDQUJRUU4ySVFRZ0JTZ0NEQ0lCSUFVb0FnZ2lBMFlFUUVHSUgwR0lIeWdDQUVGK0lBUjNjVFlDQUF3RkN5QURJQUUyQWd3Z0FTQUROZ0lJREFRTElBVW9BaGdoQmlBRklBVW9BZ3dpQVVjRVFFR1lIeWdDQUJvZ0JTZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQVZCRkdvaUJDZ0NBQ0lEUlFSQUlBVW9BaEFpQTBVTkFpQUZRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGSUFGQmZuRTJBZ1FnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUF3REMwRUFJUUVMSUFaRkRRQUNRQ0FGS0FJY0lnTkJBblJCdUNGcUlnUW9BZ0FnQlVZRVFDQUVJQUUyQWdBZ0FRMEJRWXdmUVl3ZktBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0JVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FGS0FJUUlnTUVRQ0FCSUFNMkFoQWdBeUFCTmdJWUN5QUZLQUlVSWdORkRRQWdBU0FETmdJVUlBTWdBVFlDR0FzZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FDQUNRWndmS0FJQVJ3MEFRWkFmSUFBMkFnQVBDeUFBUWY4QlRRUkFJQUJCZUhGQnNCOXFJUUVDZjBHSUh5Z0NBQ0lEUVFFZ0FFRURkblFpQUhGRkJFQkJpQjhnQUNBRGNqWUNBQ0FCREFFTElBRW9BZ2dMSVFBZ0FTQUNOZ0lJSUFBZ0FqWUNEQ0FDSUFFMkFnd2dBaUFBTmdJSUR3dEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBSWdBellDSENBQ1FnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQUNRRUdNSHlnQ0FDSUVRUUVnQTNRaUIzRkZCRUJCakI4Z0JDQUhjallDQUNBQklBSTJBZ0FnQWlBQk5nSVlEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQVFOQUlBRWlCQ2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBU0FEUVFGMElRTWdCQ0FCUVFSeGFpSUhRUkJxS0FJQUlnRU5BQXNnQnlBQ05nSVFJQUlnQkRZQ0dBc2dBaUFDTmdJTUlBSWdBallDQ0F3QkN5QUVLQUlJSWdBZ0FqWUNEQ0FFSUFJMkFnZ2dBa0VBTmdJWUlBSWdCRFlDRENBQ0lBQTJBZ2dMUWFnZlFhZ2ZLQUlBUVFGcklnQkJmeUFBR3pZQ0FBc0xCQUFqQUFzR0FDQUFKQUFMRUFBakFDQUFhMEZ3Y1NJQUpBQWdBQXRLQVFGL0lBQWdBVWtFUUNBQUlBRWdBaEFDRHdzZ0FnUkFJQUFnQW1vaEF5QUJJQUpxSVFFRFFDQURRUUZySWdNZ0FVRUJheUlCTFFBQU9nQUFJQUpCQVdzaUFnMEFDd3NnQUF2OURnSVJmd0YrSXdCQk1Hc2lCeVFBUWJoL0lRZ0NRQ0FGUlEwQUlBUXNBQUFpQ1VIL0FYRWhDd0pBSUFsQkFFZ0VRQ0FMUWY0QWEwRUJkaUlHSUFWUERRSkJiQ0VJSUF0Qi93QnJJZ3RCL3dGTERRSWdCRUVCYWlFSVFRQWhCUU5BSUFVZ0MwOEVRQ0FMSVFnZ0JpRUxEQU1GSUFBZ0JXb2dDQ0FGUVFGMmFpSUVMUUFBUVFSMk9nQUFJQUFnQlVFQmNtb2dCQzBBQUVFUGNUb0FBQ0FGUVFKcUlRVU1BUXNBQ3dBTElBVWdDMDBOQVNBSFFmOEJOZ0lFSUFZZ0IwRUVhaUFIUVFocUlBUkJBV29pRGlBTEVBd2lCRUdJZjBzRVFDQUVJUWdNQWd0QlZDRUlJQWNvQWdnaUVFRUdTdzBCSUFjb0FnUWlFVUVCZENJSlFRSnFyVUlCSUJDdGhpSVlRUUVnRUhRaURVRUJhaUlGclVJQ2hueDhRZ3Q4UXZ6Ly8vLy8vLy8vL3dDRFF1UUNWZzBCUVZJaENDQVJRZjhCU3cwQklBMUJmM05CQW5SQjVBSnFyU0FSUVFGcUloVkJBWFN0SUJoOFFnaDhWQTBCSUFzZ0JHc2hGaUFFSUE1cUlSY2dCa0dBQkdvaUVpQUZRUUowYWlJUklBbHFRUUpxSVE0Z0JrR0VCR29oRTBHQWdBSWdFSFJCRUhZaENVRUFJUVZCQVNFUElBMUJBV3NpRkNFS0EwQWdCU0FWUmtVRVFBSkFJQVlnQlVFQmRDSUlhaThCQUNJRVFmLy9BMFlFUUNBVElBcEJBblJxSUFVNkFBSWdDa0VCYXlFS1FRRWhCQXdCQ3lBUFFRQWdDU0FFd1VvYklROExJQWdnRVdvZ0JEc0JBQ0FGUVFGcUlRVU1BUXNMSUFZZ0R6c0JnZ1FnQmlBUU93R0FCQUpBSUFvZ0ZFWUVRQ0FOUVFOMklRaENBQ0VZUVFBaER3TkFJQXdnRlVZRVFDQUlJQTFCQVhacVFRTnFJZ2xCQVhRaENFRUFJUVJCQUNFS0EwQkJBQ0VGSUFvZ0RVOE5CQU5BSUFWQkFrWkZCRUFnRXlBRklBbHNJQVJxSUJSeFFRSjBhaUFPSUFVZ0NtcHFMUUFBT2dBQ0lBVkJBV29oQlF3QkN3c2dDa0VDYWlFS0lBUWdDR29nRkhFaEJBd0FDd0FGSUFZZ0RFRUJkR291QVFBaENTQU9JQTlxSWdRZ0dEY0FBRUVJSVFVRFFDQUZJQWxPUlFSQUlBUWdCV29nR0RjQUFDQUZRUWhxSVFVTUFRc0xJQmhDZ1lLRWlKQ2d3SUFCZkNFWUlBeEJBV29oRENBSklBOXFJUThNQVFzQUN3QUxJQTFCQTNZZ0RVRUJkbXBCQTJvaENFRUFJUVVEUUNBTUlCVkdSUVJBUVFBaENTQUdJQXhCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQUpSa1VFUUNBVElBVkJBblJxSUF3NkFBSURRQ0FGSUFocUlCUnhJZ1VnQ2tzTkFBc2dDVUVCYWlFSkRBRUxDeUFNUVFGcUlRd01BUXNMUVg4aENDQUZEUUlMSUJCQkFXb2hDRUVBSVFVRFFDQUZJQTFHUlFSQUlCRWdFeUFGUVFKMGFpSU9MUUFDUVFGMGFpSUVJQVF2QVFBaUNVRUJhanNCQUNBT0lBZ2dDV2RCWUhOcUlnUTZBQU1nRGlBSklBUjBJQTFyT3dFQUlBVkJBV29oQlF3QkN3c0NRQUpBSUFZdkFZSUVCRUFnQjBFY2FpSUVJQmNnRmhBTklnaEJpSDlMRFFJZ0IwRVVhaUFFSUJJUURpQUhRUXhxSUFRZ0VoQU9RUUFoQlFOQUlBZEJIR29pQkJBUElBVkIrd0ZMY2cwQ0lBQWdCV29pQmlBSFFSUnFJQVFRRURvQUFDQUdJQWRCREdvZ0JCQVFPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVTUF3VWdBQ0FFYWlBSFFSUnFJQWRCSEdvaUJCQVFPZ0FBSUFZZ0IwRU1haUFFRUJBNkFBTWdCVUVFYWlFRkRBRUxBQXNBQ3lBSFFSeHFJZ1FnRnlBV0VBMGlDRUdJZjBzTkFTQUhRUlJxSUFRZ0VoQU9JQWRCREdvZ0JDQVNFQTVCQUNFRkEwQWdCMEVjYWlJRUVBOGdCVUg3QVV0eVJRUkFJQUFnQldvaUJpQUhRUlJxSUFRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVUZJQUFnQkdvZ0IwRVVhaUFIUVJ4cUlnUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQURJQVZCQkdvaEJRd0NDd3NMQW44RFFFRzZmeUVJSUFWQi9RRkxEUU1nQUNBRmFpSUdJQWRCRkdvZ0IwRWNhaUlKRUJFNkFBQWdCa0VCYWlFRUlBa1FEMEVEUmdSQUlBZEJER29oQ0VFQ0RBSUxJQVZCL0FGTERRTWdCaUFIUVF4cUlBZEJIR29pQkJBUk9nQUJJQVZCQW1vaEJTQUVFQTlCQTBjTkFBc2dBQ0FGYWlFRUlBZEJGR29oQ0VFREN5QUVJQWdnQjBFY2FoQVJPZ0FBSUFacUlBQnJJUWdNQVFzQ2Z3TkFRYnAvSVFnZ0JVSDlBVXNOQWlBQUlBVnFJZ1lnQjBFVWFpQUhRUnhxSWdrUUVEb0FBQ0FHUVFGcUlRUWdDUkFQUVFOR0JFQWdCMEVNYWlFSVFRSU1BZ3NnQlVIOEFVc05BaUFHSUFkQkRHb2dCMEVjYWlJRUVCQTZBQUVnQlVFQ2FpRUZJQVFRRDBFRFJ3MEFDeUFBSUFWcUlRUWdCMEVVYWlFSVFRTUxJQVFnQ0NBSFFSeHFFQkE2QUFBZ0Jtb2dBR3NoQ0FzZ0NFR0lmMHNOQVFzZ0NDRUVRUUFoQlNBQlFRQkJOQkFESVFsQkFDRUtBMEFnQkNBRlJ3UkFJQUFnQldvaUJpMEFBQ0lCUVF0TEJFQkJiQ0VJREFNRklBa2dBVUVDZEdvaUFTQUJLQUlBUVFGcU5nSUFJQVZCQVdvaEJVRUJJQVl0QUFCMFFRRjFJQXBxSVFvTUFnc0FDd3RCYkNFSUlBcEZEUUFnQ21jaUJVRWZjeUlCUVF0TERRQWdBMEVnSUFWck5nSUFRUUZCQWlBQmRDQUtheUlEWjBFZmN5SUJkQ0FEUncwQUlBQWdCR29nQVVFQmFpSUFPZ0FBSUFrZ0FFRUNkR29pQUNBQUtBSUFRUUZxTmdJQUlBa29BZ1FpQUVFQ1NTQUFRUUZ4Y2cwQUlBSWdCRUVCYWpZQ0FDQUxRUUZxSVFnTElBZEJNR29rQUNBSUM2QUZBUXgvSXdCQkVHc2lEQ1FBQW44Z0JFRUhUUVJBSUF4Q0FEY0RDQ0FNUVFocUlnVWdBeUFFRUFJYVFXd2dBQ0FCSUFJZ0JVRUlFQXdpQUNBQUlBUkxHeUFBSUFCQmlYOUpHd3dCQ3lBQVFRQWdBU2dDQUVFQmFpSU5RUUYwRUFNaEQwRlVJQU1vQUFBaUJrRVBjU0lBUVFwTERRQWFJQUlnQUVFRmFqWUNBQ0FESUFScUlnSkJCR3NoQnlBQ1FRZHJJUXNnQUVFR2FpRU9RUVFoQWlBR1FRUjJJUVZCSUNBQWRDSUlRUUZ5SVFsQkFDRUFRUUVoQmlBRElRUURRQUpBSUFaQkFYRkZCRUFEUUNBRlFYOXpRWUNBZ0lCNGNtZ2lCa0VZU1VVRVFDQUFRU1JxSVFBZ0JDQUxUUVIvSUFSQkEyb0ZJQVFnQzJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTElBSWdCa0VlY1NJS2FrRUNhaUVDSUFaQkFYWkJBMndnQUdvZ0JTQUtka0VEY1dvaUFDQU5UdzBCQW44Z0JDQUxTeUFDUVFOMklBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFRZ0IydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTElBVWdDRUVCYTNFaUJpQUlRUUYwUVFGcklnb2dDV3NpRUVrRWZ5QU9RUUZyQlNBRklBcHhJZ1VnRUVFQUlBVWdDRTRiYXlFR0lBNExJUVVnRHlBQVFRRjBhaUFHUVFGcklnbzdBUUFnQUVFQmFpRUFJQUlnQldvaEFpQUlRUUVnQm1zZ0NpQUdRUUJLR3lBSmFpSUpTZ1JBSUFsQkFrZ05BVUVnSUFsbklnVnJJUTVCQVNBRlFSOXpkQ0VJQ3lBQUlBMVBEUUFnQ2tFQVJ5RUdBbjhnQkNBTFN5QUNRUU4xSUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQUlnQkNBSGEwRURkR3BCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVNQVFzTFFXd2dDVUVCUncwQUdrRlFJQUFnRFVzTkFCcEJiQ0FDUVNCS0RRQWFJQUVnQUVFQmF6WUNBQ0FFSUFKQkIycEJBM1ZxSUFOckN5QU1RUkJxSkFBTDhnRUJBWDhnQWtVRVFDQUFRZ0EzQWdBZ0FFRUFOZ0lRSUFCQ0FEY0NDRUc0Znc4TElBQWdBVFlDRENBQUlBRkJCR28yQWhBZ0FrRUVUd1JBSUFBZ0FTQUNhaUlCUVFScklnTTJBZ2dnQUNBREtBQUFOZ0lBSUFGQkFXc3RBQUFpQVFSQUlBQWdBV2RCRjJzMkFnUWdBZzhMSUFCQkFEWUNCRUYvRHdzZ0FDQUJOZ0lJSUFBZ0FTMEFBQ0lETmdJQUFrQUNRQUpBSUFKQkFtc09BZ0VBQWdzZ0FDQUJMUUFDUVJCMElBTnlJZ00yQWdBTElBQWdBUzBBQVVFSWRDQURhallDQUFzZ0FTQUNha0VCYXkwQUFDSUJSUVJBSUFCQkFEWUNCRUZzRHdzZ0FDQUJaeUFDUVFOMGEwRUphallDQkNBQ0MwUUJBbjhnQVNBQ0x3RUFJZ01nQVNnQ0JHb2lCRFlDQkNBQUlBTkJBblJCb0IxcUtBSUFJQUVvQWdCQkFDQUVhM1p4TmdJQUlBRVFEeG9nQUNBQ1FRUnFOZ0lFQzU4QkFRUi9RUU1oQVNBQUtBSUVJZ0pCSUUwRVFDQUFLQUlJSWdFZ0FDZ0NFRThFUUNBQUlBSkJCM0UyQWdRZ0FDQUJJQUpCQTNacklnSTJBZ2dnQUNBQ0tBQUFOZ0lBUVFBUEN5QUFLQUlNSWdNZ0FVWUVRRUVCUVFJZ0FrRWdTUnNQQ3lBQUlBRWdBU0FEYXlBQ1FRTjJJZ1FnQVNBRWF5QURTU0lCR3lJRGF5SUVOZ0lJSUFBZ0FpQURRUU4wYXpZQ0JDQUFJQVFvQUFBMkFnQUxJQUVMU0FFRWZ5QUFLQUlFSUFBb0FnQkJBblJxSWdJdEFBSWdBaThCQUNFRUlBRWdBU2dDQkNJRklBSXRBQU1pQW1vMkFnUWdBQ0FFSUFFb0FnQWdCWFJCQUNBQ2EzWnFOZ0lBQzFJQkJIOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJQUl2QVFBaEJDQUJJQUl0QUFNaUFpQUJLQUlFYWlJRk5nSUVJQUFnQkNBQ1FRSjBRYUFkYWlnQ0FDQUJLQUlBUVFBZ0JXdDJjV28yQWdBTENBQWdBRUdJZjBzTEdnQWdBQVJBSUFFRVFDQUNJQUFnQVJFQ0FBOExJQUFRQmdzTHBnZ0NEWDhCZmlNQVFSQnJJZ2trQUNBSlFRQTJBZ3dnQ1VFQU5nSUlBbjhDUUNBRFFlZ0phaUFESUFsQkNHb2dDVUVNYWlBQklBSWdBMEdBQVdvUUN5SVBRWWgvU3cwQVFWUWdDU2dDRENJRUlBQW9BZ0FpQVVIL0FYRkJBV3BMRFFFYUlBQkJCR29oQ3lBQUlBRkIvNEdBZUhFZ0JFRVFkRUdBZ1B3SGNYSTJBZ0JCZnlBRUlBUkJBRWdiUVFGcUlRQkJBQ0VCSUFrb0FnZ2hCVUVBSVFJRFFDQUFJQUpHQkVBZ0JVRURheUVCUVFBaEFBTkFBa0JCQUNFQ0lBQWdBVTRFUUFOQUlBQWdCVTROQWlBRElBQWdBMnBCNkFscUxRQUFRUUowYWtGQWF5SUJJQUVvQWdBaUFVRUJhallDQUNBQklBTnFJQUE2QU9nSElBQkJBV29oQUF3QUN3QUZBMEFnQWtFRVJrVUVRQ0FESUFNZ0FDQUNhaUlIYWtIb0NXb3RBQUJCQW5ScVFVQnJJZ2dnQ0NnQ0FDSUlRUUZxTmdJQUlBTWdDR29nQnpvQTZBY2dBa0VCYWlFQ0RBRUxDeUFBUVFScUlRQU1BZ3NBQ3dzZ0JFRUJhaUVPSUFNb0FnQWhCMEVBSVFCQkFTRUlBMEFnQ0NBT1JnMERJQTRnQ0dzaEJDQURJQWhCQW5ScUtBSUFJUVVDUUFKQUFrQUNRQUpBQWtCQkFTQUlkRUVCZFNJTlFRRnJEZ2dBQVFRQ0JBUUVBd1FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFBSVFFRFFDQUNJQVpHRFFVZ0F5QUNJQWRxYWkwQTZBY2hDaUFMSUFGQkFYUnFJZ3dnQkRvQUFTQU1JQW82QUFBZ0FrRUJhaUVDSUFGQkFXb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQ2lBQUlRRURRQ0FDSUFwR0RRUWdDeUFCUVFGMGFpSUdJQU1nQWlBSGFtb3RBT2dISWd3NkFBSWdCaUFFT2dBQklBWWdERG9BQUNBR0lBUTZBQU1nQWtFQmFpRUNJQUZCQW1vaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hCaUFFUVFoMFFZRCtBM0VoQkNBQUlRRURRQ0FDSUFaR0RRTWdDeUFCUVFGMGFpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK053QUFJQUpCQVdvaEFpQUJRUVJxSVFFTUFBc0FDMEVBSVFJZ0JVRUFJQVZCQUVvYklRWWdCRUVJZEVHQS9nTnhJUVFnQUNFQkEwQWdBaUFHUmcwQ0lBc2dBVUVCZEdvaUNpQUVJQU1nQWlBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0loRTNBQWdnQ2lBUk53QUFJQUpCQVdvaEFpQUJRUWhxSVFFTUFBc0FDMEVBSVFFZ0JVRUFJQVZCQUVvYklRb2dCRUVJZEVHQS9nTnhJUXdnQUNFRUEwQWdBU0FLUmcwQklBc2dCRUVCZEdvaEVDQU1JQU1nQVNBSGFtb3RBT2dIY3ExQ2dZQ0VnSkNBd0FCK0lSRkJBQ0VDQTBBZ0FpQU5Ua1VFUUNBUUlBSkJBWFJxSWdZZ0VUY0FHQ0FHSUJFM0FCQWdCaUFSTndBSUlBWWdFVGNBQUNBQ1FSQnFJUUlNQVFzTElBRkJBV29oQVNBRUlBMXFJUVFNQUFzQUN5QUlRUUZxSVFnZ0JTQUhhaUVISUFVZ0RXd2dBR29oQUF3QUN3QUZJQU1nQWtFQ2RHb2lCMEZBYXlBQk5nSUFJQUpCQVdvaEFpQUhLQUlBSUFGcUlRRU1BUXNBQ3dBTElBOExJQWxCRUdva0FBdnlBZ0VHZnlNQVFTQnJJZ1VrQUNBRUtBSUFJUVlnQlVFTWFpQUNJQU1RRFNJRFFZaC9UUVJBSUFSQkJHb2hBaUFBSUFGcUlnbEJBMnNoQkVFQUlBWkJFSFpyUVI5eElRTURRQ0FGUVF4cUVBOGdBQ0FFVDNKRkJFQWdBaUFGS0FJTUlnWWdCU2dDRUNJSGRDQURka0VCZEdvaUNDMEFBU0VLSUFBZ0NDMEFBRG9BQUNBQ0lBWWdCeUFLYWlJR2RDQURka0VCZEdvaUJ5MEFBQ0VJSUFVZ0JpQUhMUUFCYWpZQ0VDQUFJQWc2QUFFZ0FFRUNhaUVBREFFTEN3TkFJQVZCREdvUUR5RUhJQVVvQWd3aEJpQUZLQUlRSVFRZ0FDQUpUeUFIY2tVRVFDQUNJQVlnQkhRZ0EzWkJBWFJxSWdZdEFBQWhCeUFGSUFRZ0JpMEFBV28yQWhBZ0FDQUhPZ0FBSUFCQkFXb2hBQXdCQ3dzRFFDQUFJQWxQUlFSQUlBSWdCaUFFZENBRGRrRUJkR29pQnkwQUFTRUlJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdCQ0FJYWlFRURBRUxDMEZzUVd3Z0FTQUZLQUlVSUFVb0FoaEhHeUFFUVNCSEd5RURDeUFGUVNCcUpBQWdBd3ZQRkFFamZ5TUFRZEFBYXlJRkpBQkJiQ0VKQWtBZ0EwRUtTUTBBQWtBZ0F5QUNMd0FFSWdjZ0FpOEFBQ0lJSUFJdkFBSWlEV3BxUVFacUlneEpEUUFnQkM4QkFpRUdJQVZCUEdvZ0FrRUdhaUlDSUFnUURTSUpRWWgvU3cwQklBVkJLR29nQWlBSWFpSUNJQTBRRFNJSlFZaC9TdzBCSUFWQkZHb2dBaUFOYWlJQ0lBY1FEU0lKUVloL1N3MEJJQVVnQWlBSGFpQURJQXhyRUEwaUNVR0lmMHNOQVNBRVFRUnFJUW9nQUNBQmFpSWZRUU5ySVNCQkFDQUdhMEVmY1NFTElBVW9BZ2doRVNBRktBSWNJUklnQlNnQ01DRVRJQVVvQWtRaEZDQUZLQUlFSVFrZ0JTZ0NHQ0VOSUFVb0Fpd2hEQ0FGS0FKQUlRWWdCU2dDRUNFaElBVW9BaVFoSWlBRktBSTRJU01nQlNnQ1RDRWtJQVVvQWdBaEZTQUZLQUlVSVJZZ0JTZ0NLQ0VYSUFVb0Fqd2hHRUVCSVE4Z0FDQUJRUU5xUVFKMklnUnFJZ01nQkdvaUFpQUVhaUlaSVFRZ0FpRUlJQU1oQndOQUlBOUJBWEZGSUFRZ0lFOXlSUVJBSUFBZ0NpQVlJQVowSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEdpQU9MUUFESVJBZ0J5QUtJQmNnREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnRGkwQUFpRWJJQTR0QUFNaER5QUlJQW9nRmlBTmRDQUxka0VDZEdvaURpOEJBRHNBQUNBT0xRQUNJUndnRGkwQUF5RWRJQVFnQ2lBVklBbDBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloSGlBT0xRQURJUTRnQUNBUWFpSWxJQW9nR0NBR0lCcHFJZ1owSUF0MlFRSjBhaUlRTHdFQU93QUFJQkF0QUFJZ0VDMEFBeUVtSUFjZ0Qyb2lKeUFLSUJjZ0RDQWJhaUlhZENBTGRrRUNkR29pQnk4QkFEc0FBQ0FITFFBQ0lRd2dCeTBBQXlFUUlBZ2dIV29pR3lBS0lCWWdEU0FjYWlJUGRDQUxka0VDZEdvaUNDOEJBRHNBQUNBSUxRQUNJUTBnQ0MwQUF5RWNJQVFnRG1vaUhTQUtJQlVnQ1NBZWFpSU9kQ0FMZGtFQ2RHb2lDUzhCQURzQUFDQUdhaUVBUVFNaEJ3Si9JQlFnSkVrRVFDQUFJUVpCQXd3QkN5QUFRUWR4SVFZZ0ZDQUFRUU4yYXlJVUtBQUFJUmhCQUFzZ0NTMEFBeUVlSUFrdEFBSWhDQ0FNSUJwcUlRQWdFeUFqU1FSL0lBQUZJQk1nQUVFRGRtc2lFeWdBQUNFWFFRQWhCeUFBUVFkeEN5RU1JQTBnRDJvaEFDQUhjaUVKUVFNaER3Si9JQklnSWtrRVFDQUFJUTFCQXd3QkN5QUFRUWR4SVEwZ0VpQUFRUU4yYXlJU0tBQUFJUlpCQUFzZ0NDQU9haUVBSUFseUlCRWdJVWtFZnlBQUJTQVJJQUJCQTNackloRW9BQUFoRlVFQUlROGdBRUVIY1FzaENTQWxJQ1pxSVFBZ0VDQW5haUVISUJzZ0hHb2hDQ0FkSUI1cUlRUWdEM0pGSVE4TUFRc0xJQVVnRERZQ0xDQUZJQVkyQWtBZ0JTQU5OZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFJZ0Iwa2dBQ0FEUzNJTkFFRnNJUWtnQ0NBWlN3MEJJQU5CQTJzaENRTkFJQVZCUEdvUUQwVWdBQ0FKU1hFRVFDQUFJQW9nQlNnQ1BDSU5JQVVvQWtBaURIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0FDQU9MUUFEYWlJR0lBb2dEU0FNSUE0dEFBSnFJZ0IwSUF0MlFRSjBhaUlNTHdFQU93QUFJQVVnQUNBTUxRQUNhallDUUNBR0lBd3RBQU5xSVFBTUFRVWdBMEVDYXlFTUEwQWdCVUU4YWhBUElRWWdCU2dDUENFTklBVW9Ba0FoQ1NBQUlBeExJQVp5UlFSQUlBQWdDaUFOSUFsMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0NTQUdMUUFDYWpZQ1FDQUFJQVl0QUFOcUlRQU1BUXNMQTBBZ0FDQU1TMFVFUUNBQUlBb2dEU0FKZENBTGRrRUNkR29pQmk4QkFEc0FBQ0FBSUFZdEFBTnFJUUFnQ1NBR0xRQUNhaUVKREFFTEN3SkFJQUFnQTA4TkFDQUFJQW9nRFNBSmRDQUxkaUlBUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUpJQU10QUFKcUlRa01BUXNnQ1VFZlN3MEFRU0FnQ1NBS0lBQkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRa0xJQUpCQTJzaERBTkFJQVZCS0dvUUQwVWdCeUFNU1hFRVFDQUhJQW9nQlNnQ0tDSUdJQVVvQWl3aUFIUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0J5QU5MUUFEYWlJRElBb2dCaUFBSUEwdEFBSnFJZ0IwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQUNBR0xRQUNhallDTENBRElBWXRBQU5xSVFjTUFRVWdBa0VDYXlFR0EwQWdCVUVvYWhBUElRTWdCU2dDS0NFTUlBVW9BaXdoQUNBR0lBZEpJQU55UlFSQUlBY2dDaUFNSUFCMElBdDJRUUowYWlJREx3RUFPd0FBSUFVZ0FDQURMUUFDYWpZQ0xDQUhJQU10QUFOcUlRY01BUXNMQTBBZ0JpQUhTVVVFUUNBSElBb2dEQ0FBZENBTGRrRUNkR29pQXk4QkFEc0FBQ0FISUFNdEFBTnFJUWNnQUNBRExRQUNhaUVBREFFTEN3SkFJQUlnQjAwTkFDQUhJQW9nRENBQWRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUFJQU10QUFKcUlRQU1BUXNnQUVFZlN3MEFRU0FnQUNBS0lBSkJBblJxTFFBQ2FpSUFJQUJCSUU4YklRQUxJQmxCQTJzaERBTkFJQVZCRkdvUUQwVWdDQ0FNU1hFRVFDQUlJQW9nQlNnQ0ZDSUdJQVVvQWhnaUFuUWdDM1pCQW5ScUlnMHZBUUE3QUFBZ0NDQU5MUUFEYWlJRElBb2dCaUFDSUEwdEFBSnFJZ0owSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQWlBR0xRQUNhallDR0NBRElBWXRBQU5xSVFnTUFRVWdHVUVDYXlFREEwQWdCVUVVYWhBUElRSWdCU2dDRkNFR0lBVW9BaGdoQnlBRElBaEpJQUp5UlFSQUlBZ2dDaUFHSUFkMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFVZ0J5QUNMUUFDYWpZQ0dDQUlJQUl0QUFOcUlRZ01BUXNMQTBBZ0F5QUlTVVVFUUNBSUlBb2dCaUFIZENBTGRrRUNkR29pQWk4QkFEc0FBQ0FJSUFJdEFBTnFJUWdnQnlBQ0xRQUNhaUVIREFFTEN3SkFJQWdnR1U4TkFDQUlJQW9nQmlBSGRDQUxkaUlDUVFKMGFpSURMUUFBT2dBQUlBTXRBQU5CQVVZRVFDQUhJQU10QUFKcUlRY01BUXNnQjBFZlN3MEFRU0FnQnlBS0lBSkJBblJxTFFBQ2FpSUNJQUpCSUU4YklRY0xBMEFnQlJBUFJTQUVJQ0JKY1FSQUlBUWdDaUFGS0FJQUlnWWdCU2dDQkNJQ2RDQUxka0VDZEdvaURDOEJBRHNBQUNBRUlBd3RBQU5xSWdNZ0NpQUdJQUlnREMwQUFtb2lBblFnQzNaQkFuUnFJZ1F2QVFBN0FBQWdCU0FDSUFRdEFBSnFOZ0lFSUFNZ0JDMEFBMm9oQkF3QkJTQWZRUUpySVFNRFFDQUZFQThoQWlBRktBSUFJUVlnQlNnQ0JDRUlJQU1nQkVrZ0FuSkZCRUFnQkNBS0lBWWdDSFFnQzNaQkFuUnFJZ0l2QVFBN0FBQWdCU0FJSUFJdEFBSnFOZ0lFSUFRZ0FpMEFBMm9oQkF3QkN3c0RRQ0FESUFSSlJRUkFJQVFnQ2lBR0lBaDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBUWdBaTBBQTJvaEJDQUlJQUl0QUFKcUlRZ01BUXNMQWtBZ0JDQWZUdzBBSUFRZ0NpQUdJQWgwSUF0MklnSkJBblJxSWdNdEFBQTZBQUFnQXkwQUEwRUJSZ1JBSUFnZ0F5MEFBbW9oQ0F3QkN5QUlRUjlMRFFCQklDQUlJQW9nQWtFQ2RHb3RBQUpxSWdJZ0FrRWdUeHNoQ0F0QmJFRnNRV3hCYkVGc1FXeEJiRUZzSUFFZ0NFRWdSeHNnQlNnQ0NDQUZLQUlNUnhzZ0IwRWdSeHNnQlNnQ0hDQUZLQUlnUnhzZ0FFRWdSeHNnQlNnQ01DQUZLQUkwUnhzZ0NVRWdSeHNnQlNnQ1JDQUZLQUpJUnhzaENRd0pDd0FMQUFzQUN3QUxBQXNBQ3dBTEFBdEJiQ0VKQ3lBRlFkQUFhaVFBSUFrTDdCQUJIbjhqQUVIUUFHc2lCU1FBUVd3aENRSkFJQU5CQ2trTkFBSkFJQU1nQWk4QUJDSUdJQUl2QUFBaUJ5QUNMd0FDSWdocWFrRUdhaUlPU1EwQUlBUXZBUUloRHlBRlFUeHFJQUpCQm1vaUFpQUhFQTBpQ1VHSWYwc05BU0FGUVNocUlBSWdCMm9pQWlBSUVBMGlDVUdJZjBzTkFTQUZRUlJxSUFJZ0NHb2lBaUFHRUEwaUNVR0lmMHNOQVNBRklBSWdCbW9nQXlBT2F4QU5JZ2xCaUg5TERRRWdCRUVFYWlFS0lBQWdBV29pSEVFRGF5RWRRUUFnRDJ0QkgzRWhDeUFGS0FJSUlSRWdCU2dDSENFU0lBVW9BakFoRXlBRktBSkVJUlFnQlNnQ0JDRUpJQVVvQWhnaEJpQUZLQUlzSVFjZ0JTZ0NRQ0VJSUFVb0FoQWhIaUFGS0FJa0lSOGdCU2dDT0NFZ0lBVW9Ba3doSVNBRktBSUFJUlVnQlNnQ0ZDRVdJQVVvQWlnaEZ5QUZLQUk4SVJoQkFTRU5JQUFnQVVFRGFrRUNkaUlDYWlJT0lBSnFJZzhnQW1vaUdTRUVJQThoQWlBT0lRTURRQ0FOUlNBRUlCMVBja1VFUUNBS0lCZ2dDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBQWdDaUFYSUFkMElBdDJRUUYwYWlJTUxRQUJJUkFnQXlBTUxRQUFPZ0FBSUFvZ0ZpQUdkQ0FMZGtFQmRHb2lEQzBBQVNFYUlBSWdEQzBBQURvQUFDQUtJQlVnQ1hRZ0MzWkJBWFJxSWd3dEFBRWhHeUFFSUF3dEFBQTZBQUFnQ2lBWUlBZ2dEV29pQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUVnQ2lBWElBY2dFR29pQjNRZ0MzWkJBWFJxSWd3dEFBRWhFQ0FESUF3dEFBQTZBQUVnQ2lBV0lBWWdHbW9pREhRZ0MzWkJBWFJxSWdZdEFBRWhHaUFDSUFZdEFBQTZBQUVnQ2lBVklBa2dHMm9pRzNRZ0MzWkJBWFJxSWdrdEFBRWhJaUFFSUFrdEFBQTZBQUVnQ0NBTmFpRUdRUU1oQ1FKL0lCUWdJVWtFUUVFRElRMGdCZ3dCQ3lBVUlBWkJBM1pySWhRb0FBQWhHRUVBSVEwZ0JrRUhjUXNoQ0NBSElCQnFJUVlnRXlBZ1NRUi9JQVlGSUJNZ0JrRURkbXNpRXlnQUFDRVhRUUFoQ1NBR1FRZHhDeUVISUF3Z0dtb2hEQ0FKSUExeUlSQkJBeUVOQW44Z0VpQWZTUVJBSUF3aEJrRUREQUVMSUF4QkIzRWhCaUFTSUF4QkEzWnJJaElvQUFBaEZrRUFDeUFiSUNKcUlRd2dFSEloRUNBUklCNUpCSDhnREFVZ0VTQU1RUU4yYXlJUktBQUFJUlZCQUNFTklBeEJCM0VMSVFrZ0JFRUNhaUVFSUFKQkFtb2hBaUFEUVFKcUlRTWdBRUVDYWlFQUlBMGdFSEpGSVEwTUFRc0xJQVVnQnpZQ0xDQUZJQWcyQWtBZ0JTQUdOZ0lZSUFVZ0NUWUNCQ0FGSUJRMkFrUWdCU0FUTmdJd0lBVWdFallDSENBRklCRTJBZ2dnQlNBWU5nSThJQVVnRnpZQ0tDQUZJQlkyQWhRZ0JTQVZOZ0lBSUFBZ0Rrc2dBeUFQUzNJTkFFRnNJUWtnQWlBWlN3MEJJQTVCQTJzaENRTkFJQVZCUEdvUUR5QUFJQWxQY2tVRVFDQUtJQVVvQWp3aUJpQUZLQUpBSWdkMElBdDJRUUYwYWlJSUxRQUJJUXdnQUNBSUxRQUFPZ0FBSUFvZ0JpQUhJQXhxSWdaMElBdDJRUUYwYWlJSExRQUFJUWdnQlNBR0lBY3RBQUZxTmdKQUlBQWdDRG9BQVNBQVFRSnFJUUFNQVFzTEEwQWdCVUU4YWhBUElRY2dCU2dDUENFR0lBVW9Ba0FoQ1NBQUlBNVBJQWR5UlFSQUlBb2dCaUFKZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQ1NBR0xRQUJhallDUUNBQUlBYzZBQUFnQUVFQmFpRUFEQUVMQ3dOQUlBQWdEazlGQkVBZ0NpQUdJQWwwSUF0MlFRRjBhaUlITFFBQklBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0NXb2hDUXdCQ3dzZ0QwRURheUVBQTBBZ0JVRW9haEFQSUFBZ0EwMXlSUVJBSUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQURJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaXdnQXlBSU9nQUJJQU5CQW1vaEF3d0JDd3NEUUNBRlFTaHFFQThoQnlBRktBSW9JUVlnQlNnQ0xDRUFJQU1nRDA4Z0IzSkZCRUFnQ2lBR0lBQjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQUFJQVl0QUFGcU5nSXNJQU1nQnpvQUFDQURRUUZxSVFNTUFRc0xBMEFnQXlBUFQwVUVRQ0FLSUFZZ0FIUWdDM1pCQVhScUlnY3RBQUVoQ0NBRElBY3RBQUE2QUFBZ0EwRUJhaUVESUFBZ0NHb2hBQXdCQ3dzZ0dVRURheUVEQTBBZ0JVRVVhaEFQSUFJZ0EwOXlSUVJBSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lCM1FnQzNaQkFYUnFJZ2d0QUFFaERpQUNJQWd0QUFBNkFBQWdDaUFHSUFjZ0Rtb2lCblFnQzNaQkFYUnFJZ2N0QUFBaENDQUZJQVlnQnkwQUFXbzJBaGdnQWlBSU9nQUJJQUpCQW1vaEFnd0JDd3NEUUNBRlFSUnFFQThoQnlBRktBSVVJUVlnQlNnQ0dDRURJQUlnR1U4Z0IzSkZCRUFnQ2lBR0lBTjBJQXQyUVFGMGFpSUdMUUFBSVFjZ0JTQURJQVl0QUFGcU5nSVlJQUlnQnpvQUFDQUNRUUZxSVFJTUFRc0xBMEFnQWlBWlQwVUVRQ0FLSUFZZ0EzUWdDM1pCQVhScUlnY3RBQUVoQ0NBQ0lBY3RBQUE2QUFBZ0FrRUJhaUVDSUFNZ0NHb2hBd3dCQ3dzRFFDQUZFQThnQkNBZFQzSkZCRUFnQ2lBRktBSUFJZ0lnQlNnQ0JDSUdkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUtJQUlnQmlBSWFpSUNkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdBaUFHTFFBQmFqWUNCQ0FFSUFjNkFBRWdCRUVDYWlFRURBRUxDd05BSUFVUUR5RUhJQVVvQWdBaEJpQUZLQUlFSVFJZ0JDQWNUeUFIY2tVRVFDQUtJQVlnQW5RZ0MzWkJBWFJxSWdZdEFBQWhCeUFGSUFJZ0JpMEFBV28yQWdRZ0JDQUhPZ0FBSUFSQkFXb2hCQXdCQ3dzRFFDQUVJQnhQUlFSQUlBb2dCaUFDZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FFUVFGcUlRUWdBaUFJYWlFQ0RBRUxDMEZzUVd4QmJFRnNRV3hCYkVGc1FXd2dBU0FDUVNCSEd5QUZLQUlJSUFVb0FneEhHeUFEUVNCSEd5QUZLQUljSUFVb0FpQkhHeUFBUVNCSEd5QUZLQUl3SUFVb0FqUkhHeUFKUVNCSEd5QUZLQUpFSUFVb0FraEhHeUVKREFFTFFXd2hDUXNnQlVIUUFHb2tBQ0FKQzFnQkEzOENRQ0FBS0FLUTZ3RWlBVVVOQUNBQktBSUFJQUZCdE5VQmFpZ0NBQ0lDSUFGQnVOVUJhaWdDQUNJREVCTWdBZ1JBSUFNZ0FTQUNFUUlBREFFTElBRVFCZ3NnQUVFQU5nS2c2d0VnQUVJQU53T1E2d0VMNlFNQ0JIOENmaUFBUVFCQktCQURJUVFnQWtFQlFRVWdBeHNpQUVrRVFDQUFEd3NnQVVVRVFFRi9Ed3RCQVNFR0FrQUNRQ0FEUVFGR0RRQWdBeUVHSUFFb0FBQWlCVUdvNnI1cFJnMEFRWFloQXlBRlFYQnhRZERVdE1JQlJ3MEJRUWdoQXlBQ1FRaEpEUUVnQVRVQUJDRUlJQVJCQVRZQ0ZDQUVJQWczQXdCQkFBOExJQUVnQWlBR0VCb2lBeUFDU3cwQUlBUWdBellDR0VGeUlRTWdBQ0FCYWlJRlFRRnJMUUFBSWdKQkNIRU5BQ0FDUVNCeElnWkZCRUJCY0NFRElBVXRBQUFpQlVHbkFVc05BU0FGUVFkeHJVSUJJQVZCQTNaQkNtcXRoaUlJUWdPSWZpQUlmQ0VKSUFCQkFXb2hBQXNnQWtFR2RpRUZJQUpCQW5aQkFDRURBa0FDUUFKQUFrQWdBa0VEY1VFQmF3NERBQUVDQXdzZ0FDQUJhaTBBQUNFRElBQkJBV29oQUF3Q0N5QUFJQUZxTHdBQUlRTWdBRUVDYWlFQURBRUxJQUFnQVdvb0FBQWhBeUFBUVFScUlRQUxRUUZ4SVFJQ2ZnSkFBa0FDUUFKQUlBVkJBV3NPQXdFQ0F3QUxRbjhnQmtVTkF4b2dBQ0FCYWpFQUFBd0RDeUFBSUFGcU13QUFRb0FDZkF3Q0N5QUFJQUZxTlFBQURBRUxJQUFnQVdvcEFBQUxJUWdnQkNBQ05nSWdJQVFnQXpZQ0hDQUVJQWczQXdCQkFDRURJQVJCQURZQ0ZDQUVJQWdnQ1NBR0d5SUlOd01JSUFSQ2dJQUlJQWdnQ0VLQWdBaGFHejRDRUFzZ0F3dGZBUUYvUWJoL0lRTWdBVUVCUVFVZ0Foc2lBazhFZnlBQUlBSnFRUUZyTFFBQUlnQkJBM0ZCQW5SQm9CNXFLQUlBSUFKcUlBQkJCSFpCREhGQnNCNXFLQUlBYWlBQVFTQnhJZ0ZGYWlBQlFRVjJJQUJCd0FCSmNXb0ZRYmgvQ3dzTUFDQUFJQUVnQWtFQUVCa0xsd01DQlg4Q2ZpTUFRVUJxSWdRa0FBSkFBMEFnQVVFRlR3UkFBa0FnQUNnQUFFRndjVUhRMUxUQ0FVWUVRRUorSVFjZ0FVRUlTUTBFSUFBb0FBUWlBa0YzU3cwRUlBSkJDR29pQXlBQlN3MEVJQUpCZ1g5SkRRRU1CQXNnQkVFWWFpQUFJQUVRR3lFQ1FuNGdCQ2tER0VJQUlBUW9BaXhCQVVjYklBSWJJZ2RDZlZZTkF5QUhJQWg4SWdnZ0IxUkNmaUVIRFFNQ1FBSkFJQUZCQ0VrTkFDQUFLQUFBUVhCeFFkRFV0TUlCUncwQUlBQW9BQVFpQWtGM1N3MEZRYmgvSUFKQkNHb2lBaUFCSUFKSkd5RUREQUVMSUFSQkdHb2dBQ0FCRUJzaUFrR0lmMHNFUUNBQ0lRTU1BUXRCdUg4aEF5QUNEUUFnQVNBRUtBSXdJZ0pySVFVZ0FDQUNhaUVHQTBBZ0JpQUZJQVJCREdvUUhTSURRWWgvU3cwQklBTkJBMm9pQWlBRlN3UkFRYmgvSVFNTUFnc2dCU0FDYXlFRklBSWdCbW9oQmlBRUtBSVFSUTBBQ3lBRUtBSTRCSDlCdUg4aEF5QUZRUVJKRFFFZ0JrRUVhZ1VnQmdzZ0FHc2hBd3NnQTBHSWYwc05Bd3NnQVNBRGF5RUJJQUFnQTJvaEFBd0JDd3RDZmlBSUlBRWJJUWNMSUFSQlFHc2tBQ0FIQzJRQkFYOUJ1SDhoQXdKQUlBRkJBMGtOQUNBQUxRQUNJUUVnQWlBQUx3QUFJZ0JCQVhFMkFnUWdBaUFBUVFGMlFRTnhJZ00yQWdBZ0FpQUFJQUZCRUhSeVFRTjJJZ0EyQWdnQ1FBSkFJQU5CQVdzT0F3SUJBQUVMUVd3UEN5QUFJUU1MSUFNTFJBRUNmeUFCSUFJb0FnUWlBeUFCS0FJRWFpSUVOZ0lFSUFBZ0EwRUNkRUdnSFdvb0FnQWdBU2dDQUVFQUlBUnJkbkUyQWdBZ0FSQVBHaUFBSUFKQkNHbzJBZ1FMemdFQkJuOUJ1bjhoQ2dKQUlBSW9BZ1FpQ0NBQ0tBSUFJZ2xxSWcwZ0FTQUFhMHNOQUVGc0lRb2dDU0FFSUFNb0FnQWlDMnRMRFFBZ0FDQUphaUlFSUFJb0FnZ2lER3NoQWlBQUlBRkJJR3NpQUNBTElBbEJBQkFnSUFNZ0NTQUxhallDQUFKQUFrQWdCQ0FGYXlBTVR3UkFJQUloQlF3QkN5QU1JQVFnQm10TERRSWdCeUFISUFJZ0JXc2lBbW9pQVNBSWFrOEVRQ0FFSUFFZ0NCQUtHZ3dDQ3lBQ0lBaHFJUWdnQkNBQlFRQWdBbXNRQ2lBQ2F5RUVDeUFFSUFBZ0JTQUlRUUVRSUFzZ0RTRUtDeUFLQzhjRUFRSi9JQUFnQTJvaEJnSkFJQU5CQjB3RVFBTkFJQUFnQms4TkFpQUFJQUl0QUFBNkFBQWdBRUVCYWlFQUlBSkJBV29oQWd3QUN3QUxJQVJCQVVZRVFBSkFJQUFnQW1zaUJVRUhUUVJBSUFBZ0FpMEFBRG9BQUNBQUlBSXRBQUU2QUFFZ0FDQUNMUUFDT2dBQ0lBQWdBaTBBQXpvQUF5QUFJQUlnQlVFQ2RDSUZRY0FlYWlnQ0FHb2lBaWdBQURZQUJDQUNJQVZCNEI1cUtBSUFheUVDREFFTElBQWdBaWtBQURjQUFBc2dBa0VJYWlFQ0lBQkJDR29oQUFzZ0FTQUdUd1JBSUFBZ0Eyb2hBU0FFUVFGSElBQWdBbXRCRDBweVJRUkFBMEFnQUNBQ0tRQUFOd0FBSUFKQkNHb2hBaUFBUVFocUlnQWdBVWtOQUF3REN3QUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQTBFUlNRMEJJQUJCRUdvaEFBTkFJQUFnQWlrQUVEY0FBQ0FBSUFJcEFCZzNBQWdnQUNBQ0tRQWdOd0FRSUFBZ0Fpa0FLRGNBR0NBQ1FTQnFJUUlnQUVFZ2FpSUFJQUZKRFFBTERBRUxBa0FnQUNBQlN3UkFJQUFoQVF3QkN5QUJJQUJySVFVQ1FDQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUlBSWhBd05BSUFBZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQUVFSWFpSUFJQUZKRFFBTERBRUxJQUFnQWlrQUFEY0FBQ0FBSUFJcEFBZzNBQWdnQlVFUlNBMEFJQUJCRUdvaEFDQUNJUU1EUUNBQUlBTXBBQkEzQUFBZ0FDQURLUUFZTndBSUlBQWdBeWtBSURjQUVDQUFJQU1wQUNnM0FCZ2dBMEVnYWlFRElBQkJJR29pQUNBQlNRMEFDd3NnQWlBRmFpRUNDd05BSUFFZ0JrOE5BU0FCSUFJdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaEFnd0FDd0FMQzY0SEFnVi9BWDRqQUVHQUFXc2lFU1FBSUJFZ0F6WUNmRUYvSVE4Q1FBSkFBa0FDUUFKQUlBSU9CQUVBQXdJRUN5QUdSUVJBUWJoL0lROE1CQXRCYkNFUElBVXRBQUFpQWlBRFN3MERJQWdnQWtFQ2RDSUNhaWdDQUNFRElBSWdCMm9vQWdBaEFpQUFRUUE2QUFzZ0FFSUFOd0lBSUFBZ0FqWUNEQ0FBSUFNNkFBb2dBRUVBT3dFSUlBRWdBRFlDQUVFQklROE1Bd3NnQVNBSk5nSUFRUUFoRHd3Q0N5QUtSUVJBUVd3aER3d0NDMEVBSVE4Z0MwVWdERUVaU0hJTkFVRUlJQVIwUVFocUlRQkJBQ0VEQTBBZ0FDQURUUTBDSUFOQlFHc2hBd3dBQ3dBTFFXd2hEeUFSSUJGQi9BQnFJQkZCK0FCcUlBVWdCaEFNSWdOQmlIOUxEUUFnRVNnQ2VDSUNJQVJMRFFBZ0VTZ0NmRUVCYWlFSklBQkJDR29oQzBHQWdBSWdBblJCRUhVaEJVRUJJUkJCQVNBQ2RDSVBRUUZySWdvaEVnTkFJQWtnRGtjRVFBSkFJQkVnRGtFQmRDSUVhaThCQUNJTVFmLy9BMFlFUUNBTElCSkJBM1JxSUE0MkFnUWdFa0VCYXlFU1FRRWhEQXdCQ3lBUVFRQWdCU0FNd1VvYklSQUxJQVFnRFdvZ0REc0JBQ0FPUVFGcUlRNE1BUXNMSUFBZ0FqWUNCQ0FBSUJBMkFnQUNRQ0FLSUJKR0JFQWdEVUhxQUdvaEJrRUFJUkJCQUNFTUEwQWdDU0FRUmdSQUlBOUJBM1lnRDBFQmRtcEJBMm9pQlVFQmRDRUVRUUFoREVFQUlSSURRRUVBSVE0Z0R5QVNUUTBFQTBBZ0RrRUNSd1JBSUFzZ0JTQU9iQ0FNYWlBS2NVRURkR29nQmlBT0lCSnFhaTBBQURZQ0JDQU9RUUZxSVE0TUFRc0xJQkpCQW1vaEVpQUVJQXhxSUFweElRd01BQXNBQlNBUklCQkJBWFJxTGdFQUlRVWdCaUFNYWlJRUlCTTNBQUJCQ0NFT0EwQWdCU0FPU2dSQUlBUWdEbW9nRXpjQUFDQU9RUWhxSVE0TUFRc0xJQk5DZ1lLRWlKQ2d3SUFCZkNFVElCQkJBV29oRUNBRklBeHFJUXdNQVFzQUN3QUxJQTlCQTNZZ0QwRUJkbXBCQTJvaEJVRUFJUkJCQUNFT0EwQWdDU0FRUmcwQlFRQWhEQ0FSSUJCQkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FNUndSQUlBc2dEa0VEZEdvZ0VEWUNCQU5BSUFVZ0Rtb2dDbkVpRGlBU1N3MEFDeUFNUVFGcUlRd01BUXNMSUJCQkFXb2hFQXdBQ3dBTElBSkJBV29oQlVFQUlRd0RRQ0FNSUE5SEJFQWdEU0FMSUF4QkEzUnFJZ2tvQWdRaUJFRUJkR29pQWlBQ0x3RUFJZ1pCQVdvN0FRQWdDU0FGSUFablFXQnphaUlDT2dBRElBa2dCaUFDZENBUGF6c0JBQ0FKSUFnZ0JFRUNkQ0lDYWlnQ0FEb0FBaUFKSUFJZ0Iyb29BZ0EyQWdRZ0RFRUJhaUVNREFFTEN5QUJJQUEyQWdBZ0F5RVBDeUFSUVlBQmFpUUFJQThMN1ZvQ08zOEdmaU1BUWVBQmF5SUVKQUFDUUVHdzdBa1FCU0lGUlFSQVFVQWhCd3dCQ3lBRlFnQTNBdlRxQVNBRlFRQTJBc1RyQVNBRlFRQTJBclRyQVNBRlFnQTNBcHpyQVNBRlFRQTJBcmpwQVNBRlFRQTJBcXpzQ1NBRlFnQTNBdFRyQVNBRlFnQTNBcXpyQVNBRlFnQTNBNGpyQVNBRlFnQTNBdVRxQVNBRlFnQTNBdVRyQVNBRlFZR0FnTUFBTmdLODZ3RWdCVUlBTndLazZ3RWdCVUg4NmdGcVFRQTJBZ0FnQlVHUTZ3RnFRZ0EzQXdBZ0JSQVlJQVZCck5VQmFpRVVJQVZCK09zQmFpRWNJQVZCc09vQmFpRWlJQVZCb0RCcUlTb2dCVUdZSUdvaEt5QUZRYWpRQUdvaEhpQUZRUkJxSVN3Z0JVRUlhaUVvSUFWQkJHb2hMU0FGUWNEcEFXb2hLU0FGUVlqckFXb2dCRUdVQVdvaEx5QUVRWXdCYWlFd0lBUkJoQUZxSVRFZ0JFSGNBR29oTWlBRVFkUUFhaUV6SUFSQnpBQnFJVFFnQUNFZEFrQUNRQUpBQWtBQ1FBTkFRUUZCQlNBRktBTGs2Z0ViSVFZQ1FBTkFJQU1nQmtrTkFTQUNLQUFBUVhCeFFkRFV0TUlCUmdSQVFiaC9JUWNnQTBFSVNRMElJQUlvQUFRaURrRjNTd1JBUVhJaEJ3d0pDeUFESUE1QkNHb2lDVWtOQ0NBT1FZQi9Td1JBSUFraEJ3d0pDeUFESUFscklRTWdBaUFKYWlFQ0RBRUxDeUFGUWdBM0FxenBBU0FGUWdBM0EranBBU0FGUVFBMkFwanJBU0FGUWdBM0E0RHFBU0FGUWdNM0EvanBBU0FGUWJUcEFXcENBRGNDQUNBRlFmRHBBV3BDQURjREFDQUZRYWpRQUdvaUNVR01nSURnQURZQ0FDQUZRYXpRQVdwQjRCSXBBZ0EzQWdBZ0JVRzAwQUZxUWVnU0tBSUFOZ0lBSUFVZ0JVRVFhallDQUNBRklBVkJvREJxTmdJRUlBVWdCVUdZSUdvMkFnZ2dCU0FKTmdJTUlBVkJBVUVGSUFVb0F1VHFBUnMyQXJ6cEFRSkFJQUZGRFFBZ0JTZ0NyT2tCSWdrZ0hVWU5BQ0FGSUFrMkFyanBBU0FGSUIwMkFxenBBU0FGS0FLdzZRRWhEaUFGSUIwMkFyRHBBU0FGSUIwZ0RpQUphMm8yQXJUcEFRdEJ1SDhoQ1NBRFFRVkJDU0FGS0FMazZnRWlCaHRKRFFVZ0FrRUJRUVVnQmhzZ0JoQWFJZzVCaUg5TEJFQWdEaUVKREFVTElBTWdEa0VEYWtrTkJTQXBJQUlnRGlBR0VCa2lCa0dJZjBzRVFDQUdJUWtNQlFzZ0JnMEZBa0FDUUNBRktBS282d0ZCQVVjTkFDQUZLQUtrNndFaUNVVU5BQ0FGS0FLVTZ3RkZEUUFnQ1NnQ0JFRUJheUlISUFVb0F0enBBU0lLclVLSGxhK3ZtTGJlbTU1L2ZrTEp6OW15OGVXNjZpZUZRaGVKUXMvVzA3N1N4NnZaUW41QytmUGQ4Wm4ybWFzV2ZDSS9RaUdJSUQrRlFzL1cwNzdTeDZ2WlFuNGlQMElkaUNBL2hVTDU4OTN4bWZhWnF4WitJajlDSUlnZ1A0V25jU0VHSUFrb0FnQWhGUU5BUVFBaENBSkFJQlVnQmtFQ2RHb29BZ0FpQ1VVTkFDQUpLQUlJUVFoSkRRQWdDU2dDQkNJU0tBQUFRYmZJd3VGK1J3MEFJQklvQUFRaENBc2dDQ0FLUndSQUlBWWdCM0ZCQVdvaEJpQUlEUUVMQ3lBSlJRMEFJQVVRR0NBRlFYODJBcURyQVNBRklBazJBcFRyQVNBRklBVW9BdHpwQVNJSU5nS1k2d0VNQVFzZ0JTZ0MzT2tCSVFnTEFrQWdDRVVOQUNBRktBS1k2d0VnQ0VZTkFFRmdJUWtNQmdzQ1FDQUZLQUxnNlFFRVFDQUZJQVVvQXVqcUFTSUpSVFlDN09vQklBa05BU0FGUXZucTBORG55YUhrNFFBM0E2anFBU0FGUWdBM0E2RHFBU0FGUXMvVzA3N1N4NnZaUWpjRG1Pb0JJQVZDMXV1Qzd1cjlpZlhnQURjRGtPb0JJQVZDQURjRGlPb0JJQ0pCQUVFb0VBTWFEQUVMSUFWQkFEWUM3T29CQ3lBQklCMXFJU1VnQlNBRktRUG82UUVnRHExOE53UG82UUVnQXlBT2F5RURJQUlnRG1vaEFpQWRJUTREUUNBQ0lBTWdCRUVzYWhBZEloVkJpSDlMQkVBZ0ZTRUpEQVlMSUFOQkEyc2lOU0FWU1EwRUlBSkJBMm9oRzBGc0lRa0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRUtBSXNEZ01DQVFBVkN5QVZRZi8vQjBzTkV5QVZRUU5KRFJJZ0JTa0R5T2tCSVQ4Q1FBSkFJQnN0QUFBaUNVRURjU0lhUVFGckRnTUdBUUFIQ3lBRktBS0E2Z0VOQUVGaUlRa01GUXNnRlVFRlNRMFNJQnNvQUFBaEF3Si9Ba0FDUUFKQUlBbEJBblpCQTNFaUNVRUNhdzRDQVFJQUN5QUpRUUJISVFjZ0EwRUVka0gvQjNFaEMwRURJUVlnQTBFT2RrSC9CM0VNQWd0QkJDRUdJQU5CQkhaQi8vOEFjU0VMUVFFaEJ5QURRUkoyREFFTElBTkJCSFpCLy84UGNTSUxRWUNBQ0VzTkUwRUJJUWRCQlNFR0lBSXRBQWRCQ25RZ0EwRVdkbklMSWdnZ0Jtb2lDU0FWU3cwU0FrQWdDMEdCQmtrTkFDQUZLQUtjNndGRkRRQkJBQ0VEQTBBZ0EwR0RnQUZMRFFFZ0EwRkFheUVEREFBTEFBc2dCaUFiYWlFUElCcEJBMGNOQmlBRktBSU1JZ0l0QUFGQkNIUWhBeUFIRFFjZ0EwVU5DQ0FFUWZBQWFpQVBJQWdRRFNJRFFZaC9TdzBKSUFKQkJHb2hCaUFMSUJ4cUloSkJBMnNoQ2tFQUlBSXZBUUpyUVI5eElRY2dIQ0VEQTBBZ0JFSHdBR29RRDBVZ0F5QUtTWEVFUUNBRElBWWdCQ2dDY0NJSUlBUW9BblFpRDNRZ0IzWkJBblJxSWdJdkFRQTdBQUFnQXlBQ0xRQURhaUlESUFZZ0NDQVBJQUl0QUFKcUlnaDBJQWQyUVFKMGFpSUNMd0VBT3dBQUlBUWdDQ0FDTFFBQ2FqWUNkQ0FESUFJdEFBTnFJUU1NQVFVZ0VrRUNheUVJQTBBZ0JFSHdBR29RRHlFUElBUW9BbkFoQ2lBRUtBSjBJUUlnQXlBSVN5QVBja1VFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pQ2k4QkFEc0FBQ0FFSUFJZ0NpMEFBbW8yQW5RZ0F5QUtMUUFEYWlFRERBRUxDd05BSUFNZ0NFMEVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lEeThCQURzQUFDQURJQTh0QUFOcUlRTWdBaUFQTFFBQ2FpRUNEQUVMQ3dKQUlBTWdFazhOQUNBRElBWWdDaUFDZENBSGRrRUNkR29pQXkwQUFEb0FBQ0FETFFBRFFRRkdCRUFnQWlBRExRQUNhaUVDREFFTElBSkJIMHNOQUVFZ0lBSWdBeTBBQW1vaUFpQUNRU0JQR3lFQ0MwRnNRV3dnQ3lBRUtBSjRJQVFvQW54SEd5QUNRU0JIR3lFRERBc0xBQXNBQ3lBRUtBSTBJZ0lnSlNBT2Ewc05DaUFPUlFSQVFRQWhDU0FDRFFJTURnc2dEaUFiTFFBQUlBSVFBeG9nQWlFSkRBd0xJQlVnSlNBT2Ewc05DU0FPRFFGQkFDRUpJQlZGRFF3TFFiWi9JUWtNRVFzZ0RpQWJJQlVRQWhvZ0ZTRUpEQW9MSUJ3Z0d3Si9Ba0FDUUFKQUlBbEJBblpCQTNGQkFXc09Bd0VBQWdBTElBbEJBM1loQTBFQkRBSUxJQnN2QUFCQkJIWWhBMEVDREFFTElCVkJCRWtORGlBQ0x3QURJQUl0QUFWQkVIUnlJZ0pCajRDQUFVc05EaUFDUVFSMklRTkJBd3NpQW1vdEFBQWdBMEVnYWhBRElRa2dCU0FETmdLQTZ3RWdCU0FKTmdMdzZnRWdBa0VCYWlFSkRBVUxJQlVDZndKQUFrQUNRQ0FKUVFKMlFRTnhRUUZyRGdNQkFBSUFDeUFKUVFOMklRTkJBUXdDQ3lBYkx3QUFRUVIySVFOQkFnd0JDeUFDTHdBRElBSXRBQVZCRUhSeVFRUjJJUU5CQXdzaUFpQURhaUlKUVNCcVNRUkFJQWtnRlVzTkRTQWNJQUlnRzJvZ0F4QUNJUUlnQlNBRE5nS0E2d0VnQlNBQ05nTHc2Z0VnQWlBRGFpSUNRZ0EzQUJnZ0FrSUFOd0FRSUFKQ0FEY0FDQ0FDUWdBM0FBQU1CUXNnQlNBRE5nS0E2d0VnQlNBQ0lCdHFOZ0x3NmdFTUJBc2dCMFVFUUNBZUlBOGdDQ0FVRUJRaUFrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGU0VEREFNTElBdEZJQWhGY2cwTElBdEJDSFlpQXlBSUlBdEpCSDhnQ0VFRWRDQUxiZ1ZCRHd0QkdHd2lBa0dNQ0dvb0FnQnNJQUpCaUFocUtBSUFhaUlHUVFOMklBWnFJQUpCZ0FocUtBSUFJQUpCaEFocUtBSUFJQU5zYWtrRVFDTUFRUkJySWhBa0FDQWVLQUlBSVFNZ0ZFSHdCR3BCQUVIc0FCQURJUVpCVkNFQ0FrQWdBMEgvQVhFaURFRU1TdzBBQWtBZ0ZFSGNDV29nQmlBUVFRaHFJQkJCREdvZ0R5QUlJQlJCM0F0cUloY1FDeUlTUVloL1N3MEFJQkFvQWd3aUJpQU1TdzBCSUJSQnFBVnFJUTBnRkVHa0JXb2hOaUFlUVFScUlSRWdBMEdBZ0lCNGNTRTNJQVpCQVdvaUV5RUNJQVloQXdOQUlBSWlCMEVCYXlFQ0lBTWlDa0VCYXlFRElCUWdDa0VDZEdvb0F2QUVSUTBBQzBFQklBY2dCMEVCVFJzaEZrRUFJUWRCQVNFQ0EwQWdBaUFXUndSQUlCUWdBa0VDZENJRGFpZ0M4QVFoR0NBRElBMXFJQWMyQWdBZ0FrRUJhaUVDSUFjZ0dHb2hCd3dCQ3dzZ0RTQUhOZ0lBUVFBaEFpQVFLQUlJSVFNRFFDQUNJQU5IQkVBZ0RTQUNJQlJxUWR3SmFpMEFBQ0lZUVFKMGFpSVpJQmtvQWdBaUdVRUJhallDQUNBVUlCbEJBWFJxSWhrZ0dEb0EzUVVnR1NBQ09nRGNCU0FDUVFGcUlRSU1BUXNMUVFBaEF5QU5RUUEyQWdBZ0RDQUdRWDl6YWlFR1FRRWhBZ05BSUFJZ0ZrY0VRQ0FVSUFKQkFuUnFJZzBnQXpZQ0FDQU5LQUx3QkNBQ0lBWnFkQ0FEYWlFRElBSkJBV29oQWd3QkN3c2dEQ0FUSUFwcklnWnJRUUZxSVFvZ0JpRURBMEFnQXlBS1NRUkFJQlFnQTBFMGJHb2hEVUVCSVFJRFFDQUNJQlpIQkVBZ0RTQUNRUUowSWhocUlCUWdHR29vQWdBZ0EzWTJBZ0FnQWtFQmFpRUNEQUVMQ3lBRFFRRnFJUU1NQVFzTElCY2dGRUUwRUFJaE9DQVVRWkFNYWlFNUlCTWdER3NoT2lBVVFkd0ZhaUVYUVFBaENnTkFBa0FDUUNBSElBcEhCRUJCQVNBTUlCTWdGeUFLUVFGMGFpSUNMUUFCSWcxcklnTnJJaGgwSVJrZ0FpMEFBQ0VXSURnZ0RVRUNkR29pSHlnQ0FDRUNJQVlnR0UwRVFDQTJRUUVnQXlBNmFpSU5JQTFCQVV3YklpQkJBblFpSkdvb0FnQWhEU0E1SUJRZ0EwRTBiR3BCTkJBQ0lTRWdEVUVCZENFbUlCRWdBa0VDZEdvaEl5QWdRUUZORFFJZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRWdJQ0VnSkdvb0FnQWhKRUVBSVFJRFFDQUNJQ1JHRFFNZ0l5QUNRUUowYWlBZ05nRUFJQUpCQVdvaEFnd0FDd0FMSUFJZ0FpQVphaUlOSUFJZ0RVc2JJUTBnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFREEwQWdBaUFOUmcwRElCRWdBa0VDZEdvZ0F6WUJBQ0FDUVFGcUlRSU1BQXNBQ3lBZUlBeEJFSFFnTjNJZ0RISkJnQUp5TmdJQURBTUxJQWNnRFdzaEpDQVhJQ1pxSVNaQkFDRU5BMEFnRFNBa1JnMEJRUUVnR0NBVElDWWdEVUVCZEdvaUp5MEFBU0lDYXlJN2EzUWlQQ0FoSUFKQkFuUnFJaUFvQWdBaUFtb2hQU0FESUR0cVFSQjBRWUNBL0FkeElDY3RBQUJCQ0hSeUlCWnlRWUNBZ0JCeUlTY0RRQ0FqSUFKQkFuUnFJQ2MyQVFBZ0FrRUJhaUlDSUQxSkRRQUxJQ0FnSUNnQ0FDQThhallDQUNBTlFRRnFJUTBNQUFzQUN5QWZJQjhvQWdBZ0dXbzJBZ0FnQ2tFQmFpRUtEQUFMQUFzZ0VpRUNDeUFRUVJCcUpBQWdBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRmlFRERBTUxJQjRnRHlBSUlCUVFGQ0lDUVloL1N5QUNJQWhQY2cwTElCd2dDeUFDSUE5cUlBZ2dBbXNnSGhBWElRTU1BZ3NnQXdSQUlCd2dDeUFQSUFnZ0FoQVdJUU1NQWdzZ0hDQUxJQThnQ0NBQ0VCY2hBd3dCQ3lBY0lBc2dEeUFJSUFJUUZTRURDeUFEUVloL1N3MElJQVVnQ3pZQ2dPc0JJQVVnSERZQzhPb0JJQVZCQVRZQ2dPb0JJQnBCQWtZRVFDQUZJQjQyQWd3TElBc2dIR29pQWtJQU53QUFJQUpDQURjQUdDQUNRZ0EzQUJBZ0FrSUFOd0FJSUFsQmlIOUxEUW9MSUFrZ0ZVWU5DQ0FWSUFscklRWWdCU2dDbk9zQklRb0NRQ0FKSUJ0cUlnTXRBQUFpRDBVRVFFRUJJUUpCQUNFUFFiaC9JUWtnQmtFQlJnMEJEQXNMQW44Z0EwRUJhaUFQd0NJQ1FRQk9EUUFhSUFKQmYwWUVRQ0FHUVFOSURRc2dBeThBQVVHQS9nRnFJUThnQTBFRGFnd0JDeUFHUVFKSURRb2dBeTBBQVNBUFFRaDBja0dBZ0FKcklROGdBMEVDYWdzaEVrRzRmeUVKSUJKQkFXb2lBaUFWSUJ0cUlnZExEUW9nTENBRklCSXRBQUFpRWtFR2RrRWpRUWtnQWlBSElBSnJRY0FRUWRBUlFmQVNJQVVvQW9UcUFTQUtJQThnRkJBaElnbEJpSDlMRFFnZ0t5QW9JQkpCQkhaQkEzRkJIMEVJSUFJZ0NXb2lBaUFISUFKclFZQUxRWUFNUVlBWElBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlDRUdJZjBzTkNFRnNJUWtnS2lBdElCSkJBblpCQTNGQk5FRUpJQUlnQ0dvaUFpQUhJQUpyUVlBTlFlQU9RWkFaSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUIwR0lmMHNOQ2lBQ0lBZHFJQU5ySWdJaENTQUNRWWgvU3cwS0N5QU9JQTlCQUV4eURRRUxRYnAvSVFrTUNBc2dKU0FPYXlFSklBWWdBbXNoQmlBQ0lBTnFJUWNDUUFKQUFrQWdDa1VFUUNBUFFRbElJQVVwQThqcEFVS0JnSUFJVkhJTkFpQW9LQUlBSWdKQkNHb2hFaUFDS0FJRUlRcEJBQ0VEUVFBaEFnTkFJQU1nQ25aRkJFQWdBaUFTSUFOQkEzUnFMUUFDUVJaTGFpRUNJQU5CQVdvaEF3d0JDd3NnQlVFQU5nS2M2d0VnQWtFSUlBcHJkRUVVVHcwQkRBTUxJQVZCQURZQ25Pc0JDeUFFSUFVb0F2RHFBU0lETmdMY0FTQUpJQTVxSVJZZ0F5QUZLQUtBNndGcUlSY0NRQ0FQUlFSQUlBNGhCd3dCQ3lBRktBSzQ2UUVoR2lBRktBSzA2UUVoR0NBRktBS3c2UUVoRWlBRlFRRTJBb1RxQVVFQUlRTURRQ0FEUVFOSEJFQWdCQ0FEUVFKMElnSnFJQUlnQldwQnJOQUJhaWdDQURZQ1pDQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFUaHFJZ0lnQnlBR0VBMUJpSDlMRFFOQkNDQVBJQTlCQ0U0YklSOGdOQ0FDSUFVb0FnQVFIaUF6SUFJZ0JTZ0NDQkFlSURJZ0FpQUZLQUlFRUI0Z0RpQVNheUVaUVFBaENBTkFJQVJCT0dvUUQwRURSaUFJSUI5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdkQkVIWWlFVUgvQVhFaEN5QUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZ3hCRUhZaUlVSC9BWEVoRUNBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUVlnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNrSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lLYXlJTklBSWdBaUFOU3hzaUV5QUthallDUENBR0lBUW9BamdnQ25SQkFDQVRhM1lnQWlBVGF5SVRkR29oQ2lBRVFUaHFFQThhSUFJZ0RVME5BU0FFSUFRb0Fqd2lBaUFUYWpZQ1BDQUVLQUk0SUFKMFFRQWdFMnQySUFwcUlRb01BUXNnQkNBQ0lBUW9BandpRFdvMkFqd2dCQ2dDT0NBTmRFRUFJQXByZGlBR2FpRUtJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQW8yQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBREJFQWdCQ2dDWkNFS0RBTUxJQVFvQW1naENnd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQVlnQTBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdaRklBWnFJUW9nQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlBbzJBbVFMcHlFQ0lFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQkJxTmdJOElBUW9BamdnQm5SQkFDQWhhM1lnQW1vaEFnc2dDeUFRYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUF0cU5nSThJQVFvQWpnZ0JuUkJBQ0FSYTNZZ0Eyb2hBd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lCa0VBSUFkQkdIWWlDeUFFS0FJOGFpSVFhM1lnQzBFQ2RFR2dIV29vQWdCeElBZEIvLzhEY1dvMkFrd2dCQ0FRSUF4QkdIWWlCMm9pQ3pZQ1BDQUVJQWRCQW5SQm9CMXFLQUlBSUFaQkFDQUxhM1p4SUF4Qi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ1pCR0hZaUJ5QUVLQUk4YWlJTE5nSThJQVFnQjBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUF0cmRuRWdCa0gvL3dOeGFqWUNWQ0FFUWZBQWFpQUlRUXhzYWlJR0lBbzJBZ2dnQmlBQ05nSUVJQVlnQXpZQ0FDQUlRUUZxSVFnZ0F5QVphaUFDYWlFWkRBRUxDeUFJSUI5SURRTWdGa0VnYXlFaElBNGhCd05BSUFSQk9Hb1FEMEVEUmlBSUlBOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnWkJFSFlpSTBIL0FYRWhDaUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWcxQkVIWWlJRUgvQVhFaEV5QUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFNZ1FVSWdpQ0JBUWlDSXB5RUxBa0FnUWtJUWlLY2lERUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJTWF5SVJJQUlnQWlBUlN4c2lFQ0FNYWpZQ1BDQURJQVFvQWpnZ0RIUkJBQ0FRYTNZZ0FpQVFheUlNZEdvaEVDQUVRVGhxRUE4YUlBSWdFVTBOQVNBRUlBUW9BandpQWlBTWFqWUNQQ0FFS0FJNElBSjBRUUFnREd0MklCQnFJUkFNQVFzZ0JDQUNJQVFvQWp3aUVHbzJBandnQkNnQ09DQVFkRUVBSUF4cmRpQURhaUVRSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUJBMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQUxCRUFnQkNnQ1pDRVFEQU1MSUFRb0FtZ2hFQXdCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFNZ0MwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnTkZJQU5xSVJBZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQkEyQW1RTHB5RU1JRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUJOcU5nSThJQVFvQWpnZ0FuUkJBQ0FnYTNZZ0RHb2hEQXNnQ2lBVGFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lBcHFOZ0k4SUFRb0FqZ2dBblJCQUNBamEzWWdDMm9oQ3dzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQWtFQUlBWkJHSFlpQXlBRUtBSThhaUlLYTNZZ0EwRUNkRUdnSFdvb0FnQnhJQVpCLy84RGNXbzJBa3dnQkNBS0lBMUJHSFlpQTJvaUJqWUNQQ0FFSUFOQkFuUkJvQjFxS0FJQUlBSkJBQ0FHYTNaeElBMUIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdKQkdIWWlBeUFFS0FJOGFpSUdOZ0k4SUFRZ0EwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBWnJkbkVnQWtILy93TnhhallDVkFKQUFrQUNRQ0FFS0FMY0FTSURJQVJCOEFCcUlBaEJCM0ZCREd4cUloTW9BZ0FpRVdvaUl5QVhTdzBBSUFjZ0V5Z0NCQ0lOSUJGcUlncHFJQ0ZMRFFBZ0NrRWdhaUFXSUFkclRRMEJDeUFFSUJNb0FnZzJBaGdnQkNBVEtRSUFOd01RSUFjZ0ZpQUVRUkJxSUFSQjNBRnFJQmNnRWlBWUlCb1FIeUVLREFFTElBY2dFV29oQWlBVEtBSUlJUVlnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0FKQUlCRkJFVWtOQUNBSElBTXBBQkEzQUJBZ0J5QURLUUFZTndBWUlCRkJFR3RCRVVnTkFDQURRUkJxSVFNZ0IwRWdhaUVSQTBBZ0VTQURLUUFRTndBQUlCRWdBeWtBR0RjQUNDQVJJQU1wQUNBM0FCQWdFU0FES1FBb053QVlJQU5CSUdvaEF5QVJRU0JxSWhFZ0Fra05BQXNMSUFJZ0Jtc2hBeUFFSUNNMkF0d0JJQUlnRW1zZ0Jra0VRQ0FHSUFJZ0dHdExEUWNnR2lBYUlBTWdFbXNpQTJvaUVTQU5hazhFUUNBQ0lCRWdEUkFLR2d3Q0N5QURJQTFxSVEwZ0FpQVJRUUFnQTJzUUNpQURheUVDSUJJaEF3c2dCa0VRVHdSQUlBSWdBeWtBQURjQUFDQUNJQU1wQUFnM0FBZ2dEVUVSU0EwQklBSWdEV29oQmlBQ1FSQnFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBR1NRMEFDd3dCQ3dKQUlBWkJCMDBFUUNBQ0lBTXRBQUE2QUFBZ0FpQURMUUFCT2dBQklBSWdBeTBBQWpvQUFpQUNJQU10QUFNNkFBTWdBaUFESUFaQkFuUWlCa0hBSG1vb0FnQnFJZ01vQUFBMkFBUWdBeUFHUWVBZWFpZ0NBR3NoQXd3QkN5QUNJQU1wQUFBM0FBQUxJQTFCQ1VrTkFDQUNJQTFxSVJFZ0FrRUlhaUlHSUFOQkNHb2lBMnRCRDB3RVFBTkFJQVlnQXlrQUFEY0FBQ0FEUVFocUlRTWdCa0VJYWlJR0lCRkpEUUFNQWdzQUN5QUdJQU1wQUFBM0FBQWdCaUFES1FBSU53QUlJQTFCR1VnTkFDQUNRUmhxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQVJTUTBBQ3dzZ0NrR0lmMHNFUUNBS0lRa01CZ1VnRXlBUU5nSUlJQk1nRERZQ0JDQVRJQXMyQWdBZ0NFRUJhaUVJSUFjZ0Ntb2hCeUFMSUJscUlBeHFJUmtNQWdzQUN3c2dDQ0FQU0EwRElBZ2dIMnNoQmdOQUFrQWdCaUFQVGdSQVFRQWhBd05BSUFOQkEwWU5BaUFGSUFOQkFuUWlBbXBCck5BQmFpQUNJQVJxS0FKa05nSUFJQU5CQVdvaEF3d0FDd0FMQWtBQ1FBSkFJQVFvQXR3QklnTWdCRUh3QUdvZ0JrRUhjVUVNYkdvaUNDZ0NBQ0lNYWlJUUlCZExEUUFnQnlBSUtBSUVJZ3NnREdvaUNtb2dJVXNOQUNBS1FTQnFJQllnQjJ0TkRRRUxJQVFnQ0NnQ0NEWUNLQ0FFSUFncEFnQTNBeUFnQnlBV0lBUkJJR29nQkVIY0FXb2dGeUFTSUJnZ0doQWZJUW9NQVFzZ0J5QU1haUVDSUFnb0FnZ2hDQ0FISUFNcEFBQTNBQUFnQnlBREtRQUlOd0FJQWtBZ0RFRVJTUTBBSUFjZ0F5a0FFRGNBRUNBSElBTXBBQmczQUJnZ0RFRVFhMEVSU0EwQUlBTkJFR29oQXlBSFFTQnFJUXdEUUNBTUlBTXBBQkEzQUFBZ0RDQURLUUFZTndBSUlBd2dBeWtBSURjQUVDQU1JQU1wQUNnM0FCZ2dBMEVnYWlFRElBeEJJR29pRENBQ1NRMEFDd3NnQWlBSWF5RURJQVFnRURZQzNBRWdBaUFTYXlBSVNRUkFJQWdnQWlBWWEwc05CeUFhSUJvZ0F5QVNheUlEYWlJTUlBdHFUd1JBSUFJZ0RDQUxFQW9hREFJTElBTWdDMm9oQ3lBQ0lBeEJBQ0FEYXhBS0lBTnJJUUlnRWlFREN5QUlRUkJQQkVBZ0FpQURLUUFBTndBQUlBSWdBeWtBQ0RjQUNDQUxRUkZJRFFFZ0FpQUxhaUVJSUFKQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFJZ0F5MEFBRG9BQUNBQ0lBTXRBQUU2QUFFZ0FpQURMUUFDT2dBQ0lBSWdBeTBBQXpvQUF5QUNJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBSWdBeWtBQURjQUFBc2dDMEVKU1EwQUlBSWdDMm9oRENBQ1FRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0RFa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dDMEVaU0EwQUlBSkJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBeEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0dCU0FHUVFGcUlRWWdCeUFLYWlFSERBSUxBQXNMSUFRb0F0d0JJUU1MUWJwL0lRa2dGeUFEYXlJQ0lCWWdCMnRMRFFJZ0J3Ui9JQWNnQXlBQ0VBSWdBbW9GUVFBTElBNXJJUWtNQWdzZ0JVRUFOZ0tjNndFTElBUWdCU2dDOE9vQklnTTJBdHdCSUFrZ0Rtb2hEQ0FESUFVb0FvRHJBV29oRUFKQUlBOUZCRUFnRGlFR0RBRUxJQVVvQXJqcEFTRU5JQVVvQXJUcEFTRVRJQVVvQXJEcEFTRVNJQVZCQVRZQ2hPb0JRUUFoQXdOQUlBTkJBMGNFUUNBRUlBTkJBblFpQW1vZ0FpQUZha0dzMEFGcUtBSUFOZ0tjQVNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUWZBQWFpSUNJQWNnQmhBTlFZaC9TdzBCSURFZ0FpQUZLQUlBRUI0Z01DQUNJQVVvQWdnUUhpQXZJQUlnQlNnQ0JCQWVJQXhCSUdzaEdDQU9JUVlEUUNBRUtBS0lBU0FFS0FLRUFVRURkR29wQWdBaVFLY2lDa0VRZGlJWlFmOEJjU0VMSUFRb0FwZ0JJQVFvQXBRQlFRTjBhaWtDQUNKQnB5SVdRUkIySWg5Qi93RnhJUm9nQkNnQ2tBRWdCQ2dDakFGQkEzUnFLUUlBSWtKQ0lJaW5JUWNnUVVJZ2lDQkFRaUNJcHlFREFrQWdRa0lRaUtjaUNFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NkQ0lJYXlJUklBSWdBaUFSU3hzaUZ5QUlhallDZENBSElBUW9BbkFnQ0hSQkFDQVhhM1lnQWlBWGF5SVhkR29oQ0NBRVFmQUFhaEFQR2lBQ0lCRk5EUUVnQkNBRUtBSjBJZ0lnRjJvMkFuUWdCQ2dDY0NBQ2RFRUFJQmRyZGlBSWFpRUlEQUVMSUFRZ0FpQUVLQUowSWhGcU5nSjBJQVFvQW5BZ0VYUkJBQ0FJYTNZZ0Iyb2hDQ0FFUWZBQWFoQVBHZ3NnQkNrQ25BRWhSQ0FFSUFnMkFwd0JJQVFnUkRjQ29BRU1BUXNDUUNBQ1JRUkFJQU1FUUNBRUtBS2NBU0VJREFNTElBUW9BcUFCSVFnTUFRc2dCQ0FFS0FKMElnSkJBV28yQW5RQ2Z5QUhJQU5GYWlBRUtBSndJQUowUVI5MmFpSUNRUU5HQkVBZ0JDZ0NuQUZCQVdzTUFRc2dBa0VDZENBRWFpZ0NuQUVMSWdkRklBZHFJUWdnQWtFQlJ3UkFJQVFnQkNnQ29BRTJBcVFCQ3dzZ0JDQUVLQUtjQVRZQ29BRWdCQ0FJTmdLY0FRdW5JUUlnUVVLQWdQd0hnMUJGQkVBZ0JDQUVLQUowSWdjZ0dtbzJBblFnQkNnQ2NDQUhkRUVBSUI5cmRpQUNhaUVDQ3lBTElCcHFRUlJQQkVBZ0JFSHdBR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ2RDSUhJQXRxTmdKMElBUW9BbkFnQjNSQkFDQVphM1lnQTJvaEF3c2dCRUh3QUdvUUR4b2dCQ0FFS0FKd0lnZEJBQ0FLUVJoMklnc2dCQ2dDZEdvaUdtdDJJQXRCQW5SQm9CMXFLQUlBY1NBS1FmLy9BM0ZxTmdLRUFTQUVJQm9nRmtFWWRpSUthaUlMTmdKMElBUWdDa0VDZEVHZ0hXb29BZ0FnQjBFQUlBdHJkbkVnRmtILy93TnhhallDbEFFZ0JFSHdBR29RRHhvZ0JDQkNweUlIUVJoMklnb2dCQ2dDZEdvaUN6WUNkQ0FFSUFwQkFuUkJvQjFxS0FJQUlBUW9BbkJCQUNBTGEzWnhJQWRCLy84RGNXbzJBb3dCSUFRZ0F6WUNPQ0FFSUFJMkFqd2dCQ0FJTmdKQUFrQUNRQUpBSUFRb0F0d0JJZ3NnQTJvaUZpQVFTdzBBSUFZZ0FpQURhaUlLYWlBWVN3MEFJQXBCSUdvZ0RDQUdhMDBOQVFzZ0JDQUVRVUJyS0FJQU5nSUlJQVFnQkNrRE9EY0RBQ0FHSUF3Z0JDQUVRZHdCYWlBUUlCSWdFeUFORUI4aENnd0JDeUFESUFacUlRY2dCaUFMS1FBQU53QUFJQVlnQ3lrQUNEY0FDQUpBSUFOQkVVa05BQ0FHSUFzcEFCQTNBQkFnQmlBTEtRQVlOd0FZSUFOQkVHdEJFVWdOQUNBTFFSQnFJUU1nQmtFZ2FpRUxBMEFnQ3lBREtRQVFOd0FBSUFzZ0F5a0FHRGNBQ0NBTElBTXBBQ0EzQUJBZ0N5QURLUUFvTndBWUlBTkJJR29oQXlBTFFTQnFJZ3NnQjBrTkFBc0xJQWNnQ0dzaEF5QUVJQlkyQXR3QklBY2dFbXNnQ0VrRVFDQUlJQWNnRTJ0TERRUWdEU0FOSUFNZ0Vtc2lBMm9pQ3lBQ2FrOEVRQ0FISUFzZ0FoQUtHZ3dDQ3lBSElBdEJBQ0FEYXhBS0lBUWdBaUFEYWlJQ05nSThJQU5ySVFjZ0VpRURDeUFJUVJCUEJFQWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQ0FDUVJGSURRRWdBaUFIYWlFSUlBZEJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBY2dBeTBBQURvQUFDQUhJQU10QUFFNkFBRWdCeUFETFFBQ09nQUNJQWNnQXkwQUF6b0FBeUFISUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQWNnQXlrQUFEY0FBQXNnQWtFSlNRMEFJQUlnQjJvaEN5QUhRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dDMGtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQWtFWlNBMEFJQWRCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXRKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdEQ3lBR0lBcHFJUVlnQkVId0FHb1FEeUVESUE5QkFXc2lEdzBBQzBFQUlRSWdBMEVDU1EwQkEwQWdBa0VEUndSQUlBVWdBa0VDZENJRGFrR3MwQUZxSUFNZ0JHb29BcHdCTmdJQUlBSkJBV29oQWd3QkN3c2dCQ2dDM0FFaEF3dEJ1bjhoQ1NBUUlBTnJJZ0lnRENBR2Ewc05BQ0FHQkg4Z0JpQURJQUlRQWlBQ2FnVkJBQXNnRG1zaENRc2dDVUdJZjBzTkJnc0NRQ0FGS0FMczZnRkZEUUFnQlNBRktRT0k2Z0VnQ2ExOE53T0k2Z0VDUUNBRktBTFE2Z0VpQWlBSmFpSUlRUjlOQkVBZ0RrVU5BU0FDSUNKcUlBNGdDUkFDR2lBRktBTFE2Z0VnQ1dvaENBd0JDeUFPSVFNZ0FnUkFJQUlnSW1vZ0EwRWdJQUpyRUFJYUlBVW9BdERxQVNFQ0lBVkJBRFlDME9vQklBVWdCU2tEa09vQklBVXBBTERxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRGtPb0JJQVVnQlNrRG1Pb0JJQVVwQUxqcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RtT29CSUFVZ0JTa0RvT29CSUFVcEFNRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEb09vQklBVWdCU2tEcU9vQklBVXBBTWpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRHFPb0JJQU1nQW10QklHb2hBd3NnQ1NBT2FpSUNJQU5CSUdwUEJFQWdBa0VnYXlFR0lBVXBBNmpxQVNFL0lBVXBBNkRxQVNGQUlBVXBBNWpxQVNGQklBVXBBNURxQVNGQ0EwQWdBeWtBR0VMUDF0Tyswc2VyMlVKK0lEOThRaCtKUW9lVnI2K1l0dDZibm45K0lUOGdBeWtBRUVMUDF0Tyswc2VyMlVKK0lFQjhRaCtKUW9lVnI2K1l0dDZibm45K0lVQWdBeWtBQ0VMUDF0Tyswc2VyMlVKK0lFRjhRaCtKUW9lVnI2K1l0dDZibm45K0lVRWdBeWtBQUVMUDF0Tyswc2VyMlVKK0lFSjhRaCtKUW9lVnI2K1l0dDZibm45K0lVSWdBMEVnYWlJRElBWk5EUUFMSUFVZ1B6Y0RxT29CSUFVZ1FEY0RvT29CSUFVZ1FUY0RtT29CSUFVZ1FqY0RrT29CQ3lBQ0lBTk5EUUVnSWlBRElBSWdBMnNpQ0JBQ0dnc2dCU0FJTmdMUTZnRUxJRFVnRldzaEF5QVZJQnRxSVFJZ0NTQU9haUVPSUFRb0FqQkZEUUFMSUNrcEF3QWlQMEovVVNBL0lBNGdIV3VzVVhKRkJFQkJiQ0VKREFZTElBVW9BdURwQVFSQVFXb2hDU0FEUVFSSkRRWWdCU2dDNk9vQlJRUkFJQ0lnQlNnQzBPb0JhaUVLQW40Z0JTa0RpT29CSWo5Q0lGb0VRQ0FGS1FPWTZnRWlRRUlIaVNBRktRT1E2Z0VpUVVJQmlYd2dCU2tEb09vQklrSkNESWw4SUFVcEE2anFBU0pEUWhLSmZDQkJRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOUlFQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZvVkNoNVd2cjVpMjNwdWVmMzVDbmFPMTZvT3hqWXI2QUgwZ1FrTFAxdE8rMHNlcjJVSitRaCtKUW9lVnI2K1l0dDZibm45K2hVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNCRFFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5REFFTElBVXBBNkRxQVVMRno5bXk4ZVc2NmlkOEN5QS9mQ0UvSUNJaEJnTkFJQW9nQmtFSWFpSUhUd1JBSUFZcEFBQkN6OWJUdnRMSHE5bENma0lmaVVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUliaVVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0UvSUFjaEJnd0JDd3NDUUNBS0lBWkJCR29pQ0VrRVFDQUdJUWdNQVFzZ0JqVUFBRUtIbGErdm1MYmVtNTUvZmlBL2hVSVhpVUxQMXRPKzBzZXIyVUorUXZuejNmR1o5cG1yRm53aFB3c0RRQ0FJSUFwSkJFQWdDREVBQUVMRno5bXk4ZVc2NmlkK0lEK0ZRZ3VKUW9lVnI2K1l0dDZibm45K0lUOGdDRUVCYWlFSURBRUxDeUFDS0FBQUlEOUNJWWdnUDRWQ3o5YlR2dExIcTlsQ2ZpSS9RaDJJSUQrRlF2bnozZkdaOXBtckZuNGlQMElnaUNBL2hhZEhEUWNMSUFOQkJHc2hBeUFDUVFScUlRSUxJQTRnSFdzaUNVR0pmMDhOQkNBQklBbHJJUUVnQ1NBZGFpRWRRUUVoUGd3QkN3dEJ1SDhoQnlBRERRUWdIU0FBYXlFSERBUUxRV3doQ1F3QkMwRzRmeUVKQzBHNGZ5RUhJQWxCZGtZZ1BuRU5BUXNnQ1NFSEN5Z0NBQTBBSUFWQi9Pb0JhaWdDQUNFQklBVkIrT29CYWlnQ0FDRUFJQVVRR0NBRktBS3c2d0VnQUNBQkVCTWdCVUVBTmdLdzZ3RWdCU2dDcE9zQklnSUVRQUpBQWtBQ1FBSkFJQUlvQWdBaUF3UkFJQUJGRFFJZ0FTQURJQUFSQWdBTUFRc2dBRVVOQWdzZ0FTQUNJQUFSQWdBTUFnc2dBeEFHQ3lBQ0VBWUxJQVZCQURZQ3BPc0JDeUFBQkVBZ0FTQUZJQUFSQWdBTUFRc2dCUkFHQ3lBRVFlQUJhaVFBSUFjTEM2Z1ZDUUJCaUFnTERRRUFBQUFCQUFBQUFnQUFBQUlBUWFBSUM3TUdBUUFBQUFFQUFBQUNBQUFBQWdBQUFDWUFBQUNDQUFBQUlRVUFBRW9BQUFCbkNBQUFKZ0FBQU1BQkFBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUtRQUFBQ3dDQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBTHdBQUFNb0NBQUNBQUFBQWlnVUFBRW9BQUFDRUNRQUFOUUFBQUhNREFBQ0FBQUFBblFVQUFFb0FBQUNnQ1FBQVBRQUFBSUVEQUFDQUFBQUE2d1VBQUVzQUFBQStDZ0FBUkFBQUFKNERBQUNBQUFBQVRRWUFBRXNBQUFDcUNnQUFTd0FBQUxNREFBQ0FBQUFBd1FZQUFFMEFBQUFmRFFBQVRRQUFBRk1FQUFDQUFBQUFJd2dBQUZFQUFBQ21Ed0FBVkFBQUFKa0VBQUNBQUFBQVN3a0FBRmNBQUFDeEVnQUFXQUFBQU5vRUFBQ0FBQUFBYndrQUFGMEFBQUFqRkFBQVZBQUFBRVVGQUFDQUFBQUFWQW9BQUdvQUFBQ01GQUFBYWdBQUFLOEZBQUNBQUFBQWRna0FBSHdBQUFCT0VBQUFmQUFBQU5JQ0FBQ0FBQUFBWXdjQUFKRUFBQUNRQndBQWtnQUFBQUFBQUFBQkFBQUFBUUFBQUFVQUFBQU5BQUFBSFFBQUFEMEFBQUI5QUFBQS9RQUFBUDBCQUFEOUF3QUEvUWNBQVAwUEFBRDlId0FBL1Q4QUFQMS9BQUQ5L3dBQS9mOEJBUDMvQXdEOS93Y0EvZjhQQVAzL0h3RDkvejhBL2Y5L0FQMy8vd0Q5Ly84Qi9mLy9BLzMvL3dmOS8vOFAvZi8vSC8zLy96LzkvLzkvQUFBQUFBRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVJBQUFBRWdBQUFCTUFBQUFVQUFBQUZRQUFBQllBQUFBWEFBQUFHQUFBQUJrQUFBQWFBQUFBR3dBQUFCd0FBQUFkQUFBQUhnQUFBQjhBQUFBREFBQUFCQUFBQUFVQUFBQUdBQUFBQndBQUFBZ0FBQUFKQUFBQUNnQUFBQXNBQUFBTUFBQUFEUUFBQUE0QUFBQVBBQUFBRUFBQUFCRUFBQUFTQUFBQUV3QUFBQlFBQUFBVkFBQUFGZ0FBQUJjQUFBQVlBQUFBR1FBQUFCb0FBQUFiQUFBQUhBQUFBQjBBQUFBZUFBQUFId0FBQUNBQUFBQWhBQUFBSWdBQUFDTUFBQUFsQUFBQUp3QUFBQ2tBQUFBckFBQUFMd0FBQURNQUFBQTdBQUFBUXdBQUFGTUFBQUJqQUFBQWd3QUFBQU1CQUFBREFnQUFBd1FBQUFNSUFBQURFQUFBQXlBQUFBTkFBQUFEZ0FBQUF3QUJBRUhnRHd0UkFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVVBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dBQUFBd0FBQUFOQUFBQURnQUFBQThBQUFBUUFFSEVFQXVMQVFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBU0FBQUFGQUFBQUJZQUFBQVlBQUFBSEFBQUFDQUFBQUFvQUFBQU1BQUFBRUFBQUFDQUFBQUFBQUVBQUFBQ0FBQUFCQUFBQUFnQUFBQVFBQUFBSUFBQUFFQUFBQUNBQUFBQUFBRUFRWkFTQytZRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQXdBQUFBTUFBQUFFQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBQkFBQUFCQUFBQUFnQUFBQUFBQUFBQVFBQkFRWUFBQUFBQUFBRUFBQUFBQkFBQUFRQUFBQUFJQUFBQlFFQUFBQUFBQUFGQXdBQUFBQUFBQVVFQUFBQUFBQUFCUVlBQUFBQUFBQUZCd0FBQUFBQUFBVUpBQUFBQUFBQUJRb0FBQUFBQUFBRkRBQUFBQUFBQUFZT0FBQUFBQUFCQlJBQUFBQUFBQUVGRkFBQUFBQUFBUVVXQUFBQUFBQUNCUndBQUFBQUFBTUZJQUFBQUFBQUJBVXdBQUFBSUFBR0JVQUFBQUFBQUFjRmdBQUFBQUFBQ0FZQUFRQUFBQUFLQmdBRUFBQUFBQXdHQUJBQUFDQUFBQVFBQUFBQUFBQUFCQUVBQUFBQUFBQUZBZ0FBQUNBQUFBVUVBQUFBQUFBQUJRVUFBQUFnQUFBRkJ3QUFBQUFBQUFVSUFBQUFJQUFBQlFvQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUlBQUJCUkFBQUFBQUFBRUZFZ0FBQUNBQUFRVVdBQUFBQUFBQ0JSZ0FBQUFnQUFNRklBQUFBQUFBQXdVb0FBQUFBQUFHQkVBQUFBQVFBQVlFUUFBQUFDQUFCd1dBQUFBQUFBQUpCZ0FDQUFBQUFBc0dBQWdBQURBQUFBUUFBQUFBRUFBQUJBRUFBQUFnQUFBRkFnQUFBQ0FBQUFVREFBQUFJQUFBQlFVQUFBQWdBQUFGQmdBQUFDQUFBQVVJQUFBQUlBQUFCUWtBQUFBZ0FBQUZDd0FBQUNBQUFBVU1BQUFBQUFBQUJnOEFBQUFnQUFFRkVnQUFBQ0FBQVFVVUFBQUFJQUFDQlJnQUFBQWdBQUlGSEFBQUFDQUFBd1VvQUFBQUlBQUVCVEFBQUFBQUFCQUdBQUFCQUFBQUR3WUFnQUFBQUFBT0JnQkFBQUFBQUEwR0FDQUFRWUFYQzRjQ0FRQUJBUVVBQUFBQUFBQUZBQUFBQUFBQUJnUTlBQUFBQUFBSkJmMEJBQUFBQUE4Ri9YOEFBQUFBRlFYOS94OEFBQUFEQlFVQUFBQUFBQWNFZlFBQUFBQUFEQVg5RHdBQUFBQVNCZjMvQXdBQUFCY0YvZjkvQUFBQUJRVWRBQUFBQUFBSUJQMEFBQUFBQUE0Ri9UOEFBQUFBRkFYOS93OEFBQUFDQlFFQUFBQVFBQWNFZlFBQUFBQUFDd1g5QndBQUFBQVJCZjMvQVFBQUFCWUYvZjgvQUFBQUJBVU5BQUFBRUFBSUJQMEFBQUFBQUEwRi9SOEFBQUFBRXdYOS93Y0FBQUFCQlFFQUFBQVFBQVlFUFFBQUFBQUFDZ1g5QXdBQUFBQVFCZjMvQUFBQUFCd0YvZi8vRHdBQUd3WDkvLzhIQUFBYUJmMy8vd01BQUJrRi9mLy9BUUFBR0FYOS8vOEFRWkFaQzRZRUFRQUJBUVlBQUFBQUFBQUdBd0FBQUFBQUFBUUVBQUFBSUFBQUJRVUFBQUFBQUFBRkJnQUFBQUFBQUFVSUFBQUFBQUFBQlFrQUFBQUFBQUFGQ3dBQUFBQUFBQVlOQUFBQUFBQUFCaEFBQUFBQUFBQUdFd0FBQUFBQUFBWVdBQUFBQUFBQUJoa0FBQUFBQUFBR0hBQUFBQUFBQUFZZkFBQUFBQUFBQmlJQUFBQUFBQUVHSlFBQUFBQUFBUVlwQUFBQUFBQUNCaThBQUFBQUFBTUdPd0FBQUFBQUJBWlRBQUFBQUFBSEJvTUFBQUFBQUFrR0F3SUFBQkFBQUFRRUFBQUFBQUFBQkFVQUFBQWdBQUFGQmdBQUFBQUFBQVVIQUFBQUlBQUFCUWtBQUFBQUFBQUZDZ0FBQUFBQUFBWU1BQUFBQUFBQUJnOEFBQUFBQUFBR0VnQUFBQUFBQUFZVkFBQUFBQUFBQmhnQUFBQUFBQUFHR3dBQUFBQUFBQVllQUFBQUFBQUFCaUVBQUFBQUFBRUdJd0FBQUFBQUFRWW5BQUFBQUFBQ0Jpc0FBQUFBQUFNR013QUFBQUFBQkFaREFBQUFBQUFGQm1NQUFBQUFBQWdHQXdFQUFDQUFBQVFFQUFBQU1BQUFCQVFBQUFBUUFBQUVCUUFBQUNBQUFBVUhBQUFBSUFBQUJRZ0FBQUFnQUFBRkNnQUFBQ0FBQUFVTEFBQUFBQUFBQmc0QUFBQUFBQUFHRVFBQUFBQUFBQVlVQUFBQUFBQUFCaGNBQUFBQUFBQUdHZ0FBQUFBQUFBWWRBQUFBQUFBQUJpQUFBQUFBQUJBR0F3QUJBQUFBRHdZRGdBQUFBQUFPQmdOQUFBQUFBQTBHQXlBQUFBQUFEQVlERUFBQUFBQUxCZ01JQUFBQUFBb0dBd1FBUWFRZEM5a0JBUUFBQUFNQUFBQUhBQUFBRHdBQUFCOEFBQUEvQUFBQWZ3QUFBUDhBQUFEL0FRQUEvd01BQVA4SEFBRC9Ed0FBL3g4QUFQOC9BQUQvZndBQS8vOEFBUC8vQVFELy93TUEvLzhIQVAvL0R3RC8veDhBLy84L0FQLy9md0QvLy84QS8vLy9BZi8vL3dQLy8vOEgvLy8vRC8vLy94Ly8vLzgvLy8vL2Z3QUFBQUFCQUFBQUFnQUFBQVFBQUFBQUFBQUFBZ0FBQUFRQUFBQUlBQUFBQUFBQUFBRUFBQUFDQUFBQUFRQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBZ0FBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0JCZ0I4TEE0QVJBUT09Ijt2YXIgT3Q9bmV3IHpBLHF0PSExO2FzeW5jIGZ1bmN0aW9uIFdyKEEsZSx0KXtsZXQgST0idW5rbm93biI7dHlwZW9mIEEhPSJzdHJpbmciP0k9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP0k9QTpJPXR5cGVvZiBlPCJ1Ij9gJHtlfS8ke0F9YDpBLEkuZW5kc1dpdGgoIi5qcyIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTMpKSxJLmVuZHNXaXRoKCIud2FzbSIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTUpKSxJLmVuZHNXaXRoKCIud2FzbS56c3QiKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC05KSk7bGV0IHI9YCR7SX0ud2FzbWAsaT1hd2FpdCBzQS5nZXQoYCR7cn0uenN0YCx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOnR9KTtxdHx8KGF3YWl0IE90LmluaXQoKSxxdD0hMCk7bGV0IGE9T3QuZGVjb2RlKG5ldyBVaW50OEFycmF5KGkuZGF0YSkpLmJ1ZmZlcjtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke0l9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6YX0pfXZhciBUdD1Xcjt2YXIgS3Q9YXN5bmMoKT0+V2ViQXNzZW1ibHkudmFsaWRhdGUobmV3IFVpbnQ4QXJyYXkoWzAsOTcsMTE1LDEwOSwxLDAsMCwwLDEsNSwxLDk2LDAsMSwxMjMsMywyLDEsMCwxMCwxMCwxLDgsMCw2NSwwLDI1MywxNSwyNTMsOTgsMTFdKSk7dmFyIFd0PXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLFB0PW5ldyBUZXh0RW5jb2Rlcix4dD1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24ganIoQSxlKXtsZXQgdD17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxJPUEuZnNfb3BlbihlLHQuZmxhZ3MpLGk9QS5mc19zdGF0KGUpLnNpemUsbz1udWxsO1d0P289bmV3IFNoYXJlZEFycmF5QnVmZmVyKGkpOm89bmV3IEFycmF5QnVmZmVyKGkpO2xldCBhPW5ldyBVaW50OEFycmF5KG8pO3JldHVybiBBLmZzX3JlYWQoSSxhLDAsaSwwKSxBLmZzX2Nsb3NlKEkpLGF9ZnVuY3Rpb24ganQoQSxlLHQpe2xldCBJPW51bGw7V3Q/ST1uZXcgU2hhcmVkQXJyYXlCdWZmZXIodCk6ST1uZXcgQXJyYXlCdWZmZXIodCk7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoSSksaT1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsZSx0KTtyZXR1cm4gci5zZXQoaSkscn1mdW5jdGlvbiBtKEEsZSx0LEkpe2xldCByPTA7cmV0dXJuIGUhPT1udWxsJiYocj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCx0LEksZS5idWZmZXIuYnl0ZUxlbmd0aF0pPj4+MCxBLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpLHIpKSxyfWZ1bmN0aW9uIF8oQSxlLHQpe2xldCBJPUpTT04uc3RyaW5naWZ5KGUpLHI9QS5sZW5ndGhCeXRlc1VURjgoSSkrMSxpPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2pzb25fYWxsb2MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxyXSk+Pj4wO0Euc3RyaW5nVG9VVEY4KEksaSxyKX1mdW5jdGlvbiBSKEEsZSx0LEkpe2xldCByPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pPj4+MCxpPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUsdF0pLG89anQoQSxyLGkpO3JldHVybiBQKEksby5idWZmZXIpfWZ1bmN0aW9uIEZBKEEsZSl7bGV0IHQ9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCxlXSk+Pj4wLEk9QS5VVEY4VG9TdHJpbmcodCk7cmV0dXJuIEpTT04ucGFyc2UoSSl9ZnVuY3Rpb24gdnIoQSxlLHQsSSl7SSE9bnVsbCYmSS5sZW5ndGg+MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKEMsZyl7c3dpdGNoKEMudHlwZSl7Y2FzZSBkLlRleHRTdHJlYW06e2xldCBzPVB0LmVuY29kZShDLmRhdGEuZGF0YSksZj1tKEEscyxnLDApLEI9e3NpemU6cy5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtfKEEsQixnKTticmVha31jYXNlIGQuSnNvbkNvbXBhdGlibGU6e2xldCBzPVB0LmVuY29kZShKU09OLnN0cmluZ2lmeShDLmRhdGEpKSxmPW0oQSxzLGcsMCksQj17c2l6ZTpzLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O18oQSxCLGcpO2JyZWFrfWNhc2UgZC5CaW5hcnlTdHJlYW06e2xldCBzPUMuZGF0YS5kYXRhLGY9bShBLHMsZywwKSxCPXtzaXplOnMuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07XyhBLEIsZyk7YnJlYWt9Y2FzZSBkLlRleHRGaWxlOntBLmZzX3dyaXRlRmlsZShDLmRhdGEucGF0aCxDLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBkLkJpbmFyeUZpbGU6e0EuZnNfd3JpdGVGaWxlKEMuZGF0YS5wYXRoLEMuZGF0YS5kYXRhKTticmVha31jYXNlIGQuSW1hZ2U6e2xldCBzPUMuZGF0YSxmPW0oQSxzLmRhdGEsZywwKSxCPW0oQSxzLmRpcmVjdGlvbixnLDEpLGw9dHlwZW9mIHMubWV0YWRhdGE/LmVudHJpZXM8InUiP0FycmF5LmZyb20ocy5tZXRhZGF0YS5lbnRyaWVzKCkpOltdLGM9e2ltYWdlVHlwZTpzLmltYWdlVHlwZSxuYW1lOnMubmFtZSxvcmlnaW46cy5vcmlnaW4sc3BhY2luZzpzLnNwYWNpbmcsZGlyZWN0aW9uOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gLHNpemU6cy5zaXplLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbWV0YWRhdGE6bH07XyhBLGMsZyk7YnJlYWt9Y2FzZSBkLk1lc2g6e2xldCBzPUMuZGF0YSxmPW0oQSxzLnBvaW50cyxnLDApLEI9bShBLHMuY2VsbHMsZywxKSxsPW0oQSxzLnBvaW50RGF0YSxnLDIpLGM9bShBLHMuY2VsbERhdGEsZywzKSxFPXttZXNoVHlwZTpzLm1lc2hUeXBlLG5hbWU6cy5uYW1lLG51bWJlck9mUG9pbnRzOnMubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG51bWJlck9mQ2VsbHM6cy5udW1iZXJPZkNlbGxzLGNlbGxzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gLGNlbGxCdWZmZXJTaXplOnMuY2VsbEJ1ZmZlclNpemUsbnVtYmVyT2ZQb2ludFBpeGVsczpzLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLG51bWJlck9mQ2VsbFBpeGVsczpzLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YH07XyhBLEUsZyk7YnJlYWt9Y2FzZSBkLlBvaW50U2V0OntsZXQgcz1DLmRhdGEsZj1tKEEscy5wb2ludHMsZywwKSxCPW0oQSxzLnBvaW50RGF0YSxnLDEpLGw9e3BvaW50U2V0VHlwZTpzLnBvaW50U2V0VHlwZSxuYW1lOnMubmFtZSxudW1iZXJPZlBvaW50czpzLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxudW1iZXJPZlBvaW50UGl4ZWxzOnMubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWB9O18oQSxsLGcpO2JyZWFrfWNhc2UgZC5UcmFuc2Zvcm1MaXN0OntsZXQgcz1DLmRhdGEsZj1bXSxCPTA7cy5mb3JFYWNoKGw9PntsZXQgYz0iIixFPSIiO2wudHJhbnNmb3JtVHlwZS50cmFuc2Zvcm1QYXJhbWV0ZXJpemF0aW9uIT09IkNvbXBvc2l0ZSImJihjPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bShBLGwuZml4ZWRQYXJhbWV0ZXJzLGcsQil9YCxCKz0xLEU9YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHttKEEsbC5wYXJhbWV0ZXJzLGcsQil9YCxCKz0xKTtsZXQgcD17dHJhbnNmb3JtVHlwZTpsLnRyYW5zZm9ybVR5cGUsbnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM6bC5udW1iZXJPZkZpeGVkUGFyYW1ldGVycyxudW1iZXJPZlBhcmFtZXRlcnM6bC5udW1iZXJPZlBhcmFtZXRlcnMsbmFtZTpsLm5hbWUsaW5wdXRTcGFjZU5hbWU6bC5pbnB1dFNwYWNlTmFtZSxvdXRwdXRTcGFjZU5hbWU6bC5vdXRwdXRTcGFjZU5hbWUscGFyYW1ldGVyczpFLGZpeGVkUGFyYW1ldGVyczpjfTtmLnB1c2gocCl9KSxfKEEsZixnKTticmVha31jYXNlIGQuUG9seURhdGE6e2xldCBzPUMuZGF0YSxmPW0oQSxzLnBvaW50cyxnLDApLEI9bShBLHMudmVydGljZXMsZywxKSxsPW0oQSxzLmxpbmVzLGcsMiksYz1tKEEscy5wb2x5Z29ucyxnLDMpLEU9bShBLHMudHJpYW5nbGVTdHJpcHMsZyw0KSxwPW0oQSxzLnBvaW50RGF0YSxnLDUpLEo9bShBLHMucG9pbnREYXRhLGcsNiksRD17cG9seURhdGFUeXBlOnMucG9seURhdGFUeXBlLG5hbWU6cy5uYW1lLG51bWJlck9mUG9pbnRzOnMubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLHZlcnRpY2VzQnVmZmVyU2l6ZTpzLnZlcnRpY2VzQnVmZmVyU2l6ZSx2ZXJ0aWNlczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YCxsaW5lc0J1ZmZlclNpemU6cy5saW5lc0J1ZmZlclNpemUsbGluZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAscG9seWdvbnNCdWZmZXJTaXplOnMucG9seWdvbnNCdWZmZXJTaXplLHBvbHlnb25zOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gLHRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTpzLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSx0cmlhbmdsZVN0cmlwczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCxudW1iZXJPZlBvaW50UGl4ZWxzOnMubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtwfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOnMubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Sn1gfTtfKEEsRCxnKTticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBpbnB1dCBJbnRlcmZhY2VUeXBlIil9fSksQS5yZXNldE1vZHVsZVN0ZG91dCgpLEEucmVzZXRNb2R1bGVTdGRlcnIoKTtsZXQgcj1BLnN0YWNrU2F2ZSgpLGk9MDt0cnl7aT1BLmNhbGxNYWluKGUuc2xpY2UoKSl9Y2F0Y2goQyl7dGhyb3cgdHlwZW9mIEM9PSJudW1iZXIiJiYoY29uc29sZS5sb2coIkV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHBpcGVsaW5lOiIpLGNvbnNvbGUubG9nKCJzdGRvdXQ6IixBLmdldE1vZHVsZVN0ZG91dCgpKSxjb25zb2xlLmVycm9yKCJzdGRlcnI6IixBLmdldE1vZHVsZVN0ZGVycigpKSx0eXBlb2YgQS5nZXRFeGNlcHRpb25NZXNzYWdlPCJ1Ij9jb25zb2xlLmVycm9yKCJleGNlcHRpb246IixBLmdldEV4Y2VwdGlvbk1lc3NhZ2UoQykpOmNvbnNvbGUuZXJyb3IoIkJ1aWxkIG1vZHVsZSBpbiBEZWJ1ZyBtb2RlIGZvciBleGNlcHRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4iKSksQ31maW5hbGx5e0Euc3RhY2tSZXN0b3JlKHIpfWxldCBvPUEuZ2V0TW9kdWxlU3Rkb3V0KCksYT1BLmdldE1vZHVsZVN0ZGVycigpLFE9W107cmV0dXJuIHQhPW51bGwmJnQubGVuZ3RoPjAmJmk9PT0wJiZ0LmZvckVhY2goZnVuY3Rpb24oQyxnKXtsZXQgcz1udWxsO3N3aXRjaChDLnR5cGUpe2Nhc2UgZC5UZXh0U3RyZWFtOntsZXQgQj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxnLDBdKT4+PjAsbD1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxnLDBdKSxjPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixCLGwpO3M9e2RhdGE6eHQuZGVjb2RlKGMpfTticmVha31jYXNlIGQuSnNvbkNvbXBhdGlibGU6e2xldCBCPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGcsMF0pPj4+MCxsPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGcsMF0pLGM9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLEIsbCk7cz1KU09OLnBhcnNlKHh0LmRlY29kZShjKSk7YnJlYWt9Y2FzZSBkLkJpbmFyeVN0cmVhbTp7bGV0IEI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsZywwXSk+Pj4wLGw9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsZywwXSk7cz17ZGF0YTpqdChBLEIsbCl9O2JyZWFrfWNhc2UgZC5UZXh0RmlsZTp7cz17cGF0aDpDLmRhdGEucGF0aCxkYXRhOkEuZnNfcmVhZEZpbGUoQy5kYXRhLnBhdGgse2VuY29kaW5nOiJ1dGY4In0pfTticmVha31jYXNlIGQuQmluYXJ5RmlsZTp7cz17cGF0aDpDLmRhdGEucGF0aCxkYXRhOmpyKEEsQy5kYXRhLnBhdGgpfTticmVha31jYXNlIGQuSW1hZ2U6e2xldCBCPUZBKEEsZyk7Qi5kYXRhPVIoQSxnLDAsQi5pbWFnZVR5cGUuY29tcG9uZW50VHlwZSksQi5kaXJlY3Rpb249UihBLGcsMSxYLkZsb2F0NjQpLEIubWV0YWRhdGE9bmV3IE1hcChCLm1ldGFkYXRhKSxzPUI7YnJlYWt9Y2FzZSBkLk1lc2g6e2xldCBCPUZBKEEsZyk7Qi5udW1iZXJPZlBvaW50cz4wP0IucG9pbnRzPVIoQSxnLDAsQi5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUpOkIucG9pbnRzPVAoQi5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbHM+MD9CLmNlbGxzPVIoQSxnLDEsQi5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSk6Qi5jZWxscz1QKEIubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mUG9pbnRQaXhlbHM+MD9CLnBvaW50RGF0YT1SKEEsZywyLEIubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkIucG9pbnREYXRhPVAoQi5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/Qi5jZWxsRGF0YT1SKEEsZywzLEIubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5jZWxsRGF0YT1QKEIubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLHM9QjticmVha31jYXNlIGQuUG9pbnRTZXQ6e2xldCBCPUZBKEEsZyk7Qi5udW1iZXJPZlBvaW50cz4wP0IucG9pbnRzPVIoQSxnLDAsQi5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpCLnBvaW50cz1QKEIucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPVIoQSxnLDEsQi5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkIucG9pbnREYXRhPVAoQi5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxzPUI7YnJlYWt9Y2FzZSBkLlRyYW5zZm9ybUxpc3Q6e2xldCBCPUZBKEEsZyksbD0wO0IuZm9yRWFjaCgoYyxFKT0+e2MudHJhbnNmb3JtVHlwZS50cmFuc2Zvcm1QYXJhbWV0ZXJpemF0aW9uIT09IkNvbXBvc2l0ZSImJihjLm51bWJlck9mRml4ZWRQYXJhbWV0ZXJzPjAmJihCW0VdLmZpeGVkUGFyYW1ldGVycz1SKEEsZyxsLFguRmxvYXQ2NCkpLGwrPTEsYy5udW1iZXJPZlBhcmFtZXRlcnM+MCYmKEJbRV0ucGFyYW1ldGVycz1SKEEsZyxsLGMudHJhbnNmb3JtVHlwZS5wYXJhbWV0ZXJzVmFsdWVUeXBlKSksbCs9MSl9KSxzPUI7YnJlYWt9Y2FzZSBkLlBvbHlEYXRhOntsZXQgQj1GQShBLGcpO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1SKEEsZywwLFguRmxvYXQzMik6Qi5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSxCLnZlcnRpY2VzQnVmZmVyU2l6ZT4wP0IudmVydGljZXM9UihBLGcsMSxOLlVJbnQzMik6Qi52ZXJ0aWNlcz1uZXcgVWludDMyQXJyYXksQi5saW5lc0J1ZmZlclNpemU+MD9CLmxpbmVzPVIoQSxnLDIsTi5VSW50MzIpOkIubGluZXM9bmV3IFVpbnQzMkFycmF5LEIucG9seWdvbnNCdWZmZXJTaXplPjA/Qi5wb2x5Z29ucz1SKEEsZywzLE4uVUludDMyKTpCLnBvbHlnb25zPW5ldyBVaW50MzJBcnJheSxCLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT4wP0IudHJpYW5nbGVTdHJpcHM9UihBLGcsNCxOLlVJbnQzMik6Qi50cmlhbmdsZVN0cmlwcz1uZXcgVWludDMyQXJyYXksQi5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qi5wb2ludERhdGE9UihBLGcsNSxCLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5wb2ludERhdGE9UChCLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/Qi5jZWxsRGF0YT1SKEEsZyw2LEIucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkIuY2VsbERhdGE9UChCLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSkscz1CO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIG91dHB1dCBJbnRlcmZhY2VUeXBlIil9bGV0IGY9e3R5cGU6Qy50eXBlLGRhdGE6c307US5wdXNoKGYpfSkse3JldHVyblZhbHVlOmksc3Rkb3V0Om8sc3RkZXJyOmEsb3V0cHV0czpRfX12YXIgdnQ9dnI7dmFyIF9yPXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPCJ1IjtmdW5jdGlvbiBacihBLGUpe2lmKEE9PW51bGwpcmV0dXJuW107bGV0IHQ9W107Zm9yKGxldCBJPTA7STxBLmxlbmd0aDtJKyspe2xldCByPVZyKEFbSV0sZSk7ciE9PW51bGwmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBWcihBLGUpe2lmKEE9PW51bGwpcmV0dXJuIG51bGw7bGV0IHQ9bnVsbDtyZXR1cm4gQS5idWZmZXIhPT12b2lkIDA/dD1BLmJ1ZmZlcjpBLmJ5dGVMZW5ndGghPT12b2lkIDAmJih0PUEpLF9yJiZ0IGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/bnVsbDplP3Q6dC5zbGljZSgwKX12YXIgX3Q9WnI7ZnVuY3Rpb24gWHIoQSl7cmV0dXJuW0EuZGF0YSxBLmRpcmVjdGlvbl19dmFyIFp0PVhyO2Z1bmN0aW9uIHpyKEEpe3JldHVybltBLnBvaW50cyxBLnBvaW50RGF0YSxBLmNlbGxzLEEuY2VsbERhdGFdfXZhciBWdD16cjtmdW5jdGlvbiAkcihBKXtyZXR1cm5bQS5wb2ludHMsQS52ZXJ0aWNlcyxBLmxpbmVzLEEucG9seWdvbnMsQS50cmlhbmdsZVN0cmlwcyxBLnBvaW50RGF0YSxBLmNlbGxEYXRhXX12YXIgWHQ9JHI7dmFyIEFpO2Z1bmN0aW9uICRBKCl7cmV0dXJuIEFpfXZhciBlaTtmdW5jdGlvbiB6dCgpe3JldHVybiBlaX12YXIgdGk7ZnVuY3Rpb24gQWUoKXtyZXR1cm4gdGl9dmFyIE1lPW5ldyBNYXA7ZnVuY3Rpb24gSWkoKXtsZXQgQT1BZSgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPW51bGwpLEF9ZnVuY3Rpb24gJHQoKXtsZXQgQT0kQSgpO3JldHVybiB0eXBlb2YgQT4idSImJihBPW5ldyBVUkwoIi9waXBlbGluZXMiLGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikuaHJlZiksQX1mdW5jdGlvbiBlZSgpe2xldCBBPXp0KCk7cmV0dXJuIHR5cGVvZiBBPiJ1IiYmKEE9e30pLEF9YXN5bmMgZnVuY3Rpb24gcmkoQSxlLHQpe2xldCBJPUEscj1BO2lmKHR5cGVvZiBBIT0ic3RyaW5nIiYmKEk9bmV3IFVSTChBLmhyZWYpLHI9SS5ocmVmKSxNZS5oYXMocikpcmV0dXJuIE1lLmdldChyKTt7bGV0IGk9YXdhaXQgVHQoQSxlPy50b1N0cmluZygpPz8kdCgpLHQ/P2VlKCkpO3JldHVybiBNZS5zZXQocixpKSxpfX1hc3luYyBmdW5jdGlvbiBpaShBLGUsdCxJLHIpe2lmKCFhd2FpdCBLdCgpKXtsZXQgRT0iV2ViQXNzZW1ibHkgU0lNRCBzdXBwb3J0IGlzIHJlcXVpcmVkIC0tIHBsZWFzZSB1cGRhdGUgeW91ciBicm93c2VyLiI7dGhyb3cgYWxlcnQoRSksbmV3IEVycm9yKEUpfWxldCBpPXI/LndlYldvcmtlcj8/bnVsbDtpZihpPT09ITEpe2xldCBFPWF3YWl0IHJpKEEudG9TdHJpbmcoKSxyPy5waXBlbGluZUJhc2VVcmwscj8ucGlwZWxpbmVRdWVyeVBhcmFtcz8/ZWUoKSk7cmV0dXJuIHZ0KEUsZSx0LEkpfWxldCBvPWksYT1yPy5waXBlbGluZVdvcmtlclVybD8/SWkoKSxRPXR5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGE/LmhyZWY8InUiP2EuaHJlZjphLHt3b3JrZXJQcm94eTpDLHdvcmtlcjpnfT1hd2FpdCBIdChvLFEscj8ucGlwZWxpbmVRdWVyeVBhcmFtcz8/ZWUoKSk7bz1nO2xldCBzPVtdO0khPW51bGwmJkkubGVuZ3RoPjAmJkkuZm9yRWFjaChmdW5jdGlvbihFKXtpZihFLnR5cGU9PT1kLkJpbmFyeVN0cmVhbSl7bGV0IHA9RS5kYXRhLmRhdGE7cy5wdXNoKHApfWVsc2UgaWYoRS50eXBlPT09ZC5CaW5hcnlGaWxlKXtsZXQgcD1FLmRhdGEuZGF0YTtzLnB1c2gocCl9ZWxzZSBpZihFLnR5cGU9PT1kLkltYWdlKXtsZXQgcD1FLmRhdGE7cC5kYXRhIT09bnVsbCYmcy5wdXNoKC4uLlp0KHApKX1lbHNlIGlmKEUudHlwZT09PWQuTWVzaCl7bGV0IHA9RS5kYXRhO3MucHVzaCguLi5WdChwKSl9ZWxzZSBpZihFLnR5cGU9PT1kLlBvbHlEYXRhKXtsZXQgcD1FLmRhdGE7cy5wdXNoKC4uLlh0KHApKX19KTtsZXQgZj1yPy5waXBlbGluZUJhc2VVcmw/PyR0KCksQj10eXBlb2YgZiE9InN0cmluZyImJnR5cGVvZiBmPy5ocmVmPCJ1Ij9mLmhyZWY6ZixsPUkhPW51bGw/bmUoSSxfdChzLHI/Lm5vQ29weSkpOm51bGwsYz1hd2FpdCBDLnJ1blBpcGVsaW5lKEEudG9TdHJpbmcoKSxCLGUsdCxsLHI/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P2VlKCkpO3JldHVybntyZXR1cm5WYWx1ZTpjLnJldHVyblZhbHVlLHN0ZG91dDpjLnN0ZG91dCxzdGRlcnI6Yy5zdGRlcnIsb3V0cHV0czpjLm91dHB1dHMsd2ViV29ya2VyOm99fXZhciBMPWlpO3ZhciBvaT1udWxsO2Z1bmN0aW9uIEFJKCl7cmV0dXJuIG9pfXZhciBIZSxnaT1gaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9AaXRrLXdhc20vZG93bnNhbXBsZUAke0llfS9kaXN0L3BpcGVsaW5lc2A7ZnVuY3Rpb24gUGEoQSl7SGU9QX1mdW5jdGlvbiBPKCl7aWYodHlwZW9mIEhlPCJ1IilyZXR1cm4gSGU7bGV0IEE9JEEoKTtyZXR1cm4gdHlwZW9mIEE8InUiP0E6Z2l9dmFyIFllLG5pPW51bGw7ZnVuY3Rpb24gZUkoQSl7WWU9QX1mdW5jdGlvbiBiKCl7aWYodHlwZW9mIFllPCJ1IilyZXR1cm4gWWU7bGV0IEE9QWUoKTtyZXR1cm4gdHlwZW9mIEE8InUiP0E6bml9dmFyIENBPW51bGw7YXN5bmMgZnVuY3Rpb24gdEkoKXtsZXQgQT1iKCksZT10eXBlb2YgQSE9InN0cmluZyImJnR5cGVvZiBBPy5ocmVmPCJ1Ij9BLmhyZWY6QTtDQT1hd2FpdCBTQShlKX1mdW5jdGlvbiBWYShBKXtDQT1BfWFzeW5jIGZ1bmN0aW9uIHEoKXtpZihDQSE9PW51bGwpcmV0dXJuIENBLnRlcm1pbmF0ZWQmJmF3YWl0IHRJKCksQ0E7bGV0IEE9QUkoKTtyZXR1cm4gQSE9PW51bGw/QTooYXdhaXQgdEkoKSxDQSl9YXN5bmMgZnVuY3Rpb24gYWkoQSxlPXtzaHJpbmtGYWN0b3JzOlsyLDJdfSl7bGV0IHQ9W3t0eXBlOmQuSW1hZ2V9XSxJPVt7dHlwZTpkLkltYWdlLGRhdGE6QX1dLHI9W107aWYoci5wdXNoKCIwIiksci5wdXNoKCIwIiksci5wdXNoKCItLW1lbW9yeS1pbyIpLHR5cGVvZiBlLnNocmlua0ZhY3RvcnM8InUiKXtpZihlLnNocmlua0ZhY3RvcnMubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCcic2hyaW5rLWZhY3RvcnMiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAyJyk7ci5wdXNoKCItLXNocmluay1mYWN0b3JzIiksYXdhaXQgUHJvbWlzZS5hbGwoZS5zaHJpbmtGYWN0b3JzLm1hcChhc3luYyBsPT57ci5wdXNoKGwudG9TdHJpbmcoKSl9KSl9dHlwZW9mIGUuaW5mb3JtYXRpb25Pbmx5PCJ1IiYmZS5pbmZvcm1hdGlvbk9ubHkmJnIucHVzaCgiLS1pbmZvcm1hdGlvbi1vbmx5Iik7bGV0IGE9ImRvd25zYW1wbGUtYmluLXNocmluayIsUT1lPy53ZWJXb3JrZXI7UT09PXZvaWQgMCYmKFE9YXdhaXQgcSgpKTtsZXR7d2ViV29ya2VyOkMscmV0dXJuVmFsdWU6ZyxzdGRlcnI6cyxvdXRwdXRzOmZ9PWF3YWl0IEwoYSxyLHQsSSx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpiKCksd2ViV29ya2VyOlEsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGchPT0wJiZzIT09IiIpdGhyb3cgbmV3IEVycm9yKHMpO3JldHVybnt3ZWJXb3JrZXI6Qyxkb3duc2FtcGxlZDpmWzBdPy5kYXRhfX12YXIgc2k9YWk7YXN5bmMgZnVuY3Rpb24gQ2koQSxlPXtzaHJpbmtGYWN0b3JzOlsyLDJdfSl7bGV0IHQ9W3t0eXBlOmQuSW1hZ2V9XSxJPVt7dHlwZTpkLkltYWdlLGRhdGE6QX1dLHI9W107aWYoci5wdXNoKCIwIiksci5wdXNoKCIwIiksci5wdXNoKCItLW1lbW9yeS1pbyIpLHR5cGVvZiBlLnNocmlua0ZhY3RvcnM8InUiKXtpZihlLnNocmlua0ZhY3RvcnMubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCcic2hyaW5rLWZhY3RvcnMiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAyJyk7ci5wdXNoKCItLXNocmluay1mYWN0b3JzIiksYXdhaXQgUHJvbWlzZS5hbGwoZS5zaHJpbmtGYWN0b3JzLm1hcChhc3luYyBsPT57ci5wdXNoKGwudG9TdHJpbmcoKSl9KSl9aWYodHlwZW9mIGUuY3JvcFJhZGl1czwidSIpe2lmKGUuY3JvcFJhZGl1cy5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoJyJjcm9wLXJhZGl1cyIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDInKTtyLnB1c2goIi0tY3JvcC1yYWRpdXMiKSxhd2FpdCBQcm9taXNlLmFsbChlLmNyb3BSYWRpdXMubWFwKGFzeW5jIGw9PntyLnB1c2gobC50b1N0cmluZygpKX0pKX1sZXQgYT0iZG93bnNhbXBsZS1sYWJlbC1pbWFnZSIsUT1lPy53ZWJXb3JrZXI7UT09PXZvaWQgMCYmKFE9YXdhaXQgcSgpKTtsZXR7d2ViV29ya2VyOkMscmV0dXJuVmFsdWU6ZyxzdGRlcnI6cyxvdXRwdXRzOmZ9PWF3YWl0IEwoYSxyLHQsSSx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpiKCksd2ViV29ya2VyOlEsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGchPT0wJiZzIT09IiIpdGhyb3cgbmV3IEVycm9yKHMpO3JldHVybnt3ZWJXb3JrZXI6Qyxkb3duc2FtcGxlZDpmWzBdPy5kYXRhfX12YXIgQmk9Q2k7YXN5bmMgZnVuY3Rpb24gUWkoQT17c2hyaW5rRmFjdG9yczpbMiwyXX0pe2xldCBlPVt7dHlwZTpkLkpzb25Db21wYXRpYmxlfV0sdD1bXSxJPVtdO2lmKEkucHVzaCgiMCIpLEkucHVzaCgiLS1tZW1vcnktaW8iKSx0eXBlb2YgQS5zaHJpbmtGYWN0b3JzPCJ1Iil7aWYoQS5zaHJpbmtGYWN0b3JzLmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcignInNocmluay1mYWN0b3JzIiBvcHRpb24gbXVzdCBoYXZlIGEgbGVuZ3RoID4gMScpO0kucHVzaCgiLS1zaHJpbmstZmFjdG9ycyIpLGF3YWl0IFByb21pc2UuYWxsKEEuc2hyaW5rRmFjdG9ycy5tYXAoYXN5bmMgZj0+e0kucHVzaChmLnRvU3RyaW5nKCkpfSkpfWxldCBpPSJkb3duc2FtcGxlLXNpZ21hIixvPUE/LndlYldvcmtlcjtvPT09dm9pZCAwJiYobz1hd2FpdCBxKCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpRLHN0ZGVycjpDLG91dHB1dHM6Z309YXdhaXQgTChpLEksZSx0LHtwaXBlbGluZUJhc2VVcmw6TygpLHBpcGVsaW5lV29ya2VyVXJsOmIoKSx3ZWJXb3JrZXI6byxub0NvcHk6QT8ubm9Db3B5fSk7aWYoUSE9PTAmJkMhPT0iIil0aHJvdyBuZXcgRXJyb3IoQyk7cmV0dXJue3dlYldvcmtlcjphLHNpZ21hOmdbMF0/LmRhdGF9fXZhciBFaT1RaTthc3luYyBmdW5jdGlvbiBsaShBLGU9e3Nocmlua0ZhY3RvcnM6WzIsMl19KXtsZXQgdD1be3R5cGU6ZC5JbWFnZX1dLEk9W3t0eXBlOmQuSW1hZ2UsZGF0YTpBfV0scj1bXTtpZihyLnB1c2goIjAiKSxyLnB1c2goIjAiKSxyLnB1c2goIi0tbWVtb3J5LWlvIiksdHlwZW9mIGUuc2hyaW5rRmFjdG9yczwidSIpe2lmKGUuc2hyaW5rRmFjdG9ycy5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoJyJzaHJpbmstZmFjdG9ycyIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDInKTtyLnB1c2goIi0tc2hyaW5rLWZhY3RvcnMiKSxhd2FpdCBQcm9taXNlLmFsbChlLnNocmlua0ZhY3RvcnMubWFwKGFzeW5jIGw9PntyLnB1c2gobC50b1N0cmluZygpKX0pKX1pZih0eXBlb2YgZS5jcm9wUmFkaXVzPCJ1Iil7aWYoZS5jcm9wUmFkaXVzLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcignImNyb3AtcmFkaXVzIiBvcHRpb24gbXVzdCBoYXZlIGEgbGVuZ3RoID4gMicpO3IucHVzaCgiLS1jcm9wLXJhZGl1cyIpLGF3YWl0IFByb21pc2UuYWxsKGUuY3JvcFJhZGl1cy5tYXAoYXN5bmMgbD0+e3IucHVzaChsLnRvU3RyaW5nKCkpfSkpfWxldCBhPSJkb3duc2FtcGxlIixRPWU/LndlYldvcmtlcjtRPT09dm9pZCAwJiYoUT1hd2FpdCBxKCkpO2xldHt3ZWJXb3JrZXI6QyxyZXR1cm5WYWx1ZTpnLHN0ZGVycjpzLG91dHB1dHM6Zn09YXdhaXQgTChhLHIsdCxJLHtwaXBlbGluZUJhc2VVcmw6TygpLHBpcGVsaW5lV29ya2VyVXJsOmIoKSx3ZWJXb3JrZXI6USxub0NvcHk6ZT8ubm9Db3B5fSk7aWYoZyE9PTAmJnMhPT0iIil0aHJvdyBuZXcgRXJyb3Iocyk7cmV0dXJue3dlYldvcmtlcjpDLGRvd25zYW1wbGVkOmZbMF0/LmRhdGF9fXZhciBjaT1saTthc3luYyBmdW5jdGlvbiBmaShBPXtzaXplOlsxLDFdLHNpZ21hOlsxLDFdfSl7bGV0IGU9W3t0eXBlOmQuSnNvbkNvbXBhdGlibGV9XSx0PVtdLEk9W107aWYoSS5wdXNoKCIwIiksSS5wdXNoKCItLW1lbW9yeS1pbyIpLHR5cGVvZiBBLnNpemU8InUiKXtpZihBLnNpemUubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcic2l6ZSIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDEnKTtJLnB1c2goIi0tc2l6ZSIpLGF3YWl0IFByb21pc2UuYWxsKEEuc2l6ZS5tYXAoYXN5bmMgZj0+e0kucHVzaChmLnRvU3RyaW5nKCkpfSkpfWlmKHR5cGVvZiBBLnNpZ21hPCJ1Iil7aWYoQS5zaWdtYS5sZW5ndGg8MSl0aHJvdyBuZXcgRXJyb3IoJyJzaWdtYSIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDEnKTtJLnB1c2goIi0tc2lnbWEiKSxhd2FpdCBQcm9taXNlLmFsbChBLnNpZ21hLm1hcChhc3luYyBmPT57SS5wdXNoKGYudG9TdHJpbmcoKSl9KSl9dHlwZW9mIEEubWF4S2VybmVsV2lkdGg8InUiJiZJLnB1c2goIi0tbWF4LWtlcm5lbC13aWR0aCIsQS5tYXhLZXJuZWxXaWR0aC50b1N0cmluZygpKSx0eXBlb2YgQS5tYXhLZXJuZWxFcnJvcjwidSImJkkucHVzaCgiLS1tYXgta2VybmVsLWVycm9yIixBLm1heEtlcm5lbEVycm9yLnRvU3RyaW5nKCkpO2xldCBpPSJnYXVzc2lhbi1rZXJuZWwtcmFkaXVzIixvPUE/LndlYldvcmtlcjtvPT09dm9pZCAwJiYobz1hd2FpdCBxKCkpO2xldHt3ZWJXb3JrZXI6YSxyZXR1cm5WYWx1ZTpRLHN0ZGVycjpDLG91dHB1dHM6Z309YXdhaXQgTChpLEksZSx0LHtwaXBlbGluZUJhc2VVcmw6TygpLHBpcGVsaW5lV29ya2VyVXJsOmIoKSx3ZWJXb3JrZXI6byxub0NvcHk6QT8ubm9Db3B5fSk7aWYoUSE9PTAmJkMhPT0iIil0aHJvdyBuZXcgRXJyb3IoQyk7cmV0dXJue3dlYldvcmtlcjphLHJhZGl1czpnWzBdPy5kYXRhfX12YXIgdWk9Zmk7YXN5bmMgZnVuY3Rpb24gZGkoQSxlLHQsST17fSl7bGV0IHI9W3t0eXBlOmQuSnNvbkNvbXBhdGlibGV9XSxpPVt7dHlwZTpkLlRyYW5zZm9ybUxpc3QsZGF0YTpBfSx7dHlwZTpkLkltYWdlLGRhdGE6ZX0se3R5cGU6ZC5JbWFnZSxkYXRhOnR9XSxvPVtdO28ucHVzaCgiMCIpLG8ucHVzaCgiMSIpLG8ucHVzaCgiMiIpLG8ucHVzaCgiMCIpLG8ucHVzaCgiLS1tZW1vcnktaW8iKSx0eXBlb2YgSS5wYWRkaW5nPCJ1IiYmby5wdXNoKCItLXBhZGRpbmciLEkucGFkZGluZy50b1N0cmluZygpKTtsZXQgcz0icmVzYW1wbGUtYm91bmRpbmctYm94IixmPUk/LndlYldvcmtlcjtmPT09dm9pZCAwJiYoZj1hd2FpdCBxKCkpO2xldHt3ZWJXb3JrZXI6QixyZXR1cm5WYWx1ZTpsLHN0ZGVycjpjLG91dHB1dHM6RX09YXdhaXQgTChzLG8scixpLHtwaXBlbGluZUJhc2VVcmw6TygpLHBpcGVsaW5lV29ya2VyVXJsOmIoKSx3ZWJXb3JrZXI6Zixub0NvcHk6ST8ubm9Db3B5fSk7aWYobCE9PTAmJmMhPT0iIil0aHJvdyBuZXcgRXJyb3IoYyk7cmV0dXJue3dlYldvcmtlcjpCLGJvdW5kaW5nQm94OkVbMF0/LmRhdGF9fXZhciBwaT1kaTt2YXIgSUk9J2RhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsdmFyIHFlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTWU9KEEsdCk9Pntmb3IodmFyIGUgaW4gdClxZShBLGUse2dldDp0W2VdLGVudW1lcmFibGU6ITB9KX07dmFyIEx0PVN5bWJvbCgiQ29tbGluay5wcm94eSIpLE9lPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLFRlPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxYQT1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksU0E9U3ltYm9sKCJDb21saW5rLnRocm93biIpLGJ0PUE9PnR5cGVvZiBBPT0ib2JqZWN0IiYmQSE9PW51bGx8fHR5cGVvZiBBPT0iZnVuY3Rpb24iLEtlPXtjYW5IYW5kbGU6QT0+YnQoQSkmJkFbTHRdLHNlcmlhbGl6ZShBKXtsZXR7cG9ydDE6dCxwb3J0MjplfT1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIFVBKEEsdCksW2UsW2VdXX0sZGVzZXJpYWxpemUoQSl7cmV0dXJuIEEuc3RhcnQoKSxXZShBKX19LHhlPXtjYW5IYW5kbGU6QT0+YnQoQSkmJlNBIGluIEEsc2VyaWFsaXplKHt2YWx1ZTpBfSl7bGV0IHQ7cmV0dXJuIEEgaW5zdGFuY2VvZiBFcnJvcj90PXtpc0Vycm9yOiEwLHZhbHVlOnttZXNzYWdlOkEubWVzc2FnZSxuYW1lOkEubmFtZSxzdGFjazpBLnN0YWNrfX06dD17aXNFcnJvcjohMSx2YWx1ZTpBfSxbdCxbXV19LGRlc2VyaWFsaXplKEEpe3Rocm93IEEuaXNFcnJvcj9PYmplY3QuYXNzaWduKG5ldyBFcnJvcihBLnZhbHVlLm1lc3NhZ2UpLEEudmFsdWUpOkEudmFsdWV9fSxKdD1uZXcgTWFwKFtbInByb3h5IixLZV0sWyJ0aHJvdyIseGVdXSk7ZnVuY3Rpb24gUGUoQSx0KXtmb3IobGV0IGUgb2YgQSlpZih0PT09ZXx8ZT09PSIqInx8ZSBpbnN0YW5jZW9mIFJlZ0V4cCYmZS50ZXN0KHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFVBKEEsdD1nbG9iYWxUaGlzLGU9WyIqIl0pe3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gSShyKXtpZighcnx8IXIuZGF0YSlyZXR1cm47aWYoIVBlKGUsci5vcmlnaW4pKXtjb25zb2xlLndhcm4oYEludmFsaWQgb3JpZ2luIFwnJHtyLm9yaWdpbn1cJyBmb3IgY29tbGluayBwcm94eWApO3JldHVybn1sZXR7aWQ6byx0eXBlOmcscGF0aDpzfT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxyLmRhdGEpLGM9KHIuZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoXyksQjt0cnl7bGV0IGk9cy5zbGljZSgwLC0xKS5yZWR1Y2UoKGwsQyk9PmxbQ10sQSksYT1zLnJlZHVjZSgobCxDKT0+bFtDXSxBKTtzd2l0Y2goZyl7Y2FzZSJHRVQiOkI9YTticmVhaztjYXNlIlNFVCI6aVtzLnNsaWNlKC0xKVswXV09XyhyLmRhdGEudmFsdWUpLEI9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6Qj1hLmFwcGx5KGksYyk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntsZXQgbD1uZXcgYSguLi5jKTtCPVhlKGwpfWJyZWFrO2Nhc2UiRU5EUE9JTlQiOntsZXR7cG9ydDE6bCxwb3J0MjpDfT1uZXcgTWVzc2FnZUNoYW5uZWw7VUEoQSxDKSxCPXZBKGwsW2xdKX1icmVhaztjYXNlIlJFTEVBU0UiOkI9dm9pZCAwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChpKXtCPXt2YWx1ZTppLFtTQV06MH19UHJvbWlzZS5yZXNvbHZlKEIpLmNhdGNoKGk9Pih7dmFsdWU6aSxbU0FdOjB9KSkudGhlbihpPT57bGV0W2EsbF09TkEoaSk7dC5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2lkOm99KSxsKSxnPT09IlJFTEVBU0UiJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixJKSxIdCh0KSxYQSBpbiBBJiZ0eXBlb2YgQVtYQV09PSJmdW5jdGlvbiImJkFbWEFdKCkpfSkuY2F0Y2goaT0+e2xldFthLGxdPU5BKHt2YWx1ZTpuZXcgVHlwZUVycm9yKCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUiKSxbU0FdOjB9KTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhKSx7aWQ6b30pLGwpfSl9KSx0LnN0YXJ0JiZ0LnN0YXJ0KCl9ZnVuY3Rpb24gamUoQSl7cmV0dXJuIEEuY29uc3RydWN0b3IubmFtZT09PSJNZXNzYWdlUG9ydCJ9ZnVuY3Rpb24gSHQoQSl7amUoQSkmJkEuY2xvc2UoKX1mdW5jdGlvbiBXZShBLHQpe3JldHVybiB6QShBLFtdLHQpfWZ1bmN0aW9uIHBBKEEpe2lmKEEpdGhyb3cgbmV3IEVycm9yKCJQcm94eSBoYXMgYmVlbiByZWxlYXNlZCBhbmQgaXMgbm90IHVzZWFibGUiKX1mdW5jdGlvbiBZdChBKXtyZXR1cm4geihBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntIdChBKX0pfXZhciBSQT1uZXcgV2Vha01hcCxGQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgdD0oUkEuZ2V0KEEpfHwwKS0xO1JBLnNldChBLHQpLHQ9PT0wJiZZdChBKX0pO2Z1bmN0aW9uIF9lKEEsdCl7bGV0IGU9KFJBLmdldCh0KXx8MCkrMTtSQS5zZXQodCxlKSxGQSYmRkEucmVnaXN0ZXIoQSx0LEEpfWZ1bmN0aW9uIFplKEEpe0ZBJiZGQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIHpBKEEsdD1bXSxlPWZ1bmN0aW9uKCl7fSl7bGV0IEk9ITEscj1uZXcgUHJveHkoZSx7Z2V0KG8sZyl7aWYocEEoSSksZz09PVRlKXJldHVybigpPT57WmUociksWXQoQSksST0hMH07aWYoZz09PSJ0aGVuIil7aWYodC5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5yfTtsZXQgcz16KEEse3R5cGU6IkdFVCIscGF0aDp0Lm1hcChjPT5jLnRvU3RyaW5nKCkpfSkudGhlbihfKTtyZXR1cm4gcy50aGVuLmJpbmQocyl9cmV0dXJuIHpBKEEsWy4uLnQsZ10pfSxzZXQobyxnLHMpe3BBKEkpO2xldFtjLEJdPU5BKHMpO3JldHVybiB6KEEse3R5cGU6IlNFVCIscGF0aDpbLi4udCxnXS5tYXAoaT0+aS50b1N0cmluZygpKSx2YWx1ZTpjfSxCKS50aGVuKF8pfSxhcHBseShvLGcscyl7cEEoSSk7bGV0IGM9dFt0Lmxlbmd0aC0xXTtpZihjPT09T2UpcmV0dXJuIHooQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbihfKTtpZihjPT09ImJpbmQiKXJldHVybiB6QShBLHQuc2xpY2UoMCwtMSkpO2xldFtCLGldPWt0KHMpO3JldHVybiB6KEEse3R5cGU6IkFQUExZIixwYXRoOnQubWFwKGE9PmEudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OkJ9LGkpLnRoZW4oXyl9LGNvbnN0cnVjdChvLGcpe3BBKEkpO2xldFtzLGNdPWt0KGcpO3JldHVybiB6KEEse3R5cGU6IkNPTlNUUlVDVCIscGF0aDp0Lm1hcChCPT5CLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpzfSxjKS50aGVuKF8pfX0pO3JldHVybiBfZShyLEEpLHJ9ZnVuY3Rpb24gVmUoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24ga3QoQSl7bGV0IHQ9QS5tYXAoTkEpO3JldHVyblt0Lm1hcChlPT5lWzBdKSxWZSh0Lm1hcChlPT5lWzFdKSldfXZhciBxdD1uZXcgV2Vha01hcDtmdW5jdGlvbiB2QShBLHQpe3JldHVybiBxdC5zZXQoQSx0KSxBfWZ1bmN0aW9uIFhlKEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1tMdF06ITB9KX1mdW5jdGlvbiBOQShBKXtmb3IobGV0W3QsZV1vZiBKdClpZihlLmNhbkhhbmRsZShBKSl7bGV0W0kscl09ZS5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOnQsdmFsdWU6SX0scl19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LHF0LmdldChBKXx8W11dfWZ1bmN0aW9uIF8oQSl7c3dpdGNoKEEudHlwZSl7Y2FzZSJIQU5ETEVSIjpyZXR1cm4gSnQuZ2V0KEEubmFtZSkuZGVzZXJpYWxpemUoQS52YWx1ZSk7Y2FzZSJSQVciOnJldHVybiBBLnZhbHVlfX1mdW5jdGlvbiB6KEEsdCxlKXtyZXR1cm4gbmV3IFByb21pc2UoST0+e2xldCByPXplKCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvKGcpeyFnLmRhdGF8fCFnLmRhdGEuaWR8fGcuZGF0YS5pZCE9PXJ8fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLEkoZy5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpyfSx0KSxlKX0pfWZ1bmN0aW9uIHplKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBuQShBLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBLmFwcGx5KHQsYXJndW1lbnRzKX19dmFye3RvU3RyaW5nOnZlfT1PYmplY3QucHJvdG90eXBlLHtnZXRQcm90b3R5cGVPZjprQX09T2JqZWN0LHtpdGVyYXRvcjpMQSx0b1N0cmluZ1RhZzp4dH09U3ltYm9sLGJBPShBPT50PT57bGV0IGU9dmUuY2FsbCh0KTtyZXR1cm4gQVtlXXx8KEFbZV09ZS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpKX0pKE9iamVjdC5jcmVhdGUobnVsbCkpLFk9QT0+KEE9QS50b0xvd2VyQ2FzZSgpLHQ9PmJBKHQpPT09QSksSkE9QT0+dD0+dHlwZW9mIHQ9PT1BLHtpc0FycmF5OiR9PUFycmF5LHY9SkEoInVuZGVmaW5lZCIpO2Z1bmN0aW9uIHNBKEEpe3JldHVybiBBIT09bnVsbCYmIXYoQSkmJkEuY29uc3RydWN0b3IhPT1udWxsJiYhdihBLmNvbnN0cnVjdG9yKSYmRyhBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSYmQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihBKX12YXIgUHQ9WSgiQXJyYXlCdWZmZXIiKTtmdW5jdGlvbiAkZShBKXtsZXQgdDtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyPCJ1IiYmQXJyYXlCdWZmZXIuaXNWaWV3P3Q9QXJyYXlCdWZmZXIuaXNWaWV3KEEpOnQ9QSYmQS5idWZmZXImJlB0KEEuYnVmZmVyKSx0fXZhciBBST1KQSgic3RyaW5nIiksRz1KQSgiZnVuY3Rpb24iKSxqdD1KQSgibnVtYmVyIiksYUE9QT0+QSE9PW51bGwmJnR5cGVvZiBBPT0ib2JqZWN0Iix0ST1BPT5BPT09ITB8fEE9PT0hMSxHQT1BPT57aWYoYkEoQSkhPT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgdD1rQShBKTtyZXR1cm4odD09PW51bGx8fHQ9PT1PYmplY3QucHJvdG90eXBlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk9PT1udWxsKSYmISh4dCBpbiBBKSYmIShMQSBpbiBBKX0sZUk9QT0+e2lmKCFhQShBKXx8c0EoQSkpcmV0dXJuITE7dHJ5e3JldHVybiBPYmplY3Qua2V5cyhBKS5sZW5ndGg9PT0wJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoQSk9PT1PYmplY3QucHJvdG90eXBlfWNhdGNoe3JldHVybiExfX0sSUk9WSgiRGF0ZSIpLHJJPVkoIkZpbGUiKSxvST1BPT4hIShBJiZ0eXBlb2YgQS51cmk8InUiKSxnST1BPT5BJiZ0eXBlb2YgQS5nZXRQYXJ0czwidSIsaUk9WSgiQmxvYiIpLG5JPVkoIkZpbGVMaXN0Iiksc0k9QT0+YUEoQSkmJkcoQS5waXBlKTtmdW5jdGlvbiBhSSgpe3JldHVybiB0eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnt9fXZhciBPdD1hSSgpLFR0PXR5cGVvZiBPdC5Gb3JtRGF0YTwidSI/T3QuRm9ybURhdGE6dm9pZCAwLENJPUE9PntpZighQSlyZXR1cm4hMTtpZihUdCYmQSBpbnN0YW5jZW9mIFR0KXJldHVybiEwO2xldCB0PWtBKEEpO2lmKCF0fHx0PT09T2JqZWN0LnByb3RvdHlwZXx8IUcoQS5hcHBlbmQpKXJldHVybiExO2xldCBlPWJBKEEpO3JldHVybiBlPT09ImZvcm1kYXRhInx8ZT09PSJvYmplY3QiJiZHKEEudG9TdHJpbmcpJiZBLnRvU3RyaW5nKCk9PT0iW29iamVjdCBGb3JtRGF0YV0ifSxCST1ZKCJVUkxTZWFyY2hQYXJhbXMiKSxbUUksRUksY0ksZkldPVsiUmVhZGFibGVTdHJlYW0iLCJSZXF1ZXN0IiwiUmVzcG9uc2UiLCJIZWFkZXJzIl0ubWFwKFkpLGxJPUE9PkEudHJpbT9BLnRyaW0oKTpBLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCIiKTtmdW5jdGlvbiBDQShBLHQse2FsbE93bktleXM6ZT0hMX09e30pe2lmKEE9PT1udWxsfHx0eXBlb2YgQT4idSIpcmV0dXJuO2xldCBJLHI7aWYodHlwZW9mIEEhPSJvYmplY3QiJiYoQT1bQV0pLCQoQSkpZm9yKEk9MCxyPUEubGVuZ3RoO0k8cjtJKyspdC5jYWxsKG51bGwsQVtJXSxJLEEpO2Vsc2V7aWYoc0EoQSkpcmV0dXJuO2xldCBvPWU/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQSk6T2JqZWN0LmtleXMoQSksZz1vLmxlbmd0aCxzO2ZvcihJPTA7STxnO0krKylzPW9bSV0sdC5jYWxsKG51bGwsQVtzXSxzLEEpfX1mdW5jdGlvbiBXdChBLHQpe2lmKHNBKEEpKXJldHVybiBudWxsO3Q9dC50b0xvd2VyQ2FzZSgpO2xldCBlPU9iamVjdC5rZXlzKEEpLEk9ZS5sZW5ndGgscjtmb3IoO0ktLSA+MDspaWYocj1lW0ldLHQ9PT1yLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHI7cmV0dXJuIG51bGx9dmFyIFo9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxfdD1BPT4hdihBKSYmQSE9PVo7ZnVuY3Rpb24gJEEoKXtsZXR7Y2FzZWxlc3M6QSxza2lwVW5kZWZpbmVkOnR9PV90KHRoaXMpJiZ0aGlzfHx7fSxlPXt9LEk9KHIsbyk9PntpZihvPT09Il9fcHJvdG9fXyJ8fG89PT0iY29uc3RydWN0b3IifHxvPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBnPUEmJld0KGUsbyl8fG87R0EoZVtnXSkmJkdBKHIpP2VbZ109JEEoZVtnXSxyKTpHQShyKT9lW2ddPSRBKHt9LHIpOiQocik/ZVtnXT1yLnNsaWNlKCk6KCF0fHwhdihyKSkmJihlW2ddPXIpfTtmb3IobGV0IHI9MCxvPWFyZ3VtZW50cy5sZW5ndGg7cjxvO3IrKylhcmd1bWVudHNbcl0mJkNBKGFyZ3VtZW50c1tyXSxJKTtyZXR1cm4gZX12YXIgdUk9KEEsdCxlLHthbGxPd25LZXlzOkl9PXt9KT0+KENBKHQsKHIsbyk9PntlJiZHKHIpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLG8se3ZhbHVlOm5BKHIsZSksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTpPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxvLHt2YWx1ZTpyLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9LHthbGxPd25LZXlzOkl9KSxBKSxkST1BPT4oQS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihBPUEuc2xpY2UoMSkpLEEpLERJPShBLHQsZSxJKT0+e0EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUsSSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEEucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIse3ZhbHVlOkEsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwic3VwZXIiLHt2YWx1ZTp0LnByb3RvdHlwZX0pLGUmJk9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUsZSl9LGhJPShBLHQsZSxJKT0+e2xldCByLG8sZyxzPXt9O2lmKHQ9dHx8e30sQT09bnVsbClyZXR1cm4gdDtkb3tmb3Iocj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKSxvPXIubGVuZ3RoO28tLSA+MDspZz1yW29dLCghSXx8SShnLEEsdCkpJiYhc1tnXSYmKHRbZ109QVtnXSxzW2ddPSEwKTtBPWUhPT0hMSYma0EoQSl9d2hpbGUoQSYmKCFlfHxlKEEsdCkpJiZBIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9LHlJPShBLHQsZSk9PntBPVN0cmluZyhBKSwoZT09PXZvaWQgMHx8ZT5BLmxlbmd0aCkmJihlPUEubGVuZ3RoKSxlLT10Lmxlbmd0aDtsZXQgST1BLmluZGV4T2YodCxlKTtyZXR1cm4gSSE9PS0xJiZJPT09ZX0sd0k9QT0+e2lmKCFBKXJldHVybiBudWxsO2lmKCQoQSkpcmV0dXJuIEE7bGV0IHQ9QS5sZW5ndGg7aWYoIWp0KHQpKXJldHVybiBudWxsO2xldCBlPW5ldyBBcnJheSh0KTtmb3IoO3QtLSA+MDspZVt0XT1BW3RdO3JldHVybiBlfSxtST0oQT0+dD0+QSYmdCBpbnN0YW5jZW9mIEEpKHR5cGVvZiBVaW50OEFycmF5PCJ1IiYma0EoVWludDhBcnJheSkpLHBJPShBLHQpPT57bGV0IEk9KEEmJkFbTEFdKS5jYWxsKEEpLHI7Zm9yKDsocj1JLm5leHQoKSkmJiFyLmRvbmU7KXtsZXQgbz1yLnZhbHVlO3QuY2FsbChBLG9bMF0sb1sxXSl9fSxTST0oQSx0KT0+e2xldCBlLEk9W107Zm9yKDsoZT1BLmV4ZWModCkpIT09bnVsbDspSS5wdXNoKGUpO3JldHVybiBJfSxSST1ZKCJIVE1MRm9ybUVsZW1lbnQiKSxGST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxmdW5jdGlvbihlLEkscil7cmV0dXJuIEkudG9VcHBlckNhc2UoKStyfSksS3Q9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4odCxlKT0+QS5jYWxsKHQsZSkpKE9iamVjdC5wcm90b3R5cGUpLE5JPVkoIlJlZ0V4cCIpLFp0PShBLHQpPT57bGV0IGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSksST17fTtDQShlLChyLG8pPT57bGV0IGc7KGc9dChyLG8sQSkpIT09ITEmJihJW29dPWd8fHIpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxJKX0sVUk9QT0+e1p0KEEsKHQsZSk9PntpZihHKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluZGV4T2YoZSkhPT0tMSlyZXR1cm4hMTtsZXQgST1BW2VdO2lmKEcoSSkpe2lmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdCl7dC53cml0YWJsZT0hMTtyZXR1cm59dC5zZXR8fCh0LnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcJyIrZSsiXCciKX0pfX0pfSxHST0oQSx0KT0+e2xldCBlPXt9LEk9cj0+e3IuZm9yRWFjaChvPT57ZVtvXT0hMH0pfTtyZXR1cm4gJChBKT9JKEEpOkkoU3RyaW5nKEEpLnNwbGl0KHQpKSxlfSxrST0oKT0+e30sTEk9KEEsdCk9PkEhPW51bGwmJk51bWJlci5pc0Zpbml0ZShBPStBKT9BOnQ7ZnVuY3Rpb24gYkkoQSl7cmV0dXJuISEoQSYmRyhBLmFwcGVuZCkmJkFbeHRdPT09IkZvcm1EYXRhIiYmQVtMQV0pfXZhciBKST1BPT57bGV0IHQ9bmV3IEFycmF5KDEwKSxlPShJLHIpPT57aWYoYUEoSSkpe2lmKHQuaW5kZXhPZihJKT49MClyZXR1cm47aWYoc0EoSSkpcmV0dXJuIEk7aWYoISgidG9KU09OImluIEkpKXt0W3JdPUk7bGV0IG89JChJKT9bXTp7fTtyZXR1cm4gQ0EoSSwoZyxzKT0+e2xldCBjPWUoZyxyKzEpOyF2KGMpJiYob1tzXT1jKX0pLHRbcl09dm9pZCAwLG99fXJldHVybiBJfTtyZXR1cm4gZShBLDApfSxIST1ZKCJBc3luY0Z1bmN0aW9uIiksWUk9QT0+QSYmKGFBKEEpfHxHKEEpKSYmRyhBLnRoZW4pJiZHKEEuY2F0Y2gpLFZ0PSgoQSx0KT0+QT9zZXRJbW1lZGlhdGU6dD8oKGUsSSk9PihaLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh7c291cmNlOnIsZGF0YTpvfSk9PntyPT09WiYmbz09PWUmJkkubGVuZ3RoJiZJLnNoaWZ0KCkoKX0sITEpLHI9PntJLnB1c2gociksWi5wb3N0TWVzc2FnZShlLCIqIil9KSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLFtdKTplPT5zZXRUaW1lb3V0KGUpKSh0eXBlb2Ygc2V0SW1tZWRpYXRlPT0iZnVuY3Rpb24iLEcoWi5wb3N0TWVzc2FnZSkpLHFJPXR5cGVvZiBxdWV1ZU1pY3JvdGFzazwidSI/cXVldWVNaWNyb3Rhc2suYmluZChaKTp0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MubmV4dFRpY2t8fFZ0LE1JPUE9PkEhPW51bGwmJkcoQVtMQV0pLG49e2lzQXJyYXk6JCxpc0FycmF5QnVmZmVyOlB0LGlzQnVmZmVyOnNBLGlzRm9ybURhdGE6Q0ksaXNBcnJheUJ1ZmZlclZpZXc6JGUsaXNTdHJpbmc6QUksaXNOdW1iZXI6anQsaXNCb29sZWFuOnRJLGlzT2JqZWN0OmFBLGlzUGxhaW5PYmplY3Q6R0EsaXNFbXB0eU9iamVjdDplSSxpc1JlYWRhYmxlU3RyZWFtOlFJLGlzUmVxdWVzdDpFSSxpc1Jlc3BvbnNlOmNJLGlzSGVhZGVyczpmSSxpc1VuZGVmaW5lZDp2LGlzRGF0ZTpJSSxpc0ZpbGU6ckksaXNSZWFjdE5hdGl2ZUJsb2I6b0ksaXNSZWFjdE5hdGl2ZTpnSSxpc0Jsb2I6aUksaXNSZWdFeHA6TkksaXNGdW5jdGlvbjpHLGlzU3RyZWFtOnNJLGlzVVJMU2VhcmNoUGFyYW1zOkJJLGlzVHlwZWRBcnJheTptSSxpc0ZpbGVMaXN0Om5JLGZvckVhY2g6Q0EsbWVyZ2U6JEEsZXh0ZW5kOnVJLHRyaW06bEksc3RyaXBCT006ZEksaW5oZXJpdHM6REksdG9GbGF0T2JqZWN0OmhJLGtpbmRPZjpiQSxraW5kT2ZUZXN0OlksZW5kc1dpdGg6eUksdG9BcnJheTp3SSxmb3JFYWNoRW50cnk6cEksbWF0Y2hBbGw6U0ksaXNIVE1MRm9ybTpSSSxoYXNPd25Qcm9wZXJ0eTpLdCxoYXNPd25Qcm9wOkt0LHJlZHVjZURlc2NyaXB0b3JzOlp0LGZyZWV6ZU1ldGhvZHM6VUksdG9PYmplY3RTZXQ6R0ksdG9DYW1lbENhc2U6Rkksbm9vcDprSSx0b0Zpbml0ZU51bWJlcjpMSSxmaW5kS2V5Old0LGdsb2JhbDpaLGlzQ29udGV4dERlZmluZWQ6X3QsaXNTcGVjQ29tcGxpYW50Rm9ybTpiSSx0b0pTT05PYmplY3Q6SkksaXNBc3luY0ZuOkhJLGlzVGhlbmFibGU6WUksc2V0SW1tZWRpYXRlOlZ0LGFzYXA6cUksaXNJdGVyYWJsZTpNSX07dmFyIEY9Y2xhc3MgQSBleHRlbmRzIEVycm9ye3N0YXRpYyBmcm9tKHQsZSxJLHIsbyxnKXtsZXQgcz1uZXcgQSh0Lm1lc3NhZ2UsZXx8dC5jb2RlLEkscixvKTtyZXR1cm4gcy5jYXVzZT10LHMubmFtZT10Lm5hbWUsdC5zdGF0dXMhPW51bGwmJnMuc3RhdHVzPT1udWxsJiYocy5zdGF0dXM9dC5zdGF0dXMpLGcmJk9iamVjdC5hc3NpZ24ocyxnKSxzfWNvbnN0cnVjdG9yKHQsZSxJLHIsbyl7c3VwZXIodCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1lc3NhZ2UiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPSJBeGlvc0Vycm9yIix0aGlzLmlzQXhpb3NFcnJvcj0hMCxlJiYodGhpcy5jb2RlPWUpLEkmJih0aGlzLmNvbmZpZz1JKSxyJiYodGhpcy5yZXF1ZXN0PXIpLG8mJih0aGlzLnJlc3BvbnNlPW8sdGhpcy5zdGF0dXM9by5zdGF0dXMpfXRvSlNPTigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzpuLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMuc3RhdHVzfX19O0YuRVJSX0JBRF9PUFRJT05fVkFMVUU9IkVSUl9CQURfT1BUSU9OX1ZBTFVFIjtGLkVSUl9CQURfT1BUSU9OPSJFUlJfQkFEX09QVElPTiI7Ri5FQ09OTkFCT1JURUQ9IkVDT05OQUJPUlRFRCI7Ri5FVElNRURPVVQ9IkVUSU1FRE9VVCI7Ri5FUlJfTkVUV09SSz0iRVJSX05FVFdPUksiO0YuRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUz0iRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyI7Ri5FUlJfREVQUkVDQVRFRD0iRVJSX0RFUFJFQ0FURUQiO0YuRVJSX0JBRF9SRVNQT05TRT0iRVJSX0JBRF9SRVNQT05TRSI7Ri5FUlJfQkFEX1JFUVVFU1Q9IkVSUl9CQURfUkVRVUVTVCI7Ri5FUlJfQ0FOQ0VMRUQ9IkVSUl9DQU5DRUxFRCI7Ri5FUlJfTk9UX1NVUFBPUlQ9IkVSUl9OT1RfU1VQUE9SVCI7Ri5FUlJfSU5WQUxJRF9VUkw9IkVSUl9JTlZBTElEX1VSTCI7Ri5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEPSJFUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEIjt2YXIgdT1GO3ZhciBIQT1udWxsO2Z1bmN0aW9uIHR0KEEpe3JldHVybiBuLmlzUGxhaW5PYmplY3QoQSl8fG4uaXNBcnJheShBKX1mdW5jdGlvbiBYdChBKXtyZXR1cm4gbi5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBBdChBLHQsZSl7cmV0dXJuIEE/QS5jb25jYXQodCkubWFwKGZ1bmN0aW9uKHIsbyl7cmV0dXJuIHI9WHQociksIWUmJm8/IlsiK3IrIl0iOnJ9KS5qb2luKGU/Ii4iOiIiKTp0fWZ1bmN0aW9uIE9JKEEpe3JldHVybiBuLmlzQXJyYXkoQSkmJiFBLnNvbWUodHQpfXZhciBUST1uLnRvRmxhdE9iamVjdChuLHt9LG51bGwsZnVuY3Rpb24odCl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KHQpfSk7ZnVuY3Rpb24gS0koQSx0LGUpe2lmKCFuLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9dHx8bmV3KEhBfHxGb3JtRGF0YSksZT1uLnRvRmxhdE9iamVjdChlLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oRSxkKXtyZXR1cm4hbi5pc1VuZGVmaW5lZChkW0VdKX0pO2xldCBJPWUubWV0YVRva2VucyxyPWUudmlzaXRvcnx8YSxvPWUuZG90cyxnPWUuaW5kZXhlcyxzPWUuQmxvYnx8dHlwZW9mIEJsb2I8InUiJiZCbG9iLGM9ZS5tYXhEZXB0aD09PXZvaWQgMD8xMDA6ZS5tYXhEZXB0aCxCPXMmJm4uaXNTcGVjQ29tcGxpYW50Rm9ybSh0KTtpZighbi5pc0Z1bmN0aW9uKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gaShmKXtpZihmPT09bnVsbClyZXR1cm4iIjtpZihuLmlzRGF0ZShmKSlyZXR1cm4gZi50b0lTT1N0cmluZygpO2lmKG4uaXNCb29sZWFuKGYpKXJldHVybiBmLnRvU3RyaW5nKCk7aWYoIUImJm4uaXNCbG9iKGYpKXRocm93IG5ldyB1KCJCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLiIpO3JldHVybiBuLmlzQXJyYXlCdWZmZXIoZil8fG4uaXNUeXBlZEFycmF5KGYpP0ImJnR5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFtmXSk6QnVmZmVyLmZyb20oZik6Zn1mdW5jdGlvbiBhKGYsRSxkKXtsZXQgTD1mO2lmKG4uaXNSZWFjdE5hdGl2ZSh0KSYmbi5pc1JlYWN0TmF0aXZlQmxvYihmKSlyZXR1cm4gdC5hcHBlbmQoQXQoZCxFLG8pLGkoZikpLCExO2lmKGYmJiFkJiZ0eXBlb2YgZj09Im9iamVjdCIpe2lmKG4uZW5kc1dpdGgoRSwie30iKSlFPUk/RTpFLnNsaWNlKDAsLTIpLGY9SlNPTi5zdHJpbmdpZnkoZik7ZWxzZSBpZihuLmlzQXJyYXkoZikmJk9JKGYpfHwobi5pc0ZpbGVMaXN0KGYpfHxuLmVuZHNXaXRoKEUsIltdIikpJiYoTD1uLnRvQXJyYXkoZikpKXJldHVybiBFPVh0KEUpLEwuZm9yRWFjaChmdW5jdGlvbih3LE4peyEobi5pc1VuZGVmaW5lZCh3KXx8dz09PW51bGwpJiZ0LmFwcGVuZChnPT09ITA/QXQoW0VdLE4sbyk6Zz09PW51bGw/RTpFKyJbXSIsaSh3KSl9KSwhMX1yZXR1cm4gdHQoZik/ITA6KHQuYXBwZW5kKEF0KGQsRSxvKSxpKGYpKSwhMSl9bGV0IGw9W10sQz1PYmplY3QuYXNzaWduKFRJLHtkZWZhdWx0VmlzaXRvcjphLGNvbnZlcnRWYWx1ZTppLGlzVmlzaXRhYmxlOnR0fSk7ZnVuY3Rpb24gUShmLEUsZD0wKXtpZighbi5pc1VuZGVmaW5lZChmKSl7aWYoZD5jKXRocm93IG5ldyB1KCJPYmplY3QgaXMgdG9vIGRlZXBseSBuZXN0ZWQgKCIrZCsiIGxldmVscykuIE1heCBkZXB0aDogIitjLHUuRVJSX0ZPUk1fREFUQV9ERVBUSF9FWENFRURFRCk7aWYobC5pbmRleE9mKGYpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK0Uuam9pbigiLiIpKTtsLnB1c2goZiksbi5mb3JFYWNoKGYsZnVuY3Rpb24oeSx3KXsoIShuLmlzVW5kZWZpbmVkKHkpfHx5PT09bnVsbCkmJnIuY2FsbCh0LHksbi5pc1N0cmluZyh3KT93LnRyaW0oKTp3LEUsQykpPT09ITAmJlEoeSxFP0UuY29uY2F0KHcpOlt3XSxkKzEpfSksbC5wb3AoKX19aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSBtdXN0IGJlIGFuIG9iamVjdCIpO3JldHVybiBRKEEpLHR9dmFyIHg9S0k7ZnVuY3Rpb24genQoQSl7bGV0IHQ9eyIhIjoiJTI1MjEiLCJcJyI6IiUyNTI3IiwiKCI6IiUyNTI4IiwiKSI6IiUyNTI5IiwifiI6IiUyNTdFIiwiJTI1MjAiOiIrIn07cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC9bIVwnKCl+XXwlMjUyMC9nLGZ1bmN0aW9uKEkpe3JldHVybiB0W0ldfSl9ZnVuY3Rpb24gdnQoQSx0KXt0aGlzLl9wYWlycz1bXSxBJiZ4KEEsdGhpcyx0KX12YXIgJHQ9dnQucHJvdG90eXBlOyR0LmFwcGVuZD1mdW5jdGlvbih0LGUpe3RoaXMuX3BhaXJzLnB1c2goW3QsZV0pfTskdC50b1N0cmluZz1mdW5jdGlvbih0KXtsZXQgZT10P2Z1bmN0aW9uKEkpe3JldHVybiB0LmNhbGwodGhpcyxJLHp0KX06enQ7cmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gZShyWzBdKSsiPSIrZShyWzFdKX0sIiIpLmpvaW4oIiYiKX07dmFyIFlBPXZ0O2Z1bmN0aW9uIHhJKEEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoQSkucmVwbGFjZSgvJTI1M0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjUyNC9nLCIkIikucmVwbGFjZSgvJTI1MkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjUyMC9nLCIrIil9ZnVuY3Rpb24gQkEoQSx0LGUpe2lmKCF0KXJldHVybiBBO2xldCBJPWUmJmUuZW5jb2RlfHx4SSxyPW4uaXNGdW5jdGlvbihlKT97c2VyaWFsaXplOmV9OmUsbz1yJiZyLnNlcmlhbGl6ZSxnO2lmKG8/Zz1vKHQscik6Zz1uLmlzVVJMU2VhcmNoUGFyYW1zKHQpP3QudG9TdHJpbmcoKTpuZXcgWUEodCxyKS50b1N0cmluZyhJKSxnKXtsZXQgcz1BLmluZGV4T2YoIiUyMyIpO3MhPT0tMSYmKEE9QS5zbGljZSgwLHMpKSxBKz0oQS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStnfXJldHVybiBBfXZhciBldD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuaGFuZGxlcnM9W119dXNlKHQsZSxJKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6dCxyZWplY3RlZDplLHN5bmNocm9ub3VzOkk/SS5zeW5jaHJvbm91czohMSxydW5XaGVuOkk/SS5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfWVqZWN0KHQpe3RoaXMuaGFuZGxlcnNbdF0mJih0aGlzLmhhbmRsZXJzW3RdPW51bGwpfWNsZWFyKCl7dGhpcy5oYW5kbGVycyYmKHRoaXMuaGFuZGxlcnM9W10pfWZvckVhY2godCl7bi5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24oSSl7SSE9PW51bGwmJnQoSSl9KX19LEl0PWV0O3ZhciBBQT17c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMSxsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nOiEwfTt2YXIgQWU9dHlwZW9mIFVSTFNlYXJjaFBhcmFtczwidSI/VVJMU2VhcmNoUGFyYW1zOllBO3ZhciB0ZT10eXBlb2YgRm9ybURhdGE8InUiP0Zvcm1EYXRhOm51bGw7dmFyIGVlPXR5cGVvZiBCbG9iPCJ1Ij9CbG9iOm51bGw7dmFyIEllPXtpc0Jyb3dzZXI6ITAsY2xhc3Nlczp7VVJMU2VhcmNoUGFyYW1zOkFlLEZvcm1EYXRhOnRlLEJsb2I6ZWV9LHByb3RvY29sczpbImh0dHAiLCJodHRwcyIsImZpbGUiLCJibG9iIiwidXJsIiwiZGF0YSJdfTt2YXIgZ3Q9e307TWUoZ3Qse2hhc0Jyb3dzZXJFbnY6KCk9Pm90LGhhc1N0YW5kYXJkQnJvd3NlckVudjooKT0+UEksaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52OigpPT5qSSxuYXZpZ2F0b3I6KCk9PnJ0LG9yaWdpbjooKT0+V0l9KTt2YXIgb3Q9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIscnQ9dHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvcnx8dm9pZCAwLFBJPW90JiYoIXJ0fHxbIlJlYWN0TmF0aXZlIiwiTmF0aXZlU2NyaXB0IiwiTlMiXS5pbmRleE9mKHJ0LnByb2R1Y3QpPDApLGpJPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cz09ImZ1bmN0aW9uIixXST1vdCYmd2luZG93LmxvY2F0aW9uLmhyZWZ8fCJodHRwOi8vbG9jYWxob3N0Ijt2YXIgaD17Li4uZ3QsLi4uSWV9O2Z1bmN0aW9uIGl0KEEsdCl7cmV0dXJuIHgoQSxuZXcgaC5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcyx7dmlzaXRvcjpmdW5jdGlvbihlLEkscixvKXtyZXR1cm4gaC5pc05vZGUmJm4uaXNCdWZmZXIoZSk/KHRoaXMuYXBwZW5kKEksZS50b1N0cmluZygiYmFzZTY0IikpLCExKTpvLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sLi4udH0pfWZ1bmN0aW9uIF9JKEEpe3JldHVybiBuLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZyxBKS5tYXAodD0+dFswXT09PSJbXSI/IiI6dFsxXXx8dFswXSl9ZnVuY3Rpb24gWkkoQSl7bGV0IHQ9e30sZT1PYmplY3Qua2V5cyhBKSxJLHI9ZS5sZW5ndGgsbztmb3IoST0wO0k8cjtJKyspbz1lW0ldLHRbb109QVtvXTtyZXR1cm4gdH1mdW5jdGlvbiBWSShBKXtmdW5jdGlvbiB0KGUsSSxyLG8pe2xldCBnPWVbbysrXTtpZihnPT09Il9fcHJvdG9fXyIpcmV0dXJuITA7bGV0IHM9TnVtYmVyLmlzRmluaXRlKCtnKSxjPW8+PWUubGVuZ3RoO3JldHVybiBnPSFnJiZuLmlzQXJyYXkocik/ci5sZW5ndGg6ZyxjPyhuLmhhc093blByb3AocixnKT9yW2ddPW4uaXNBcnJheShyW2ddKT9yW2ddLmNvbmNhdChJKTpbcltnXSxJXTpyW2ddPUksIXMpOigoIXJbZ118fCFuLmlzT2JqZWN0KHJbZ10pKSYmKHJbZ109W10pLHQoZSxJLHJbZ10sbykmJm4uaXNBcnJheShyW2ddKSYmKHJbZ109WkkocltnXSkpLCFzKX1pZihuLmlzRm9ybURhdGEoQSkmJm4uaXNGdW5jdGlvbihBLmVudHJpZXMpKXtsZXQgZT17fTtyZXR1cm4gbi5mb3JFYWNoRW50cnkoQSwoSSxyKT0+e3QoX0koSSkscixlLDApfSksZX1yZXR1cm4gbnVsbH12YXIgcUE9Vkk7dmFyIHRBPShBLHQpPT5BIT1udWxsJiZuLmhhc093blByb3AoQSx0KT9BW3RdOnZvaWQgMDtmdW5jdGlvbiBYSShBLHQsZSl7aWYobi5pc1N0cmluZyhBKSl0cnl7cmV0dXJuKHR8fEpTT04ucGFyc2UpKEEpLG4udHJpbShBKX1jYXRjaChJKXtpZihJLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IEl9cmV0dXJuKGV8fEpTT04uc3RyaW5naWZ5KShBKX12YXIgbnQ9e3RyYW5zaXRpb25hbDpBQSxhZGFwdGVyOlsieGhyIiwiaHR0cCIsImZldGNoIl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24odCxlKXtsZXQgST1lLmdldENvbnRlbnRUeXBlKCl8fCIiLHI9SS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEsbz1uLmlzT2JqZWN0KHQpO2lmKG8mJm4uaXNIVE1MRm9ybSh0KSYmKHQ9bmV3IEZvcm1EYXRhKHQpKSxuLmlzRm9ybURhdGEodCkpcmV0dXJuIHI/SlNPTi5zdHJpbmdpZnkocUEodCkpOnQ7aWYobi5pc0FycmF5QnVmZmVyKHQpfHxuLmlzQnVmZmVyKHQpfHxuLmlzU3RyZWFtKHQpfHxuLmlzRmlsZSh0KXx8bi5pc0Jsb2IodCl8fG4uaXNSZWFkYWJsZVN0cmVhbSh0KSlyZXR1cm4gdDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KHQpKXJldHVybiB0LmJ1ZmZlcjtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXJldHVybiBlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIsITEpLHQudG9TdHJpbmcoKTtsZXQgcztpZihvKXtsZXQgYz10QSh0aGlzLCJmb3JtU2VyaWFsaXplciIpO2lmKEkuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIGl0KHQsYykudG9TdHJpbmcoKTtpZigocz1uLmlzRmlsZUxpc3QodCkpfHxJLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IEI9dEEodGhpcywiZW52IiksaT1CJiZCLkZvcm1EYXRhO3JldHVybiB4KHM/eyJmaWxlc1tdIjp0fTp0LGkmJm5ldyBpLGMpfX1yZXR1cm4gb3x8cj8oZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLFhJKHQpKTp0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe2xldCBlPXRBKHRoaXMsInRyYW5zaXRpb25hbCIpfHxudC50cmFuc2l0aW9uYWwsST1lJiZlLmZvcmNlZEpTT05QYXJzaW5nLHI9dEEodGhpcywicmVzcG9uc2VUeXBlIiksbz1yPT09Impzb24iO2lmKG4uaXNSZXNwb25zZSh0KXx8bi5pc1JlYWRhYmxlU3RyZWFtKHQpKXJldHVybiB0O2lmKHQmJm4uaXNTdHJpbmcodCkmJihJJiYhcnx8bykpe2xldCBzPSEoZSYmZS5zaWxlbnRKU09OUGFyc2luZykmJm87dHJ5e3JldHVybiBKU09OLnBhcnNlKHQsdEEodGhpcywicGFyc2VSZXZpdmVyIikpfWNhdGNoKGMpe2lmKHMpdGhyb3cgYy5uYW1lPT09IlN5bnRheEVycm9yIj91LmZyb20oYyx1LkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLHRBKHRoaXMsInJlc3BvbnNlIikpOmN9fXJldHVybiB0fV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpoLmNsYXNzZXMuRm9ybURhdGEsQmxvYjpoLmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTIwMCYmdDwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIl0sQT0+e250LmhlYWRlcnNbQV09e319KTt2YXIgZUE9bnQ7dmFyIHpJPW4udG9PYmplY3RTZXQoWyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSkscmU9QT0+e2xldCB0PXt9LGUsSSxyO3JldHVybiBBJiZBLnNwbGl0KGAlMEFgKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe3I9Zy5pbmRleE9mKCI6IiksZT1nLnN1YnN0cmluZygwLHIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLEk9Zy5zdWJzdHJpbmcocisxKS50cmltKCksISghZXx8dFtlXSYmeklbZV0pJiYoZT09PSJzZXQtY29va2llIj90W2VdP3RbZV0ucHVzaChJKTp0W2VdPVtJXTp0W2VdPXRbZV0/dFtlXSsiLCAiK0k6SSl9KSx0fTt2YXIgb2U9U3ltYm9sKCJpbnRlcm5hbHMiKSx2ST0vW15cXHgwOVxceDIwLVxceDdFXFx4ODAtXFx4RkZdL2c7ZnVuY3Rpb24gJEkoQSl7bGV0IHQ9MCxlPUEubGVuZ3RoO2Zvcig7dDxlOyl7bGV0IEk9QS5jaGFyQ29kZUF0KHQpO2lmKEkhPT05JiZJIT09MzIpYnJlYWs7dCs9MX1mb3IoO2U+dDspe2xldCBJPUEuY2hhckNvZGVBdChlLTEpO2lmKEkhPT05JiZJIT09MzIpYnJlYWs7ZS09MX1yZXR1cm4gdD09PTAmJmU9PT1BLmxlbmd0aD9BOkEuc2xpY2UodCxlKX1mdW5jdGlvbiBRQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEFyKEEpe3JldHVybiAkSShBLnJlcGxhY2UodkksIiIpKX1mdW5jdGlvbiBNQShBKXtyZXR1cm4gQT09PSExfHxBPT1udWxsP0E6bi5pc0FycmF5KEEpP0EubWFwKE1BKTpBcihTdHJpbmcoQSkpfWZ1bmN0aW9uIHRyKEEpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCksZT0vKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nLEk7Zm9yKDtJPWUuZXhlYyhBKTspdFtJWzFdXT1JWzJdO3JldHVybiB0fXZhciBlcj1BPT4vXlstX2EtekEtWjAtOV5gfH4sISUyMyQlJlwnKisuXSskLy50ZXN0KEEudHJpbSgpKTtmdW5jdGlvbiBzdChBLHQsZSxJLHIpe2lmKG4uaXNGdW5jdGlvbihJKSlyZXR1cm4gSS5jYWxsKHRoaXMsdCxlKTtpZihyJiYodD1lKSwhIW4uaXNTdHJpbmcodCkpe2lmKG4uaXNTdHJpbmcoSSkpcmV0dXJuIHQuaW5kZXhPZihJKSE9PS0xO2lmKG4uaXNSZWdFeHAoSSkpcmV0dXJuIEkudGVzdCh0KX19ZnVuY3Rpb24gSXIoQSl7cmV0dXJuIEEudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCh0LGUsSSk9PmUudG9VcHBlckNhc2UoKStJKX1mdW5jdGlvbiBycihBLHQpe2xldCBlPW4udG9DYW1lbENhc2UoIiAiK3QpO1siZ2V0Iiwic2V0IiwiaGFzIl0uZm9yRWFjaChJPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsSStlLHt2YWx1ZTpmdW5jdGlvbihyLG8sZyl7cmV0dXJuIHRoaXNbSV0uY2FsbCh0aGlzLHQscixvLGcpfSxjb25maWd1cmFibGU6ITB9KX0pfXZhciBJQT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0JiZ0aGlzLnNldCh0KX1zZXQodCxlLEkpe2xldCByPXRoaXM7ZnVuY3Rpb24gbyhzLGMsQil7bGV0IGk9UUEoYyk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIpO2xldCBhPW4uZmluZEtleShyLGkpOyghYXx8clthXT09PXZvaWQgMHx8Qj09PSEwfHxCPT09dm9pZCAwJiZyW2FdIT09ITEpJiYoclthfHxjXT1NQShzKSl9bGV0IGc9KHMsYyk9Pm4uZm9yRWFjaChzLChCLGkpPT5vKEIsaSxjKSk7aWYobi5pc1BsYWluT2JqZWN0KHQpfHx0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcilnKHQsZSk7ZWxzZSBpZihuLmlzU3RyaW5nKHQpJiYodD10LnRyaW0oKSkmJiFlcih0KSlnKHJlKHQpLGUpO2Vsc2UgaWYobi5pc09iamVjdCh0KSYmbi5pc0l0ZXJhYmxlKHQpKXtsZXQgcz17fSxjLEI7Zm9yKGxldCBpIG9mIHQpe2lmKCFuLmlzQXJyYXkoaSkpdGhyb3cgVHlwZUVycm9yKCJPYmplY3QgaXRlcmF0b3IgbXVzdCByZXR1cm4gYSBrZXktdmFsdWUgcGFpciIpO3NbQj1pWzBdXT0oYz1zW0JdKT9uLmlzQXJyYXkoYyk/Wy4uLmMsaVsxXV06W2MsaVsxXV06aVsxXX1nKHMsZSl9ZWxzZSB0IT1udWxsJiZvKGUsdCxJKTtyZXR1cm4gdGhpc31nZXQodCxlKXtpZih0PVFBKHQpLHQpe2xldCBJPW4uZmluZEtleSh0aGlzLHQpO2lmKEkpe2xldCByPXRoaXNbSV07aWYoIWUpcmV0dXJuIHI7aWYoZT09PSEwKXJldHVybiB0cihyKTtpZihuLmlzRnVuY3Rpb24oZSkpcmV0dXJuIGUuY2FsbCh0aGlzLHIsSSk7aWYobi5pc1JlZ0V4cChlKSlyZXR1cm4gZS5leGVjKHIpO3Rocm93IG5ldyBUeXBlRXJyb3IoInBhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uIil9fX1oYXModCxlKXtpZih0PVFBKHQpLHQpe2xldCBJPW4uZmluZEtleSh0aGlzLHQpO3JldHVybiEhKEkmJnRoaXNbSV0hPT12b2lkIDAmJighZXx8c3QodGhpcyx0aGlzW0ldLEksZSkpKX1yZXR1cm4hMX1kZWxldGUodCxlKXtsZXQgST10aGlzLHI9ITE7ZnVuY3Rpb24gbyhnKXtpZihnPVFBKGcpLGcpe2xldCBzPW4uZmluZEtleShJLGcpO3MmJighZXx8c3QoSSxJW3NdLHMsZSkpJiYoZGVsZXRlIElbc10scj0hMCl9fXJldHVybiBuLmlzQXJyYXkodCk/dC5mb3JFYWNoKG8pOm8odCkscn1jbGVhcih0KXtsZXQgZT1PYmplY3Qua2V5cyh0aGlzKSxJPWUubGVuZ3RoLHI9ITE7Zm9yKDtJLS07KXtsZXQgbz1lW0ldOyghdHx8c3QodGhpcyx0aGlzW29dLG8sdCwhMCkpJiYoZGVsZXRlIHRoaXNbb10scj0hMCl9cmV0dXJuIHJ9bm9ybWFsaXplKHQpe2xldCBlPXRoaXMsST17fTtyZXR1cm4gbi5mb3JFYWNoKHRoaXMsKHIsbyk9PntsZXQgZz1uLmZpbmRLZXkoSSxvKTtpZihnKXtlW2ddPU1BKHIpLGRlbGV0ZSBlW29dO3JldHVybn1sZXQgcz10P0lyKG8pOlN0cmluZyhvKS50cmltKCk7cyE9PW8mJmRlbGV0ZSBlW29dLGVbc109TUEociksSVtzXT0hMH0pLHRoaXN9Y29uY2F0KC4uLnQpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLC4uLnQpfXRvSlNPTih0KXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBuLmZvckVhY2godGhpcywoSSxyKT0+e0khPW51bGwmJkkhPT0hMSYmKGVbcl09dCYmbi5pc0FycmF5KEkpP0kuam9pbigiLCAiKTpJKX0pLGV9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpfXRvU3RyaW5nKCl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW3QsZV0pPT50KyI6ICIrZSkuam9pbihgJTBBYCl9Z2V0U2V0Q29va2llKCl7cmV0dXJuIHRoaXMuZ2V0KCJzZXQtY29va2llIil8fFtdfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIkF4aW9zSGVhZGVycyJ9c3RhdGljIGZyb20odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB0aGlzP3Q6bmV3IHRoaXModCl9c3RhdGljIGNvbmNhdCh0LC4uLmUpe2xldCBJPW5ldyB0aGlzKHQpO3JldHVybiBlLmZvckVhY2gocj0+SS5zZXQocikpLEl9c3RhdGljIGFjY2Vzc29yKHQpe2xldCBJPSh0aGlzW29lXT10aGlzW29lXT17YWNjZXNzb3JzOnt9fSkuYWNjZXNzb3JzLHI9dGhpcy5wcm90b3R5cGU7ZnVuY3Rpb24gbyhnKXtsZXQgcz1RQShnKTtJW3NdfHwocnIocixnKSxJW3NdPSEwKX1yZXR1cm4gbi5pc0FycmF5KHQpP3QuZm9yRWFjaChvKTpvKHQpLHRoaXN9fTtJQS5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7bi5yZWR1Y2VEZXNjcmlwdG9ycyhJQS5wcm90b3R5cGUsKHt2YWx1ZTpBfSx0KT0+e2xldCBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO3JldHVybntnZXQ6KCk9PkEsc2V0KEkpe3RoaXNbZV09SX19fSk7bi5mcmVlemVNZXRob2RzKElBKTt2YXIgUz1JQTtmdW5jdGlvbiBFQShBLHQpe2xldCBlPXRoaXN8fGVBLEk9dHx8ZSxyPVMuZnJvbShJLmhlYWRlcnMpLG89SS5kYXRhO3JldHVybiBuLmZvckVhY2goQSxmdW5jdGlvbihzKXtvPXMuY2FsbChlLG8sci5ub3JtYWxpemUoKSx0P3Quc3RhdHVzOnZvaWQgMCl9KSxyLm5vcm1hbGl6ZSgpLG99ZnVuY3Rpb24gY0EoQSl7cmV0dXJuISEoQSYmQS5fX0NBTkNFTF9fKX12YXIgYXQ9Y2xhc3MgZXh0ZW5kcyB1e2NvbnN0cnVjdG9yKHQsZSxJKXtzdXBlcih0Pz8iY2FuY2VsZWQiLHUuRVJSX0NBTkNFTEVELGUsSSksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIix0aGlzLl9fQ0FOQ0VMX189ITB9fSxNPWF0O2Z1bmN0aW9uIGZBKEEsdCxlKXtsZXQgST1lLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshZS5zdGF0dXN8fCFJfHxJKGUuc3RhdHVzKT9BKGUpOnQobmV3IHUoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIitlLnN0YXR1cyxbdS5FUlJfQkFEX1JFUVVFU1QsdS5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKGUuc3RhdHVzLzEwMCktNF0sZS5jb25maWcsZS5yZXF1ZXN0LGUpKX1mdW5jdGlvbiBDdChBKXtsZXQgdD0vXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyhBKTtyZXR1cm4gdCYmdFsxXXx8IiJ9ZnVuY3Rpb24gb3IoQSx0KXtBPUF8fDEwO2xldCBlPW5ldyBBcnJheShBKSxJPW5ldyBBcnJheShBKSxyPTAsbz0wLGc7cmV0dXJuIHQ9dCE9PXZvaWQgMD90OjFlMyxmdW5jdGlvbihjKXtsZXQgQj1EYXRlLm5vdygpLGk9SVtvXTtnfHwoZz1CKSxlW3JdPWMsSVtyXT1CO2xldCBhPW8sbD0wO2Zvcig7YSE9PXI7KWwrPWVbYSsrXSxhPWElQTtpZihyPShyKzEpJUEscj09PW8mJihvPShvKzEpJUEpLEItZzx0KXJldHVybjtsZXQgQz1pJiZCLWk7cmV0dXJuIEM/TWF0aC5yb3VuZChsKjFlMy9DKTp2b2lkIDB9fXZhciBnZT1vcjtmdW5jdGlvbiBncihBLHQpe2xldCBlPTAsST0xZTMvdCxyLG8sZz0oQixpPURhdGUubm93KCkpPT57ZT1pLHI9bnVsbCxvJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksQSguLi5CKX07cmV0dXJuWyguLi5CKT0+e2xldCBpPURhdGUubm93KCksYT1pLWU7YT49ST9nKEIsaSk6KHI9QixvfHwobz1zZXRUaW1lb3V0KCgpPT57bz1udWxsLGcocil9LEktYSkpKX0sKCk9PnImJmcocildfXZhciBpZT1ncjt2YXIgckE9KEEsdCxlPTMpPT57bGV0IEk9MCxyPWdlKDUwLDI1MCk7cmV0dXJuIGllKG89PntsZXQgZz1vLmxvYWRlZCxzPW8ubGVuZ3RoQ29tcHV0YWJsZT9vLnRvdGFsOnZvaWQgMCxjPXMhPW51bGw/TWF0aC5taW4oZyxzKTpnLEI9TWF0aC5tYXgoMCxjLUkpLGk9cihCKTtJPU1hdGgubWF4KEksYyk7bGV0IGE9e2xvYWRlZDpjLHRvdGFsOnMscHJvZ3Jlc3M6cz9jL3M6dm9pZCAwLGJ5dGVzOkIscmF0ZTppfHx2b2lkIDAsZXN0aW1hdGVkOmkmJnM/KHMtYykvaTp2b2lkIDAsZXZlbnQ6byxsZW5ndGhDb21wdXRhYmxlOnMhPW51bGwsW3Q/ImRvd25sb2FkIjoidXBsb2FkIl06ITB9O0EoYSl9LGUpfSxCdD0oQSx0KT0+e2xldCBlPUEhPW51bGw7cmV0dXJuW0k9PnRbMF0oe2xlbmd0aENvbXB1dGFibGU6ZSx0b3RhbDpBLGxvYWRlZDpJfSksdFsxXV19LFF0PUE9PiguLi50KT0+bi5hc2FwKCgpPT5BKC4uLnQpKTt2YXIgbmU9aC5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/KChBLHQpPT5lPT4oZT1uZXcgVVJMKGUsaC5vcmlnaW4pLEEucHJvdG9jb2w9PT1lLnByb3RvY29sJiZBLmhvc3Q9PT1lLmhvc3QmJih0fHxBLnBvcnQ9PT1lLnBvcnQpKSkobmV3IFVSTChoLm9yaWdpbiksaC5uYXZpZ2F0b3ImJi8obXNpZXx0cmlkZW50KS9pLnRlc3QoaC5uYXZpZ2F0b3IudXNlckFnZW50KSk6KCk9PiEwO3ZhciBzZT1oLmhhc1N0YW5kYXJkQnJvd3NlckVudj97d3JpdGUoQSx0LGUsSSxyLG8sZyl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm47bGV0IHM9W2Ake0F9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQpfWBdO24uaXNOdW1iZXIoZSkmJnMucHVzaChgZXhwaXJlcz0ke25ldyBEYXRlKGUpLnRvVVRDU3RyaW5nKCl9YCksbi5pc1N0cmluZyhJKSYmcy5wdXNoKGBwYXRoPSR7SX1gKSxuLmlzU3RyaW5nKHIpJiZzLnB1c2goYGRvbWFpbj0ke3J9YCksbz09PSEwJiZzLnB1c2goInNlY3VyZSIpLG4uaXNTdHJpbmcoZykmJnMucHVzaChgU2FtZVNpdGU9JHtnfWApLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQoQSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gbnVsbDtsZXQgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKD86Xnw7ICkiK0ErIj0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzFdKTpudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUsIi8iKX19Ont3cml0ZSgpe30scmVhZCgpe3JldHVybiBudWxsfSxyZW1vdmUoKXt9fTtmdW5jdGlvbiBFdChBKXtyZXR1cm4gdHlwZW9mIEEhPSJzdHJpbmciPyExOi9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KEEpfWZ1bmN0aW9uIGN0KEEsdCl7cmV0dXJuIHQ/QS5yZXBsYWNlKC9cXC8/XFwvJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cXC8rLywiIik6QX1mdW5jdGlvbiBsQShBLHQsZSl7bGV0IEk9IUV0KHQpO3JldHVybiBBJiYoSXx8ZT09PSExKT9jdChBLHQpOnR9dmFyIGFlPUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIHEoQSx0KXt0PXR8fHt9O2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImhhc093blByb3BlcnR5Iix7dmFsdWU6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIEkoQixpLGEsbCl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChCKSYmbi5pc1BsYWluT2JqZWN0KGkpP24ubWVyZ2UuY2FsbCh7Y2FzZWxlc3M6bH0sQixpKTpuLmlzUGxhaW5PYmplY3QoaSk/bi5tZXJnZSh7fSxpKTpuLmlzQXJyYXkoaSk/aS5zbGljZSgpOml9ZnVuY3Rpb24gcihCLGksYSxsKXtpZihuLmlzVW5kZWZpbmVkKGkpKXtpZighbi5pc1VuZGVmaW5lZChCKSlyZXR1cm4gSSh2b2lkIDAsQixhLGwpfWVsc2UgcmV0dXJuIEkoQixpLGEsbCl9ZnVuY3Rpb24gbyhCLGkpe2lmKCFuLmlzVW5kZWZpbmVkKGkpKXJldHVybiBJKHZvaWQgMCxpKX1mdW5jdGlvbiBnKEIsaSl7aWYobi5pc1VuZGVmaW5lZChpKSl7aWYoIW4uaXNVbmRlZmluZWQoQikpcmV0dXJuIEkodm9pZCAwLEIpfWVsc2UgcmV0dXJuIEkodm9pZCAwLGkpfWZ1bmN0aW9uIHMoQixpLGEpe2lmKG4uaGFzT3duUHJvcCh0LGEpKXJldHVybiBJKEIsaSk7aWYobi5oYXNPd25Qcm9wKEEsYSkpcmV0dXJuIEkodm9pZCAwLEIpfWxldCBjPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDpnLHRyYW5zZm9ybVJlcXVlc3Q6Zyx0cmFuc2Zvcm1SZXNwb25zZTpnLHBhcmFtc1NlcmlhbGl6ZXI6Zyx0aW1lb3V0OmcsdGltZW91dE1lc3NhZ2U6Zyx3aXRoQ3JlZGVudGlhbHM6Zyx3aXRoWFNSRlRva2VuOmcsYWRhcHRlcjpnLHJlc3BvbnNlVHlwZTpnLHhzcmZDb29raWVOYW1lOmcseHNyZkhlYWRlck5hbWU6ZyxvblVwbG9hZFByb2dyZXNzOmcsb25Eb3dubG9hZFByb2dyZXNzOmcsZGVjb21wcmVzczpnLG1heENvbnRlbnRMZW5ndGg6ZyxtYXhCb2R5TGVuZ3RoOmcsYmVmb3JlUmVkaXJlY3Q6Zyx0cmFuc3BvcnQ6ZyxodHRwQWdlbnQ6ZyxodHRwc0FnZW50OmcsY2FuY2VsVG9rZW46Zyxzb2NrZXRQYXRoOmcsYWxsb3dlZFNvY2tldFBhdGhzOmcscmVzcG9uc2VFbmNvZGluZzpnLHZhbGlkYXRlU3RhdHVzOnMsaGVhZGVyczooQixpLGEpPT5yKGFlKEIpLGFlKGkpLGEsITApfTtyZXR1cm4gbi5mb3JFYWNoKE9iamVjdC5rZXlzKHsuLi5BLC4uLnR9KSxmdW5jdGlvbihpKXtpZihpPT09Il9fcHJvdG9fXyJ8fGk9PT0iY29uc3RydWN0b3IifHxpPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBhPW4uaGFzT3duUHJvcChjLGkpP2NbaV06cixsPW4uaGFzT3duUHJvcChBLGkpP0FbaV06dm9pZCAwLEM9bi5oYXNPd25Qcm9wKHQsaSk/dFtpXTp2b2lkIDAsUT1hKGwsQyxpKTtuLmlzVW5kZWZpbmVkKFEpJiZhIT09c3x8KGVbaV09USl9KSxlfXZhciBPQT1BPT57bGV0IHQ9cSh7fSxBKSxlPWw9Pm4uaGFzT3duUHJvcCh0LGwpP3RbbF06dm9pZCAwLEk9ZSgiZGF0YSIpLHI9ZSgid2l0aFhTUkZUb2tlbiIpLG89ZSgieHNyZkhlYWRlck5hbWUiKSxnPWUoInhzcmZDb29raWVOYW1lIikscz1lKCJoZWFkZXJzIiksYz1lKCJhdXRoIiksQj1lKCJiYXNlVVJMIiksaT1lKCJhbGxvd0Fic29sdXRlVXJscyIpLGE9ZSgidXJsIik7aWYodC5oZWFkZXJzPXM9Uy5mcm9tKHMpLHQudXJsPUJBKGxBKEIsYSxpKSxBLnBhcmFtcyxBLnBhcmFtc1NlcmlhbGl6ZXIpLGMmJnMuc2V0KCJBdXRob3JpemF0aW9uIiwiQmFzaWMgIitidG9hKChjLnVzZXJuYW1lfHwiIikrIjoiKyhjLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChjLnBhc3N3b3JkKSk6IiIpKSksbi5pc0Zvcm1EYXRhKEkpKXtpZihoLmhhc1N0YW5kYXJkQnJvd3NlckVudnx8aC5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpcy5zZXRDb250ZW50VHlwZSh2b2lkIDApO2Vsc2UgaWYobi5pc0Z1bmN0aW9uKEkuZ2V0SGVhZGVycykpe2xldCBsPUkuZ2V0SGVhZGVycygpLEM9WyJjb250ZW50LXR5cGUiLCJjb250ZW50LWxlbmd0aCJdO09iamVjdC5lbnRyaWVzKGwpLmZvckVhY2goKFtRLGZdKT0+e0MuaW5jbHVkZXMoUS50b0xvd2VyQ2FzZSgpKSYmcy5zZXQoUSxmKX0pfX1pZihoLmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKG4uaXNGdW5jdGlvbihyKSYmKHI9cih0KSkscj09PSEwfHxyPT1udWxsJiZuZSh0LnVybCkpKXtsZXQgQz1vJiZnJiZzZS5yZWFkKGcpO0MmJnMuc2V0KG8sQyl9cmV0dXJuIHR9O3ZhciBpcj10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLENlPWlyJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSxJKXtsZXQgcj1PQShBKSxvPXIuZGF0YSxnPVMuZnJvbShyLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6cyxvblVwbG9hZFByb2dyZXNzOmMsb25Eb3dubG9hZFByb2dyZXNzOkJ9PXIsaSxhLGwsQyxRO2Z1bmN0aW9uIGYoKXtDJiZDKCksUSYmUSgpLHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUoaSksci5zaWduYWwmJnIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixpKX1sZXQgRT1uZXcgWE1MSHR0cFJlcXVlc3Q7RS5vcGVuKHIubWV0aG9kLnRvVXBwZXJDYXNlKCksci51cmwsITApLEUudGltZW91dD1yLnRpbWVvdXQ7ZnVuY3Rpb24gZCgpe2lmKCFFKXJldHVybjtsZXQgeT1TLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBFJiZFLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxOPXtkYXRhOiFzfHxzPT09InRleHQifHxzPT09Impzb24iP0UucmVzcG9uc2VUZXh0OkUucmVzcG9uc2Usc3RhdHVzOkUuc3RhdHVzLHN0YXR1c1RleHQ6RS5zdGF0dXNUZXh0LGhlYWRlcnM6eSxjb25maWc6QSxyZXF1ZXN0OkV9O2ZBKGZ1bmN0aW9uKGIpe2UoYiksZigpfSxmdW5jdGlvbihiKXtJKGIpLGYoKX0sTiksRT1udWxsfSJvbmxvYWRlbmQiaW4gRT9FLm9ubG9hZGVuZD1kOkUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IUV8fEUucmVhZHlTdGF0ZSE9PTR8fEUuc3RhdHVzPT09MCYmIShFLnJlc3BvbnNlVVJMJiZFLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChkKX0sRS5vbmFib3J0PWZ1bmN0aW9uKCl7RSYmKEkobmV3IHUoIlJlcXVlc3QgYWJvcnRlZCIsdS5FQ09OTkFCT1JURUQsQSxFKSksRT1udWxsKX0sRS5vbmVycm9yPWZ1bmN0aW9uKHcpe2xldCBOPXcmJncubWVzc2FnZT93Lm1lc3NhZ2U6Ik5ldHdvcmsgRXJyb3IiLGo9bmV3IHUoTix1LkVSUl9ORVRXT1JLLEEsRSk7ai5ldmVudD13fHxudWxsLEkoaiksRT1udWxsfSxFLm9udGltZW91dD1mdW5jdGlvbigpe2xldCB3PXIudGltZW91dD8idGltZW91dCBvZiAiK3IudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixOPXIudHJhbnNpdGlvbmFsfHxBQTtyLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih3PXIudGltZW91dEVycm9yTWVzc2FnZSksSShuZXcgdSh3LE4uY2xhcmlmeVRpbWVvdXRFcnJvcj91LkVUSU1FRE9VVDp1LkVDT05OQUJPUlRFRCxBLEUpKSxFPW51bGx9LG89PT12b2lkIDAmJmcuc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gRSYmbi5mb3JFYWNoKGcudG9KU09OKCksZnVuY3Rpb24odyxOKXtFLnNldFJlcXVlc3RIZWFkZXIoTix3KX0pLG4uaXNVbmRlZmluZWQoci53aXRoQ3JlZGVudGlhbHMpfHwoRS53aXRoQ3JlZGVudGlhbHM9ISFyLndpdGhDcmVkZW50aWFscykscyYmcyE9PSJqc29uIiYmKEUucmVzcG9uc2VUeXBlPXIucmVzcG9uc2VUeXBlKSxCJiYoW2wsUV09ckEoQiwhMCksRS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsbCkpLGMmJkUudXBsb2FkJiYoW2EsQ109ckEoYyksRS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGEpLEUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLEMpKSwoci5jYW5jZWxUb2tlbnx8ci5zaWduYWwpJiYoaT15PT57RSYmKEkoIXl8fHkudHlwZT9uZXcgTShudWxsLEEsRSk6eSksRS5hYm9ydCgpLEU9bnVsbCl9LHIuY2FuY2VsVG9rZW4mJnIuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKGkpLHIuc2lnbmFsJiYoci5zaWduYWwuYWJvcnRlZD9pKCk6ci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGkpKSk7bGV0IEw9Q3Qoci51cmwpO2lmKEwmJmgucHJvdG9jb2xzLmluZGV4T2YoTCk9PT0tMSl7SShuZXcgdSgiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgIitMKyI6Iix1LkVSUl9CQURfUkVRVUVTVCxBKSk7cmV0dXJufUUuc2VuZChvfHxudWxsKX0pfTt2YXIgbnI9KEEsdCk9PntsZXR7bGVuZ3RoOmV9PUE9QT9BLmZpbHRlcihCb29sZWFuKTpbXTtpZih0fHxlKXtsZXQgST1uZXcgQWJvcnRDb250cm9sbGVyLHIsbz1mdW5jdGlvbihCKXtpZighcil7cj0hMCxzKCk7bGV0IGk9QiBpbnN0YW5jZW9mIEVycm9yP0I6dGhpcy5yZWFzb247SS5hYm9ydChpIGluc3RhbmNlb2YgdT9pOm5ldyBNKGkgaW5zdGFuY2VvZiBFcnJvcj9pLm1lc3NhZ2U6aSkpfX0sZz10JiZzZXRUaW1lb3V0KCgpPT57Zz1udWxsLG8obmV3IHUoYHRpbWVvdXQgb2YgJHt0fW1zIGV4Y2VlZGVkYCx1LkVUSU1FRE9VVCkpfSx0KSxzPSgpPT57QSYmKGcmJmNsZWFyVGltZW91dChnKSxnPW51bGwsQS5mb3JFYWNoKEI9PntCLnVuc3Vic2NyaWJlP0IudW5zdWJzY3JpYmUobyk6Qi5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsbyl9KSxBPW51bGwpfTtBLmZvckVhY2goQj0+Qi5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbykpO2xldHtzaWduYWw6Y309STtyZXR1cm4gYy51bnN1YnNjcmliZT0oKT0+bi5hc2FwKHMpLGN9fSxCZT1ucjt2YXIgc3I9ZnVuY3Rpb24qKEEsdCl7bGV0IGU9QS5ieXRlTGVuZ3RoO2lmKCF0fHxlPHQpe3lpZWxkIEE7cmV0dXJufWxldCBJPTAscjtmb3IoO0k8ZTspcj1JK3QseWllbGQgQS5zbGljZShJLHIpLEk9cn0sYXI9YXN5bmMgZnVuY3Rpb24qKEEsdCl7Zm9yIGF3YWl0KGxldCBlIG9mIENyKEEpKXlpZWxkKnNyKGUsdCl9LENyPWFzeW5jIGZ1bmN0aW9uKihBKXtpZihBW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSl7eWllbGQqQTtyZXR1cm59bGV0IHQ9QS5nZXRSZWFkZXIoKTt0cnl7Zm9yKDs7KXtsZXR7ZG9uZTplLHZhbHVlOkl9PWF3YWl0IHQucmVhZCgpO2lmKGUpYnJlYWs7eWllbGQgSX19ZmluYWxseXthd2FpdCB0LmNhbmNlbCgpfX0sZnQ9KEEsdCxlLEkpPT57bGV0IHI9YXIoQSx0KSxvPTAsZyxzPWM9PntnfHwoZz0hMCxJJiZJKGMpKX07cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7YXN5bmMgcHVsbChjKXt0cnl7bGV0e2RvbmU6Qix2YWx1ZTppfT1hd2FpdCByLm5leHQoKTtpZihCKXtzKCksYy5jbG9zZSgpO3JldHVybn1sZXQgYT1pLmJ5dGVMZW5ndGg7aWYoZSl7bGV0IGw9bys9YTtlKGwpfWMuZW5xdWV1ZShuZXcgVWludDhBcnJheShpKSl9Y2F0Y2goQil7dGhyb3cgcyhCKSxCfX0sY2FuY2VsKGMpe3JldHVybiBzKGMpLHIucmV0dXJuKCl9fSx7aGlnaFdhdGVyTWFyazoyfSl9O3ZhciBRZT02NCoxMDI0LHtpc0Z1bmN0aW9uOlRBfT1uLEJyPSgoe1JlcXVlc3Q6QSxSZXNwb25zZTp0fSk9Pih7UmVxdWVzdDpBLFJlc3BvbnNlOnR9KSkobi5nbG9iYWwpLHtSZWFkYWJsZVN0cmVhbTpFZSxUZXh0RW5jb2RlcjpjZX09bi5nbG9iYWwsZmU9KEEsLi4udCk9Pnt0cnl7cmV0dXJuISFBKC4uLnQpfWNhdGNoe3JldHVybiExfX0sUXI9QT0+e0E9bi5tZXJnZS5jYWxsKHtza2lwVW5kZWZpbmVkOiEwfSxCcixBKTtsZXR7ZmV0Y2g6dCxSZXF1ZXN0OmUsUmVzcG9uc2U6SX09QSxyPXQ/VEEodCk6dHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iLG89VEEoZSksZz1UQShJKTtpZighcilyZXR1cm4hMTtsZXQgcz1yJiZUQShFZSksYz1yJiYodHlwZW9mIGNlPT0iZnVuY3Rpb24iPyhRPT5mPT5RLmVuY29kZShmKSkobmV3IGNlKTphc3luYyBRPT5uZXcgVWludDhBcnJheShhd2FpdCBuZXcgZShRKS5hcnJheUJ1ZmZlcigpKSksQj1vJiZzJiZmZSgoKT0+e2xldCBRPSExLGY9bmV3IGUoaC5vcmlnaW4se2JvZHk6bmV3IEVlLG1ldGhvZDoiUE9TVCIsZ2V0IGR1cGxleCgpe3JldHVybiBRPSEwLCJoYWxmIn19KSxFPWYuaGVhZGVycy5oYXMoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBmLmJvZHkhPW51bGwmJmYuYm9keS5jYW5jZWwoKSxRJiYhRX0pLGk9ZyYmcyYmZmUoKCk9Pm4uaXNSZWFkYWJsZVN0cmVhbShuZXcgSSgiIikuYm9keSkpLGE9e3N0cmVhbTppJiYoUT0+US5ib2R5KX07ciYmWyJ0ZXh0IiwiYXJyYXlCdWZmZXIiLCJibG9iIiwiZm9ybURhdGEiLCJzdHJlYW0iXS5mb3JFYWNoKFE9PnshYVtRXSYmKGFbUV09KGYsRSk9PntsZXQgZD1mJiZmW1FdO2lmKGQpcmV0dXJuIGQuY2FsbChmKTt0aHJvdyBuZXcgdShgUmVzcG9uc2UgdHlwZSBcJyR7UX1cJyBpcyBub3Qgc3VwcG9ydGVkYCx1LkVSUl9OT1RfU1VQUE9SVCxFKX0pfSk7bGV0IGw9YXN5bmMgUT0+e2lmKFE9PW51bGwpcmV0dXJuIDA7aWYobi5pc0Jsb2IoUSkpcmV0dXJuIFEuc2l6ZTtpZihuLmlzU3BlY0NvbXBsaWFudEZvcm0oUSkpcmV0dXJuKGF3YWl0IG5ldyBlKGgub3JpZ2luLHttZXRob2Q6IlBPU1QiLGJvZHk6UX0pLmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7aWYobi5pc0FycmF5QnVmZmVyVmlldyhRKXx8bi5pc0FycmF5QnVmZmVyKFEpKXJldHVybiBRLmJ5dGVMZW5ndGg7aWYobi5pc1VSTFNlYXJjaFBhcmFtcyhRKSYmKFE9USsiIiksbi5pc1N0cmluZyhRKSlyZXR1cm4oYXdhaXQgYyhRKSkuYnl0ZUxlbmd0aH0sQz1hc3luYyhRLGYpPT57bGV0IEU9bi50b0Zpbml0ZU51bWJlcihRLmdldENvbnRlbnRMZW5ndGgoKSk7cmV0dXJuIEU/P2woZil9O3JldHVybiBhc3luYyBRPT57bGV0e3VybDpmLG1ldGhvZDpFLGRhdGE6ZCxzaWduYWw6TCxjYW5jZWxUb2tlbjp5LHRpbWVvdXQ6dyxvbkRvd25sb2FkUHJvZ3Jlc3M6TixvblVwbG9hZFByb2dyZXNzOmoscmVzcG9uc2VUeXBlOmIsaGVhZGVyczpnQSx3aXRoQ3JlZGVudGlhbHM6eUE9InNhbWUtb3JpZ2luIixmZXRjaE9wdGlvbnM6U3R9PU9BKFEpLFJ0PXR8fGZldGNoO2I9Yj8oYisiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IHdBPUJlKFtMLHkmJnkudG9BYm9ydFNpZ25hbCgpXSx3KSxpQT1udWxsLFc9d0EmJndBLnVuc3Vic2NyaWJlJiYoKCk9Pnt3QS51bnN1YnNjcmliZSgpfSksRnQ7dHJ5e2lmKGomJkImJkUhPT0iZ2V0IiYmRSE9PSJoZWFkIiYmKEZ0PWF3YWl0IEMoZ0EsZCkpIT09MCl7bGV0IEo9bmV3IGUoZix7bWV0aG9kOiJQT1NUIixib2R5OmQsZHVwbGV4OiJoYWxmIn0pLFg7aWYobi5pc0Zvcm1EYXRhKGQpJiYoWD1KLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKSkmJmdBLnNldENvbnRlbnRUeXBlKFgpLEouYm9keSl7bGV0W1ZBLG1BXT1CdChGdCxyQShRdChqKSkpO2Q9ZnQoSi5ib2R5LFFlLFZBLG1BKX19bi5pc1N0cmluZyh5QSl8fCh5QT15QT8iaW5jbHVkZSI6Im9taXQiKTtsZXQgVT1vJiYiY3JlZGVudGlhbHMiaW4gZS5wcm90b3R5cGU7aWYobi5pc0Zvcm1EYXRhKGQpKXtsZXQgSj1nQS5nZXRDb250ZW50VHlwZSgpO0omJi9ebXVsdGlwYXJ0XFwvZm9ybS1kYXRhL2kudGVzdChKKSYmIS9ib3VuZGFyeT0vaS50ZXN0KEopJiZnQS5kZWxldGUoImNvbnRlbnQtdHlwZSIpfWxldCBOdD17Li4uU3Qsc2lnbmFsOndBLG1ldGhvZDpFLnRvVXBwZXJDYXNlKCksaGVhZGVyczpnQS5ub3JtYWxpemUoKS50b0pTT04oKSxib2R5OmQsZHVwbGV4OiJoYWxmIixjcmVkZW50aWFsczpVP3lBOnZvaWQgMH07aUE9byYmbmV3IGUoZixOdCk7bGV0IEs9YXdhaXQobz9SdChpQSxTdCk6UnQoZixOdCkpLFV0PWkmJihiPT09InN0cmVhbSJ8fGI9PT0icmVzcG9uc2UiKTtpZihpJiYoTnx8VXQmJlcpKXtsZXQgSj17fTtbInN0YXR1cyIsInN0YXR1c1RleHQiLCJoZWFkZXJzIl0uZm9yRWFjaChHdD0+e0pbR3RdPUtbR3RdfSk7bGV0IFg9bi50b0Zpbml0ZU51bWJlcihLLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKSxbVkEsbUFdPU4mJkJ0KFgsckEoUXQoTiksITApKXx8W107Sz1uZXcgSShmdChLLmJvZHksUWUsVkEsKCk9PnttQSYmbUEoKSxXJiZXKCl9KSxKKX1iPWJ8fCJ0ZXh0IjtsZXQgWWU9YXdhaXQgYVtuLmZpbmRLZXkoYSxiKXx8InRleHQiXShLLFEpO3JldHVybiFVdCYmVyYmVygpLGF3YWl0IG5ldyBQcm9taXNlKChKLFgpPT57ZkEoSixYLHtkYXRhOlllLGhlYWRlcnM6Uy5mcm9tKEsuaGVhZGVycyksc3RhdHVzOksuc3RhdHVzLHN0YXR1c1RleHQ6Sy5zdGF0dXNUZXh0LGNvbmZpZzpRLHJlcXVlc3Q6aUF9KX0pfWNhdGNoKFUpe3Rocm93IFcmJlcoKSxVJiZVLm5hbWU9PT0iVHlwZUVycm9yIiYmL0xvYWQgZmFpbGVkfGZldGNoL2kudGVzdChVLm1lc3NhZ2UpP09iamVjdC5hc3NpZ24obmV3IHUoIk5ldHdvcmsgRXJyb3IiLHUuRVJSX05FVFdPUkssUSxpQSxVJiZVLnJlc3BvbnNlKSx7Y2F1c2U6VS5jYXVzZXx8VX0pOnUuZnJvbShVLFUmJlUuY29kZSxRLGlBLFUmJlUucmVzcG9uc2UpfX19LEVyPW5ldyBNYXAsbHQ9QT0+e2xldCB0PUEmJkEuZW52fHx7fSx7ZmV0Y2g6ZSxSZXF1ZXN0OkksUmVzcG9uc2U6cn09dCxvPVtJLHIsZV0sZz1vLmxlbmd0aCxzPWcsYyxCLGk9RXI7Zm9yKDtzLS07KWM9b1tzXSxCPWkuZ2V0KGMpLEI9PT12b2lkIDAmJmkuc2V0KGMsQj1zP25ldyBNYXA6UXIodCkpLGk9QjtyZXR1cm4gQn0sTWc9bHQoKTt2YXIgdXQ9e2h0dHA6SEEseGhyOkNlLGZldGNoOntnZXQ6bHR9fTtuLmZvckVhY2godXQsKEEsdCk9PntpZihBKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsIm5hbWUiLHt2YWx1ZTp0fSl9Y2F0Y2h7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJhZGFwdGVyTmFtZSIse3ZhbHVlOnR9KX19KTt2YXIgbGU9QT0+YC0gJHtBfWAsZnI9QT0+bi5pc0Z1bmN0aW9uKEEpfHxBPT09bnVsbHx8QT09PSExO2Z1bmN0aW9uIGxyKEEsdCl7QT1uLmlzQXJyYXkoQSk/QTpbQV07bGV0e2xlbmd0aDplfT1BLEkscixvPXt9O2ZvcihsZXQgZz0wO2c8ZTtnKyspe0k9QVtnXTtsZXQgcztpZihyPUksIWZyKEkpJiYocj11dFsocz1TdHJpbmcoSSkpLnRvTG93ZXJDYXNlKCldLHI9PT12b2lkIDApKXRocm93IG5ldyB1KGBVbmtub3duIGFkYXB0ZXIgXCcke3N9XCdgKTtpZihyJiYobi5pc0Z1bmN0aW9uKHIpfHwocj1yLmdldCh0KSkpKWJyZWFrO29bc3x8IiUyMyIrZ109cn1pZighcil7bGV0IGc9T2JqZWN0LmVudHJpZXMobykubWFwKChbYyxCXSk9PmBhZGFwdGVyICR7Y30gYCsoQj09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLHM9ZT9nLmxlbmd0aD4xP2BzaW5jZSA6JTBBYCtnLm1hcChsZSkuam9pbihgJTBBYCk6IiAiK2xlKGdbMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IHUoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIitzLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gcn12YXIgS0E9e2dldEFkYXB0ZXI6bHIsYWRhcHRlcnM6dXR9O2Z1bmN0aW9uIGR0KEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBNKG51bGwsQSl9ZnVuY3Rpb24geEEoQSl7cmV0dXJuIGR0KEEpLEEuaGVhZGVycz1TLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9RUEuY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLEtBLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxlQS5hZGFwdGVyLEEpKEEpLnRoZW4oZnVuY3Rpb24oSSl7cmV0dXJuIGR0KEEpLEkuZGF0YT1FQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJKSxJLmhlYWRlcnM9Uy5mcm9tKEkuaGVhZGVycyksSX0sZnVuY3Rpb24oSSl7cmV0dXJuIGNBKEkpfHwoZHQoQSksSSYmSS5yZXNwb25zZSYmKEkucmVzcG9uc2UuZGF0YT1FQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxJLnJlc3BvbnNlKSxJLnJlc3BvbnNlLmhlYWRlcnM9Uy5mcm9tKEkucmVzcG9uc2UuaGVhZGVycykpKSxQcm9taXNlLnJlamVjdChJKX0pfXZhciBQQT0iMS4xNS4yIjt2YXIgakE9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLHQpPT57akFbQV09ZnVuY3Rpb24oSSl7cmV0dXJuIHR5cGVvZiBJPT09QXx8ImEiKyh0PDE/Im4gIjoiICIpK0F9fSk7dmFyIHVlPXt9O2pBLnRyYW5zaXRpb25hbD1mdW5jdGlvbih0LGUsSSl7ZnVuY3Rpb24gcihvLGcpe3JldHVybiJbQXhpb3MgdiIrUEErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiBcJyIrbysiXCciK2crKEk/Ii4gIitJOiIiKX1yZXR1cm4obyxnLHMpPT57aWYodD09PSExKXRocm93IG5ldyB1KHIoZywiIGhhcyBiZWVuIHJlbW92ZWQiKyhlPyIgaW4gIitlOiIiKSksdS5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIGUmJiF1ZVtnXSYmKHVlW2ddPSEwLGNvbnNvbGUud2FybihyKGcsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK2UrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksdD90KG8sZyxzKTohMH19O2pBLnNwZWxsaW5nPWZ1bmN0aW9uKHQpe3JldHVybihlLEkpPT4oY29uc29sZS53YXJuKGAke0l9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7dH1gKSwhMCl9O2Z1bmN0aW9uIHVyKEEsdCxlKXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IHUoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLHUuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCBJPU9iamVjdC5rZXlzKEEpLHI9SS5sZW5ndGg7Zm9yKDtyLS0gPjA7KXtsZXQgbz1JW3JdLGc9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbyk/dFtvXTp2b2lkIDA7aWYoZyl7bGV0IHM9QVtvXSxjPXM9PT12b2lkIDB8fGcocyxvLEEpO2lmKGMhPT0hMCl0aHJvdyBuZXcgdSgib3B0aW9uICIrbysiIG11c3QgYmUgIitjLHUuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKGUhPT0hMCl0aHJvdyBuZXcgdSgiVW5rbm93biBvcHRpb24gIitvLHUuRVJSX0JBRF9PUFRJT04pfX12YXIgdUE9e2Fzc2VydE9wdGlvbnM6dXIsdmFsaWRhdG9yczpqQX07dmFyIEg9dUEudmFsaWRhdG9ycyxvQT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmRlZmF1bHRzPXR8fHt9LHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBJdCxyZXNwb25zZTpuZXcgSXR9fWFzeW5jIHJlcXVlc3QodCxlKXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QodCxlKX1jYXRjaChJKXtpZihJIGluc3RhbmNlb2YgRXJyb3Ipe2xldCByPXt9O0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHIpOnI9bmV3IEVycm9yO2xldCBvPSgoKT0+e2lmKCFyLnN0YWNrKXJldHVybiIiO2xldCBnPXIuc3RhY2suaW5kZXhPZihgJTBBYCk7cmV0dXJuIGc9PT0tMT8iIjpyLnN0YWNrLnNsaWNlKGcrMSl9KSgpO3RyeXtpZighSS5zdGFjaylJLnN0YWNrPW87ZWxzZSBpZihvKXtsZXQgZz1vLmluZGV4T2YoYCUwQWApLHM9Zz09PS0xPy0xOm8uaW5kZXhPZihgJTBBYCxnKzEpLGM9cz09PS0xPyIiOm8uc2xpY2UocysxKTtTdHJpbmcoSS5zdGFjaykuZW5kc1dpdGgoYyl8fChJLnN0YWNrKz1gJTBBYCtvKX19Y2F0Y2h7fX10aHJvdyBJfX1fcmVxdWVzdCh0LGUpe3R5cGVvZiB0PT0ic3RyaW5nIj8oZT1lfHx7fSxlLnVybD10KTplPXR8fHt9LGU9cSh0aGlzLmRlZmF1bHRzLGUpO2xldHt0cmFuc2l0aW9uYWw6SSxwYXJhbXNTZXJpYWxpemVyOnIsaGVhZGVyczpvfT1lO0khPT12b2lkIDAmJnVBLmFzc2VydE9wdGlvbnMoSSx7c2lsZW50SlNPTlBhcnNpbmc6SC50cmFuc2l0aW9uYWwoSC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpILnRyYW5zaXRpb25hbChILmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6SC50cmFuc2l0aW9uYWwoSC5ib29sZWFuKSxsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nOkgudHJhbnNpdGlvbmFsKEguYm9vbGVhbil9LCExKSxyIT1udWxsJiYobi5pc0Z1bmN0aW9uKHIpP2UucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOnJ9OnVBLmFzc2VydE9wdGlvbnMocix7ZW5jb2RlOkguZnVuY3Rpb24sc2VyaWFsaXplOkguZnVuY3Rpb259LCEwKSksZS5hbGxvd0Fic29sdXRlVXJscyE9PXZvaWQgMHx8KHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHMhPT12b2lkIDA/ZS5hbGxvd0Fic29sdXRlVXJscz10aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzOmUuYWxsb3dBYnNvbHV0ZVVybHM9ITApLHVBLmFzc2VydE9wdGlvbnMoZSx7YmFzZVVybDpILnNwZWxsaW5nKCJiYXNlVVJMIiksd2l0aFhzcmZUb2tlbjpILnNwZWxsaW5nKCJ3aXRoWFNSRlRva2VuIil9LCEwKSxlLm1ldGhvZD0oZS5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgZz1vJiZuLm1lcmdlKG8uY29tbW9uLG9bZS5tZXRob2RdKTtvJiZuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sUT0+e2RlbGV0ZSBvW1FdfSksZS5oZWFkZXJzPVMuY29uY2F0KGcsbyk7bGV0IHM9W10sYz0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oZil7aWYodHlwZW9mIGYucnVuV2hlbj09ImZ1bmN0aW9uIiYmZi5ydW5XaGVuKGUpPT09ITEpcmV0dXJuO2M9YyYmZi5zeW5jaHJvbm91cztsZXQgRT1lLnRyYW5zaXRpb25hbHx8QUE7RSYmRS5sZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nP3MudW5zaGlmdChmLmZ1bGZpbGxlZCxmLnJlamVjdGVkKTpzLnB1c2goZi5mdWxmaWxsZWQsZi5yZWplY3RlZCl9KTtsZXQgQj1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGYpe0IucHVzaChmLmZ1bGZpbGxlZCxmLnJlamVjdGVkKX0pO2xldCBpLGE9MCxsO2lmKCFjKXtsZXQgUT1beEEuYmluZCh0aGlzKSx2b2lkIDBdO2ZvcihRLnVuc2hpZnQoLi4ucyksUS5wdXNoKC4uLkIpLGw9US5sZW5ndGgsaT1Qcm9taXNlLnJlc29sdmUoZSk7YTxsOylpPWkudGhlbihRW2ErK10sUVthKytdKTtyZXR1cm4gaX1sPXMubGVuZ3RoO2xldCBDPWU7Zm9yKDthPGw7KXtsZXQgUT1zW2ErK10sZj1zW2ErK107dHJ5e0M9UShDKX1jYXRjaChFKXtmLmNhbGwodGhpcyxFKTticmVha319dHJ5e2k9eEEuY2FsbCh0aGlzLEMpfWNhdGNoKFEpe3JldHVybiBQcm9taXNlLnJlamVjdChRKX1mb3IoYT0wLGw9Qi5sZW5ndGg7YTxsOylpPWkudGhlbihCW2ErK10sQlthKytdKTtyZXR1cm4gaX1nZXRVcmkodCl7dD1xKHRoaXMuZGVmYXVsdHMsdCk7bGV0IGU9bEEodC5iYXNlVVJMLHQudXJsLHQuYWxsb3dBYnNvbHV0ZVVybHMpO3JldHVybiBCQShlLHQucGFyYW1zLHQucGFyYW1zU2VyaWFsaXplcil9fTtuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKHQpe29BLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLEkpe3JldHVybiB0aGlzLnJlcXVlc3QocShJfHx7fSx7bWV0aG9kOnQsdXJsOmUsZGF0YTooSXx8e30pLmRhdGF9KSl9fSk7bi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShJKXtyZXR1cm4gZnVuY3Rpb24obyxnLHMpe3JldHVybiB0aGlzLnJlcXVlc3QocShzfHx7fSx7bWV0aG9kOnQsaGVhZGVyczpJP3siQ29udGVudC1UeXBlIjoibXVsdGlwYXJ0L2Zvcm0tZGF0YSJ9Ont9LHVybDpvLGRhdGE6Z30pKX19b0EucHJvdG90eXBlW3RdPWUoKSxvQS5wcm90b3R5cGVbdCsiRm9ybSJdPWUoITApfSk7dmFyIGRBPW9BO3ZhciBEdD1jbGFzcyBBe2NvbnN0cnVjdG9yKHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTtsZXQgZTt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24obyl7ZT1vfSk7bGV0IEk9dGhpczt0aGlzLnByb21pc2UudGhlbihyPT57aWYoIUkuX2xpc3RlbmVycylyZXR1cm47bGV0IG89SS5fbGlzdGVuZXJzLmxlbmd0aDtmb3IoO28tLSA+MDspSS5fbGlzdGVuZXJzW29dKHIpO0kuX2xpc3RlbmVycz1udWxsfSksdGhpcy5wcm9taXNlLnRoZW49cj0+e2xldCBvLGc9bmV3IFByb21pc2Uocz0+e0kuc3Vic2NyaWJlKHMpLG89c30pLnRoZW4ocik7cmV0dXJuIGcuY2FuY2VsPWZ1bmN0aW9uKCl7SS51bnN1YnNjcmliZShvKX0sZ30sdChmdW5jdGlvbihvLGcscyl7SS5yZWFzb258fChJLnJlYXNvbj1uZXcgTShvLGcscyksZShJLnJlYXNvbikpfSl9dGhyb3dJZlJlcXVlc3RlZCgpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufXN1YnNjcmliZSh0KXtpZih0aGlzLnJlYXNvbil7dCh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaCh0KTp0aGlzLl9saXN0ZW5lcnM9W3RdfXVuc3Vic2NyaWJlKHQpe2lmKCF0aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2xldCBlPXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKHQpO2UhPT0tMSYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZShlLDEpfXRvQWJvcnRTaWduYWwoKXtsZXQgdD1uZXcgQWJvcnRDb250cm9sbGVyLGU9ST0+e3QuYWJvcnQoSSl9O3JldHVybiB0aGlzLnN1YnNjcmliZShlKSx0LnNpZ25hbC51bnN1YnNjcmliZT0oKT0+dGhpcy51bnN1YnNjcmliZShlKSx0LnNpZ25hbH1zdGF0aWMgc291cmNlKCl7bGV0IHQ7cmV0dXJue3Rva2VuOm5ldyBBKGZ1bmN0aW9uKHIpe3Q9cn0pLGNhbmNlbDp0fX19LGRlPUR0O2Z1bmN0aW9uIGh0KEEpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQS5hcHBseShudWxsLGUpfX1mdW5jdGlvbiB5dChBKXtyZXR1cm4gbi5pc09iamVjdChBKSYmQS5pc0F4aW9zRXJyb3I9PT0hMH12YXIgd3Q9e0NvbnRpbnVlOjEwMCxTd2l0Y2hpbmdQcm90b2NvbHM6MTAxLFByb2Nlc3Npbmc6MTAyLEVhcmx5SGludHM6MTAzLE9rOjIwMCxDcmVhdGVkOjIwMSxBY2NlcHRlZDoyMDIsTm9uQXV0aG9yaXRhdGl2ZUluZm9ybWF0aW9uOjIwMyxOb0NvbnRlbnQ6MjA0LFJlc2V0Q29udGVudDoyMDUsUGFydGlhbENvbnRlbnQ6MjA2LE11bHRpU3RhdHVzOjIwNyxBbHJlYWR5UmVwb3J0ZWQ6MjA4LEltVXNlZDoyMjYsTXVsdGlwbGVDaG9pY2VzOjMwMCxNb3ZlZFBlcm1hbmVudGx5OjMwMSxGb3VuZDozMDIsU2VlT3RoZXI6MzAzLE5vdE1vZGlmaWVkOjMwNCxVc2VQcm94eTozMDUsVW51c2VkOjMwNixUZW1wb3JhcnlSZWRpcmVjdDozMDcsUGVybWFuZW50UmVkaXJlY3Q6MzA4LEJhZFJlcXVlc3Q6NDAwLFVuYXV0aG9yaXplZDo0MDEsUGF5bWVudFJlcXVpcmVkOjQwMixGb3JiaWRkZW46NDAzLE5vdEZvdW5kOjQwNCxNZXRob2ROb3RBbGxvd2VkOjQwNSxOb3RBY2NlcHRhYmxlOjQwNixQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NDA3LFJlcXVlc3RUaW1lb3V0OjQwOCxDb25mbGljdDo0MDksR29uZTo0MTAsTGVuZ3RoUmVxdWlyZWQ6NDExLFByZWNvbmRpdGlvbkZhaWxlZDo0MTIsUGF5bG9hZFRvb0xhcmdlOjQxMyxVcmlUb29Mb25nOjQxNCxVbnN1cHBvcnRlZE1lZGlhVHlwZTo0MTUsUmFuZ2VOb3RTYXRpc2ZpYWJsZTo0MTYsRXhwZWN0YXRpb25GYWlsZWQ6NDE3LEltQVRlYXBvdDo0MTgsTWlzZGlyZWN0ZWRSZXF1ZXN0OjQyMSxVbnByb2Nlc3NhYmxlRW50aXR5OjQyMixMb2NrZWQ6NDIzLEZhaWxlZERlcGVuZGVuY3k6NDI0LFRvb0Vhcmx5OjQyNSxVcGdyYWRlUmVxdWlyZWQ6NDI2LFByZWNvbmRpdGlvblJlcXVpcmVkOjQyOCxUb29NYW55UmVxdWVzdHM6NDI5LFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTo0MzEsVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6NDUxLEludGVybmFsU2VydmVyRXJyb3I6NTAwLE5vdEltcGxlbWVudGVkOjUwMSxCYWRHYXRld2F5OjUwMixTZXJ2aWNlVW5hdmFpbGFibGU6NTAzLEdhdGV3YXlUaW1lb3V0OjUwNCxIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDo1MDUsVmFyaWFudEFsc29OZWdvdGlhdGVzOjUwNixJbnN1ZmZpY2llbnRTdG9yYWdlOjUwNyxMb29wRGV0ZWN0ZWQ6NTA4LE5vdEV4dGVuZGVkOjUxMCxOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDo1MTEsV2ViU2VydmVySXNEb3duOjUyMSxDb25uZWN0aW9uVGltZWRPdXQ6NTIyLE9yaWdpbklzVW5yZWFjaGFibGU6NTIzLFRpbWVvdXRPY2N1cnJlZDo1MjQsU3NsSGFuZHNoYWtlRmFpbGVkOjUyNSxJbnZhbGlkU3NsQ2VydGlmaWNhdGU6NTI2fTtPYmplY3QuZW50cmllcyh3dCkuZm9yRWFjaCgoW0EsdF0pPT57d3RbdF09QX0pO3ZhciBEZT13dDtmdW5jdGlvbiBoZShBKXtsZXQgdD1uZXcgZEEoQSksZT1uQShkQS5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gbi5leHRlbmQoZSxkQS5wcm90b3R5cGUsdCx7YWxsT3duS2V5czohMH0pLG4uZXh0ZW5kKGUsdCxudWxsLHthbGxPd25LZXlzOiEwfSksZS5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIGhlKHEoQSxyKSl9LGV9dmFyIG09aGUoZUEpO20uQXhpb3M9ZEE7bS5DYW5jZWxlZEVycm9yPU07bS5DYW5jZWxUb2tlbj1kZTttLmlzQ2FuY2VsPWNBO20uVkVSU0lPTj1QQTttLnRvRm9ybURhdGE9eDttLkF4aW9zRXJyb3I9dTttLkNhbmNlbD1tLkNhbmNlbGVkRXJyb3I7bS5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKHQpfTttLnNwcmVhZD1odDttLmlzQXhpb3NFcnJvcj15dDttLm1lcmdlQ29uZmlnPXE7bS5BeGlvc0hlYWRlcnM9UzttLmZvcm1Ub0pTT049QT0+cUEobi5pc0hUTUxGb3JtKEEpP25ldyBGb3JtRGF0YShBKTpBKTttLmdldEFkYXB0ZXI9S0EuZ2V0QWRhcHRlcjttLkh0dHBTdGF0dXNDb2RlPURlO20uZGVmYXVsdD1tO3ZhciBXQT1tO3ZhcntBeGlvczpZaSxBeGlvc0Vycm9yOnFpLENhbmNlbGVkRXJyb3I6TWksaXNDYW5jZWw6T2ksQ2FuY2VsVG9rZW46VGksVkVSU0lPTjpLaSxhbGw6eGksQ2FuY2VsOlBpLGlzQXhpb3NFcnJvcjpqaSxzcHJlYWQ6V2ksdG9Gb3JtRGF0YTpfaSxBeGlvc0hlYWRlcnM6WmksSHR0cFN0YXR1c0NvZGU6VmksZm9ybVRvSlNPTjpYaSxnZXRBZGFwdGVyOnppLG1lcmdlQ29uZmlnOnZpfT1XQTt2YXIgREEsVCxwdCxtdD17ZW52OntlbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoOmZ1bmN0aW9uKEEpe3B0PW5ldyBVaW50OEFycmF5KFQuZXhwb3J0cy5tZW1vcnkuYnVmZmVyKX19fSxfQT1jbGFzc3tpbml0KCl7cmV0dXJuIERBfHwodHlwZW9mIGZldGNoPCJ1Ij9EQT1mZXRjaCgiZGF0YTphcHBsaWNhdGlvbi93YXNtO2Jhc2U2NCwiK3llKS50aGVuKHQ9PnQuYXJyYXlCdWZmZXIoKSkudGhlbih0PT5XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0LG10KSkudGhlbih0aGlzLl9pbml0KTpEQT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShCdWZmZXIuZnJvbSh5ZSwiYmFzZTY0IiksbXQpLnRoZW4odGhpcy5faW5pdCksREEpfV9pbml0KHQpe1Q9dC5pbnN0YW5jZSxtdC5lbnYuZW1zY3JpcHRlbl9ub3RpZnlfbWVtb3J5X2dyb3d0aCgwKX1kZWNvZGUodCxlPTApe2lmKCFUKXRocm93IG5ldyBFcnJvcigiWlNURERlY29kZXI6IEF3YWl0IC5pbml0KCkgYmVmb3JlIGRlY29kaW5nLiIpO2xldCBJPXQuYnl0ZUxlbmd0aCxyPVQuZXhwb3J0cy5tYWxsb2MoSSk7cHQuc2V0KHQsciksZT1lfHxOdW1iZXIoVC5leHBvcnRzLlpTVERfZmluZERlY29tcHJlc3NlZFNpemUocixJKSk7bGV0IG89VC5leHBvcnRzLm1hbGxvYyhlKSxnPVQuZXhwb3J0cy5aU1REX2RlY29tcHJlc3MobyxlLHIsSSkscz1wdC5zbGljZShvLG8rZyk7cmV0dXJuIFQuZXhwb3J0cy5mcmVlKHIpLFQuZXhwb3J0cy5mcmVlKG8pLHN9fSx5ZT0iQUdGemJRRUFBQUFCYmc1Z0EzOS9md0YvWUFGL0FYOWdBbjkvQUdBQmZ3QmdCWDkvZjM5L0FYOWdBMzkvZndCZ0JIOS9mMzhCZjJBQUFYOWdBbjkvQVg5Z0IzOS9mMzkvZjM4QmYyQUNmMzhCZm1BSWYzOS9mMzkvZjM4QmYyQUZmMzkvZjM4QVlBNS9mMzkvZjM5L2YzOS9mMzkvZndGL0FpY0JBMlZ1ZGg5bGJYTmpjbWx3ZEdWdVgyNXZkR2xtZVY5dFpXMXZjbmxmWjNKdmQzUm9BQU1ESXlJSEFBQUJBUU1IQXdFQUNRUUFCUUVJQ0FFRkJnUUVCQU1HQUFBS0FBVUxEQTBHQkFVQmNBRUJBUVVIQVFHQUFvQ0FBZ1lJQVg4QlFZQ2pCQXNIcmdFTEJtMWxiVzl5ZVFJQUJtMWhiR3h2WXdBRkJHWnlaV1VBQmd4YVUxUkVYMmx6UlhKeWIzSUFFaGxhVTFSRVgyWnBibVJFWldOdmJYQnlaWE56WldSVGFYcGxBQndQV2xOVVJGOWtaV052YlhCeVpYTnpBQ0laWDE5cGJtUnBjbVZqZEY5bWRXNWpkR2x2Ymw5MFlXSnNaUUVBRUY5ZlpYSnlibTlmYkc5allYUnBiMjRBQVFsemRHRmphMU5oZG1VQUJ3eHpkR0ZqYTFKbGMzUnZjbVVBQ0FwemRHRmphMEZzYkc5akFBa0tpL0lCSWdVQVFZUWZDek1CQVg4Z0FnUkFJQUFoQXdOQUlBTWdBUzBBQURvQUFDQURRUUZxSVFNZ0FVRUJhaUVCSUFKQkFXc2lBZzBBQ3dzZ0FBc3BBUUYvSUFJRVFDQUFJUU1EUUNBRElBRTZBQUFnQTBFQmFpRURJQUpCQVdzaUFnMEFDd3NnQUF0c0FRSi9RWUFmS0FJQUlnRWdBRUVIYWtGNGNTSUNhaUVBQWtBZ0FrRUFJQUFnQVUwYkRRQWdBRDhBUVJCMFN3UkFJQUEvQUVFUWRHdEIvLzhEYWtFUWRrQUFRWDlHQkg5QkFBVkJBQkFBUVFFTFJRMEJDMEdBSHlBQU5nSUFJQUVQQzBHRUgwRXdOZ0lBUVg4THVTY0JDMzhqQUVFUWF5SUtKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjlBRk5CRUJCaUI4b0FnQWlCa0VRSUFCQkMycEJlSEVnQUVFTFNSc2lCVUVEZGlJQWRpSUJRUU54QkVBQ1FDQUJRWDl6UVFGeElBQnFJZ0pCQTNRaUFVR3dIMm9pQUNBQlFiZ2ZhaWdDQUNJQktBSUlJZ1JHQkVCQmlCOGdCa0YrSUFKM2NUWUNBQXdCQ3lBRUlBQTJBZ3dnQUNBRU5nSUlDeUFCUVFocUlRQWdBU0FDUVFOMElnSkJBM0kyQWdRZ0FTQUNhaUlCSUFFb0FnUkJBWEkyQWdRTUR3c2dCVUdRSHlnQ0FDSUhUUTBCSUFFRVFBSkFRUUlnQUhRaUFrRUFJQUpyY2lBQklBQjBjV2dpQVVFRGRDSUFRYkFmYWlJQ0lBQkJ1QjlxS0FJQUlnQW9BZ2dpQkVZRVFFR0lIeUFHUVg0Z0FYZHhJZ1kyQWdBTUFRc2dCQ0FDTmdJTUlBSWdCRFlDQ0FzZ0FDQUZRUU55TmdJRUlBQWdCV29pQ0NBQlFRTjBJZ0VnQldzaUJFRUJjallDQkNBQUlBRnFJQVEyQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUZCbkI4b0FnQWhBZ0ovSUFaQkFTQUhRUU4yZENJRGNVVUVRRUdJSHlBRElBWnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEF5QUJJQUkyQWdnZ0F5QUNOZ0lNSUFJZ0FUWUNEQ0FDSUFNMkFnZ0xJQUJCQ0dvaEFFR2NIeUFJTmdJQVFaQWZJQVEyQWdBTUR3dEJqQjhvQWdBaUMwVU5BU0FMYUVFQ2RFRzRJV29vQWdBaUFpZ0NCRUY0Y1NBRmF5RURJQUloQVFOQUFrQWdBU2dDRUNJQVJRUkFJQUVvQWhRaUFFVU5BUXNnQUNnQ0JFRjRjU0FGYXlJQklBTWdBU0FEU1NJQkd5RURJQUFnQWlBQkd5RUNJQUFoQVF3QkN3c2dBaWdDR0NFSklBSWdBaWdDRENJRVJ3UkFRWmdmS0FJQUdpQUNLQUlJSWdBZ0JEWUNEQ0FFSUFBMkFnZ01EZ3NnQWtFVWFpSUJLQUlBSWdCRkJFQWdBaWdDRUNJQVJRMERJQUpCRUdvaEFRc0RRQ0FCSVFnZ0FDSUVRUlJxSWdFb0FnQWlBQTBBSUFSQkVHb2hBU0FFS0FJUUlnQU5BQXNnQ0VFQU5nSUFEQTBMUVg4aEJTQUFRYjkvU3cwQUlBQkJDMm9pQUVGNGNTRUZRWXdmS0FJQUlnaEZEUUJCQUNBRmF5RURBa0FDUUFKQUFuOUJBQ0FGUVlBQ1NRMEFHa0VmSUFWQi8vLy9CMHNOQUJvZ0JVRW1JQUJCQ0habklnQnJka0VCY1NBQVFRRjBhMEUrYWdzaUIwRUNkRUc0SVdvb0FnQWlBVVVFUUVFQUlRQU1BUXRCQUNFQUlBVkJHU0FIUVFGMmEwRUFJQWRCSDBjYmRDRUNBMEFDUUNBQktBSUVRWGh4SUFWcklnWWdBMDhOQUNBQklRUWdCaUlERFFCQkFDRURJQUVoQUF3REN5QUFJQUVvQWhRaUJpQUdJQUVnQWtFZGRrRUVjV29vQWhBaUFVWWJJQUFnQmhzaEFDQUNRUUYwSVFJZ0FRMEFDd3NnQUNBRWNrVUVRRUVBSVFSQkFpQUhkQ0lBUVFBZ0FHdHlJQWh4SWdCRkRRTWdBR2hCQW5SQnVDRnFLQUlBSVFBTElBQkZEUUVMQTBBZ0FDZ0NCRUY0Y1NBRmF5SUNJQU5KSVFFZ0FpQURJQUViSVFNZ0FDQUVJQUViSVFRZ0FDZ0NFQ0lCQkg4Z0FRVWdBQ2dDRkFzaUFBMEFDd3NnQkVVTkFDQURRWkFmS0FJQUlBVnJUdzBBSUFRb0FoZ2hCeUFFSUFRb0Fnd2lBa2NFUUVHWUh5Z0NBQm9nQkNnQ0NDSUFJQUkyQWd3Z0FpQUFOZ0lJREF3TElBUkJGR29pQVNnQ0FDSUFSUVJBSUFRb0FoQWlBRVVOQXlBRVFSQnFJUUVMQTBBZ0FTRUdJQUFpQWtFVWFpSUJLQUlBSWdBTkFDQUNRUkJxSVFFZ0FpZ0NFQ0lBRFFBTElBWkJBRFlDQUF3TEN5QUZRWkFmS0FJQUlnUk5CRUJCbkI4b0FnQWhBQUpBSUFRZ0JXc2lBVUVRVHdSQUlBQWdCV29pQWlBQlFRRnlOZ0lFSUFBZ0JHb2dBVFlDQUNBQUlBVkJBM0kyQWdRTUFRc2dBQ0FFUVFOeU5nSUVJQUFnQkdvaUFTQUJLQUlFUVFGeU5nSUVRUUFoQWtFQUlRRUxRWkFmSUFFMkFnQkJuQjhnQWpZQ0FDQUFRUWhxSVFBTURRc2dCVUdVSHlnQ0FDSUNTUVJBUVpRZklBSWdCV3NpQVRZQ0FFR2dIMEdnSHlnQ0FDSUFJQVZxSWdJMkFnQWdBaUFCUVFGeU5nSUVJQUFnQlVFRGNqWUNCQ0FBUVFocUlRQU1EUXRCQUNFQUlBVkJMMm9pQXdKL1FlQWlLQUlBQkVCQjZDSW9BZ0FNQVF0QjdDSkNmemNDQUVIa0lrS0FvSUNBZ0lBRU53SUFRZUFpSUFwQkRHcEJjSEZCMktyVnFnVnpOZ0lBUWZRaVFRQTJBZ0JCeENKQkFEWUNBRUdBSUFzaUFXb2lCa0VBSUFGcklnaHhJZ0VnQlUwTkRFSEFJaWdDQUNJRUJFQkJ1Q0lvQWdBaUJ5QUJhaUlKSUFkTklBUWdDVWx5RFEwTEFrQkJ4Q0l0QUFCQkJIRkZCRUFDUUFKQUFrQUNRRUdnSHlnQ0FDSUVCRUJCeUNJaEFBTkFJQVFnQUNnQ0FDSUhUd1JBSUFjZ0FDZ0NCR29nQkVzTkF3c2dBQ2dDQ0NJQURRQUxDMEVBRUFRaUFrRi9SZzBESUFFaEJrSGtJaWdDQUNJQVFRRnJJZ1FnQW5FRVFDQUJJQUpySUFJZ0JHcEJBQ0FBYTNGcUlRWUxJQVVnQms4TkEwSEFJaWdDQUNJQUJFQkJ1Q0lvQWdBaUJDQUdhaUlJSUFSTklBQWdDRWx5RFFRTElBWVFCQ0lBSUFKSERRRU1CUXNnQmlBQ2F5QUljU0lHRUFRaUFpQUFLQUlBSUFBb0FnUnFSZzBCSUFJaEFBc2dBRUYvUmcwQklBVkJNR29nQmswRVFDQUFJUUlNQkF0QjZDSW9BZ0FpQWlBRElBWnJha0VBSUFKcmNTSUNFQVJCZjBZTkFTQUNJQVpxSVFZZ0FDRUNEQU1MSUFKQmYwY05BZ3RCeENKQnhDSW9BZ0JCQkhJMkFnQUxJQUVRQkNJQ1FYOUdRUUFRQkNJQVFYOUdjaUFBSUFKTmNnMEZJQUFnQW1zaUJpQUZRU2hxVFEwRkMwRzRJa0c0SWlnQ0FDQUdhaUlBTmdJQVFid2lLQUlBSUFCSkJFQkJ2Q0lnQURZQ0FBc0NRRUdnSHlnQ0FDSURCRUJCeUNJaEFBTkFJQUlnQUNnQ0FDSUJJQUFvQWdRaUJHcEdEUUlnQUNnQ0NDSUFEUUFMREFRTFFaZ2ZLQUlBSWdCQkFDQUFJQUpORzBVRVFFR1lIeUFDTmdJQUMwRUFJUUJCekNJZ0JqWUNBRUhJSWlBQ05nSUFRYWdmUVg4MkFnQkJyQjlCNENJb0FnQTJBZ0JCMUNKQkFEWUNBQU5BSUFCQkEzUWlBVUc0SDJvZ0FVR3dIMm9pQkRZQ0FDQUJRYndmYWlBRU5nSUFJQUJCQVdvaUFFRWdSdzBBQzBHVUh5QUdRU2hySWdCQmVDQUNhMEVIY1NJQmF5SUVOZ0lBUWFBZklBRWdBbW9pQVRZQ0FDQUJJQVJCQVhJMkFnUWdBQ0FDYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFRTElBSWdBMDBnQVNBRFMzSU5BaUFBS0FJTVFRaHhEUUlnQUNBRUlBWnFOZ0lFUWFBZklBTkJlQ0FEYTBFSGNTSUFhaUlCTmdJQVFaUWZRWlFmS0FJQUlBWnFJZ0lnQUdzaUFEWUNBQ0FCSUFCQkFYSTJBZ1FnQWlBRGFrRW9OZ0lFUWFRZlFmQWlLQUlBTmdJQURBTUxRUUFoQkF3S0MwRUFJUUlNQ0F0Qm1COG9BZ0FnQWtzRVFFR1lIeUFDTmdJQUN5QUNJQVpxSVFGQnlDSWhBQUpBQWtBQ1FBTkFJQUVnQUNnQ0FFY0VRQ0FBS0FJSUlnQU5BUXdDQ3dzZ0FDMEFERUVJY1VVTkFRdEJ5Q0loQUFOQUlBTWdBQ2dDQUNJQlR3UkFJQUVnQUNnQ0JHb2lCQ0FEU3cwREN5QUFLQUlJSVFBTUFBc0FDeUFBSUFJMkFnQWdBQ0FBS0FJRUlBWnFOZ0lFSUFKQmVDQUNhMEVIY1dvaUJ5QUZRUU55TmdJRUlBRkJlQ0FCYTBFSGNXb2lCaUFGSUFkcUlnVnJJUUFnQXlBR1JnUkFRYUFmSUFVMkFnQkJsQjlCbEI4b0FnQWdBR29pQURZQ0FDQUZJQUJCQVhJMkFnUU1DQXRCbkI4b0FnQWdCa1lFUUVHY0h5QUZOZ0lBUVpBZlFaQWZLQUlBSUFCcUlnQTJBZ0FnQlNBQVFRRnlOZ0lFSUFBZ0JXb2dBRFlDQUF3SUN5QUdLQUlFSWdOQkEzRkJBVWNOQmlBRFFYaHhJUWtnQTBIL0FVMEVRQ0FHS0FJTUlnRWdCaWdDQ0NJQ1JnUkFRWWdmUVlnZktBSUFRWDRnQTBFRGRuZHhOZ0lBREFjTElBSWdBVFlDRENBQklBSTJBZ2dNQmdzZ0JpZ0NHQ0VJSUFZZ0JpZ0NEQ0lDUndSQUlBWW9BZ2dpQVNBQ05nSU1JQUlnQVRZQ0NBd0ZDeUFHUVJScUlnRW9BZ0FpQTBVRVFDQUdLQUlRSWdORkRRUWdCa0VRYWlFQkN3TkFJQUVoQkNBRElnSkJGR29pQVNnQ0FDSUREUUFnQWtFUWFpRUJJQUlvQWhBaUF3MEFDeUFFUVFBMkFnQU1CQXRCbEI4Z0JrRW9heUlBUVhnZ0FtdEJCM0VpQVdzaUNEWUNBRUdnSHlBQklBSnFJZ0UyQWdBZ0FTQUlRUUZ5TmdJRUlBQWdBbXBCS0RZQ0JFR2tIMEh3SWlnQ0FEWUNBQ0FESUFSQkp5QUVhMEVIY1dwQkwyc2lBQ0FBSUFOQkVHcEpHeUlCUVJzMkFnUWdBVUhRSWlrQ0FEY0NFQ0FCUWNnaUtRSUFOd0lJUWRBaUlBRkJDR28yQWdCQnpDSWdCallDQUVISUlpQUNOZ0lBUWRRaVFRQTJBZ0FnQVVFWWFpRUFBMEFnQUVFSE5nSUVJQUJCQ0dvZ0FFRUVhaUVBSUFSSkRRQUxJQUVnQTBZTkFDQUJJQUVvQWdSQmZuRTJBZ1FnQXlBQklBTnJJZ0pCQVhJMkFnUWdBU0FDTmdJQUlBSkIvd0ZOQkVBZ0FrRjRjVUd3SDJvaEFBSi9RWWdmS0FJQUlnRkJBU0FDUVFOMmRDSUNjVVVFUUVHSUh5QUJJQUp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBU0FBSUFNMkFnZ2dBU0FETmdJTUlBTWdBRFlDRENBRElBRTJBZ2dNQVF0Qkh5RUFJQUpCLy8vL0IwMEVRQ0FDUVNZZ0FrRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUFMSUFNZ0FEWUNIQ0FEUWdBM0FoQWdBRUVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQkVFQklBQjBJZ1p4UlFSQVFZd2ZJQVFnQm5JMkFnQWdBU0FETmdJQURBRUxJQUpCR1NBQVFRRjJhMEVBSUFCQkgwY2JkQ0VBSUFFb0FnQWhCQU5BSUFRaUFTZ0NCRUY0Y1NBQ1JnMENJQUJCSFhZaEJDQUFRUUYwSVFBZ0FTQUVRUVJ4YWlJR0tBSVFJZ1FOQUFzZ0JpQUROZ0lRQ3lBRElBRTJBaGdnQXlBRE5nSU1JQU1nQXpZQ0NBd0JDeUFCS0FJSUlnQWdBellDRENBQklBTTJBZ2dnQTBFQU5nSVlJQU1nQVRZQ0RDQURJQUEyQWdnTFFaUWZLQUlBSWdBZ0JVME5BRUdVSHlBQUlBVnJJZ0UyQWdCQm9COUJvQjhvQWdBaUFDQUZhaUlDTmdJQUlBSWdBVUVCY2pZQ0JDQUFJQVZCQTNJMkFnUWdBRUVJYWlFQURBZ0xRWVFmUVRBMkFnQkJBQ0VBREFjTFFRQWhBZ3NnQ0VVTkFBSkFJQVlvQWh3aUFVRUNkRUc0SVdvaUJDZ0NBQ0FHUmdSQUlBUWdBallDQUNBQ0RRRkJqQjlCakI4b0FnQkJmaUFCZDNFMkFnQU1BZ3NnQ0VFUVFSUWdDQ2dDRUNBR1JodHFJQUkyQWdBZ0FrVU5BUXNnQWlBSU5nSVlJQVlvQWhBaUFRUkFJQUlnQVRZQ0VDQUJJQUkyQWhnTElBWW9BaFFpQVVVTkFDQUNJQUUyQWhRZ0FTQUNOZ0lZQ3lBQUlBbHFJUUFnQmlBSmFpSUdLQUlFSVFNTElBWWdBMEYrY1RZQ0JDQUZJQUJCQVhJMkFnUWdBQ0FGYWlBQU5nSUFJQUJCL3dGTkJFQWdBRUY0Y1VHd0gyb2hBUUovUVlnZktBSUFJZ0pCQVNBQVFRTjJkQ0lBY1VVRVFFR0lIeUFBSUFKeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQUNBQklBVTJBZ2dnQUNBRk5nSU1JQVVnQVRZQ0RDQUZJQUEyQWdnTUFRdEJIeUVESUFCQi8vLy9CMDBFUUNBQVFTWWdBRUVJZG1jaUFXdDJRUUZ4SUFGQkFYUnJRVDVxSVFNTElBVWdBellDSENBRlFnQTNBaEFnQTBFQ2RFRzRJV29oQVFKQUFrQkJqQjhvQWdBaUFrRUJJQU4wSWdSeFJRUkFRWXdmSUFJZ0JISTJBZ0FnQVNBRk5nSUFEQUVMSUFCQkdTQURRUUYyYTBFQUlBTkJIMGNiZENFRElBRW9BZ0FoQWdOQUlBSWlBU2dDQkVGNGNTQUFSZzBDSUFOQkhYWWhBaUFEUVFGMElRTWdBU0FDUVFSeGFpSUVLQUlRSWdJTkFBc2dCQ0FGTmdJUUN5QUZJQUUyQWhnZ0JTQUZOZ0lNSUFVZ0JUWUNDQXdCQ3lBQktBSUlJZ0FnQlRZQ0RDQUJJQVUyQWdnZ0JVRUFOZ0lZSUFVZ0FUWUNEQ0FGSUFBMkFnZ0xJQWRCQ0dvaEFBd0NDd0pBSUFkRkRRQUNRQ0FFS0FJY0lnQkJBblJCdUNGcUlnRW9BZ0FnQkVZRVFDQUJJQUkyQWdBZ0FnMEJRWXdmSUFoQmZpQUFkM0VpQ0RZQ0FBd0NDeUFIUVJCQkZDQUhLQUlRSUFSR0cyb2dBallDQUNBQ1JRMEJDeUFDSUFjMkFoZ2dCQ2dDRUNJQUJFQWdBaUFBTmdJUUlBQWdBallDR0FzZ0JDZ0NGQ0lBUlEwQUlBSWdBRFlDRkNBQUlBSTJBaGdMQWtBZ0EwRVBUUVJBSUFRZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQkdvaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFRZ0JVRURjallDQkNBRUlBVnFJZ0lnQTBFQmNqWUNCQ0FDSUFOcUlBTTJBZ0FnQTBIL0FVMEVRQ0FEUVhoeFFiQWZhaUVBQW45QmlCOG9BZ0FpQVVFQklBTkJBM1owSWdOeFJRUkFRWWdmSUFFZ0EzSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFQklBQWdBallDQ0NBQklBSTJBZ3dnQWlBQU5nSU1JQUlnQVRZQ0NBd0JDMEVmSVFBZ0EwSC8vLzhIVFFSQUlBTkJKaUFEUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFBc2dBaUFBTmdJY0lBSkNBRGNDRUNBQVFRSjBRYmdoYWlFQkFrQUNRQ0FJUVFFZ0FIUWlCbkZGQkVCQmpCOGdCaUFJY2pZQ0FDQUJJQUkyQWdBTUFRc2dBMEVaSUFCQkFYWnJRUUFnQUVFZlJ4dDBJUUFnQVNnQ0FDRUZBMEFnQlNJQktBSUVRWGh4SUFOR0RRSWdBRUVkZGlFR0lBQkJBWFFoQUNBQklBWkJCSEZxSWdZb0FoQWlCUTBBQ3lBR0lBSTJBaEFMSUFJZ0FUWUNHQ0FDSUFJMkFnd2dBaUFDTmdJSURBRUxJQUVvQWdnaUFDQUNOZ0lNSUFFZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFCTmdJTUlBSWdBRFlDQ0FzZ0JFRUlhaUVBREFFTEFrQWdDVVVOQUFKQUlBSW9BaHdpQUVFQ2RFRzRJV29pQVNnQ0FDQUNSZ1JBSUFFZ0JEWUNBQ0FFRFFGQmpCOGdDMEYrSUFCM2NUWUNBQXdDQ3lBSlFSQkJGQ0FKS0FJUUlBSkdHMm9nQkRZQ0FDQUVSUTBCQ3lBRUlBazJBaGdnQWlnQ0VDSUFCRUFnQkNBQU5nSVFJQUFnQkRZQ0dBc2dBaWdDRkNJQVJRMEFJQVFnQURZQ0ZDQUFJQVEyQWhnTEFrQWdBMEVQVFFSQUlBSWdBeUFGYWlJQVFRTnlOZ0lFSUFBZ0Ftb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBSWdCVUVEY2pZQ0JDQUNJQVZxSWdRZ0EwRUJjallDQkNBRElBUnFJQU0yQWdBZ0J3UkFJQWRCZUhGQnNCOXFJUUJCbkI4b0FnQWhBUUovUVFFZ0IwRURkblFpQlNBR2NVVUVRRUdJSHlBRklBWnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEJpQUFJQUUyQWdnZ0JpQUJOZ0lNSUFFZ0FEWUNEQ0FCSUFZMkFnZ0xRWndmSUFRMkFnQkJrQjhnQXpZQ0FBc2dBa0VJYWlFQUN5QUtRUkJxSkFBZ0FBdlNDd0VIZndKQUlBQkZEUUFnQUVFSWF5SUNJQUJCQkdzb0FnQWlBVUY0Y1NJQWFpRUZBa0FnQVVFQmNRMEFJQUZCQTNGRkRRRWdBaUFDS0FJQUlnRnJJZ0pCbUI4b0FnQkpEUUVnQUNBQmFpRUFBa0FDUUVHY0h5Z0NBQ0FDUndSQUlBRkIvd0ZOQkVBZ0FVRURkaUVFSUFJb0Fnd2lBU0FDS0FJSUlnTkdCRUJCaUI5QmlCOG9BZ0JCZmlBRWQzRTJBZ0FNQlFzZ0F5QUJOZ0lNSUFFZ0F6WUNDQXdFQ3lBQ0tBSVlJUVlnQWlBQ0tBSU1JZ0ZIQkVBZ0FpZ0NDQ0lESUFFMkFnd2dBU0FETmdJSURBTUxJQUpCRkdvaUJDZ0NBQ0lEUlFSQUlBSW9BaEFpQTBVTkFpQUNRUkJxSVFRTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBd0NDeUFGS0FJRUlnRkJBM0ZCQTBjTkFrR1FIeUFBTmdJQUlBVWdBVUYrY1RZQ0JDQUNJQUJCQVhJMkFnUWdCU0FBTmdJQUR3dEJBQ0VCQ3lBR1JRMEFBa0FnQWlnQ0hDSURRUUowUWJnaGFpSUVLQUlBSUFKR0JFQWdCQ0FCTmdJQUlBRU5BVUdNSDBHTUh5Z0NBRUYrSUFOM2NUWUNBQXdDQ3lBR1FSQkJGQ0FHS0FJUUlBSkdHMm9nQVRZQ0FDQUJSUTBCQ3lBQklBWTJBaGdnQWlnQ0VDSURCRUFnQVNBRE5nSVFJQU1nQVRZQ0dBc2dBaWdDRkNJRFJRMEFJQUVnQXpZQ0ZDQURJQUUyQWhnTElBSWdCVThOQUNBRktBSUVJZ0ZCQVhGRkRRQUNRQUpBQWtBQ1FDQUJRUUp4UlFSQVFhQWZLQUlBSUFWR0JFQkJvQjhnQWpZQ0FFR1VIMEdVSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUNRWndmS0FJQVJ3MEdRWkFmUVFBMkFnQkJuQjlCQURZQ0FBOExRWndmS0FJQUlBVkdCRUJCbkI4Z0FqWUNBRUdRSDBHUUh5Z0NBQ0FBYWlJQU5nSUFJQUlnQUVFQmNqWUNCQ0FBSUFKcUlBQTJBZ0FQQ3lBQlFYaHhJQUJxSVFBZ0FVSC9BVTBFUUNBQlFRTjJJUVFnQlNnQ0RDSUJJQVVvQWdnaUEwWUVRRUdJSDBHSUh5Z0NBRUYrSUFSM2NUWUNBQXdGQ3lBRElBRTJBZ3dnQVNBRE5nSUlEQVFMSUFVb0FoZ2hCaUFGSUFVb0Fnd2lBVWNFUUVHWUh5Z0NBQm9nQlNnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBVkJGR29pQkNnQ0FDSURSUVJBSUFVb0FoQWlBMFVOQWlBRlFSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZJQUZCZm5FMkFnUWdBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQXdEQzBFQUlRRUxJQVpGRFFBQ1FDQUZLQUljSWdOQkFuUkJ1Q0ZxSWdRb0FnQWdCVVlFUUNBRUlBRTJBZ0FnQVEwQlFZd2ZRWXdmS0FJQVFYNGdBM2R4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQlVZYmFpQUJOZ0lBSUFGRkRRRUxJQUVnQmpZQ0dDQUZLQUlRSWdNRVFDQUJJQU0yQWhBZ0F5QUJOZ0lZQ3lBRktBSVVJZ05GRFFBZ0FTQUROZ0lVSUFNZ0FUWUNHQXNnQWlBQVFRRnlOZ0lFSUFBZ0Ftb2dBRFlDQUNBQ1Fad2ZLQUlBUncwQVFaQWZJQUEyQWdBUEN5QUFRZjhCVFFSQUlBQkJlSEZCc0I5cUlRRUNmMEdJSHlnQ0FDSURRUUVnQUVFRGRuUWlBSEZGQkVCQmlCOGdBQ0FEY2pZQ0FDQUJEQUVMSUFFb0FnZ0xJUUFnQVNBQ05nSUlJQUFnQWpZQ0RDQUNJQUUyQWd3Z0FpQUFOZ0lJRHd0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFJZ0F6WUNIQ0FDUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtBQ1FFR01IeWdDQUNJRVFRRWdBM1FpQjNGRkJFQkJqQjhnQkNBSGNqWUNBQ0FCSUFJMkFnQWdBaUFCTmdJWURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBUU5BSUFFaUJDZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFTQURRUUYwSVFNZ0JDQUJRUVJ4YWlJSFFSQnFLQUlBSWdFTkFBc2dCeUFDTmdJUUlBSWdCRFlDR0FzZ0FpQUNOZ0lNSUFJZ0FqWUNDQXdCQ3lBRUtBSUlJZ0FnQWpZQ0RDQUVJQUkyQWdnZ0FrRUFOZ0lZSUFJZ0JEWUNEQ0FDSUFBMkFnZ0xRYWdmUWFnZktBSUFRUUZySWdCQmZ5QUFHellDQUFzTEJBQWpBQXNHQUNBQUpBQUxFQUFqQUNBQWEwRndjU0lBSkFBZ0FBdEtBUUYvSUFBZ0FVa0VRQ0FBSUFFZ0FoQUNEd3NnQWdSQUlBQWdBbW9oQXlBQklBSnFJUUVEUUNBRFFRRnJJZ01nQVVFQmF5SUJMUUFBT2dBQUlBSkJBV3NpQWcwQUN3c2dBQXY5RGdJUmZ3RitJd0JCTUdzaUJ5UUFRYmgvSVFnQ1FDQUZSUTBBSUFRc0FBQWlDVUgvQVhFaEN3SkFJQWxCQUVnRVFDQUxRZjRBYTBFQmRpSUdJQVZQRFFKQmJDRUlJQXRCL3dCcklndEIvd0ZMRFFJZ0JFRUJhaUVJUVFBaEJRTkFJQVVnQzA4RVFDQUxJUWdnQmlFTERBTUZJQUFnQldvZ0NDQUZRUUYyYWlJRUxRQUFRUVIyT2dBQUlBQWdCVUVCY21vZ0JDMEFBRUVQY1RvQUFDQUZRUUpxSVFVTUFRc0FDd0FMSUFVZ0MwME5BU0FIUWY4Qk5nSUVJQVlnQjBFRWFpQUhRUWhxSUFSQkFXb2lEaUFMRUF3aUJFR0lmMHNFUUNBRUlRZ01BZ3RCVkNFSUlBY29BZ2dpRUVFR1N3MEJJQWNvQWdRaUVVRUJkQ0lKUVFKcXJVSUJJQkN0aGlJWVFRRWdFSFFpRFVFQmFpSUZyVUlDaG54OFFndDhRdnovLy8vLy8vLy8vd0NEUXVRQ1ZnMEJRVkloQ0NBUlFmOEJTdzBCSUExQmYzTkJBblJCNUFKcXJTQVJRUUZxSWhWQkFYU3RJQmg4UWdoOFZBMEJJQXNnQkdzaEZpQUVJQTVxSVJjZ0JrR0FCR29pRWlBRlFRSjBhaUlSSUFscVFRSnFJUTRnQmtHRUJHb2hFMEdBZ0FJZ0VIUkJFSFloQ1VFQUlRVkJBU0VQSUExQkFXc2lGQ0VLQTBBZ0JTQVZSa1VFUUFKQUlBWWdCVUVCZENJSWFpOEJBQ0lFUWYvL0EwWUVRQ0FUSUFwQkFuUnFJQVU2QUFJZ0NrRUJheUVLUVFFaEJBd0JDeUFQUVFBZ0NTQUV3VW9iSVE4TElBZ2dFV29nQkRzQkFDQUZRUUZxSVFVTUFRc0xJQVlnRHpzQmdnUWdCaUFRT3dHQUJBSkFJQW9nRkVZRVFDQU5RUU4ySVFoQ0FDRVlRUUFoRHdOQUlBd2dGVVlFUUNBSUlBMUJBWFpxUVFOcUlnbEJBWFFoQ0VFQUlRUkJBQ0VLQTBCQkFDRUZJQW9nRFU4TkJBTkFJQVZCQWtaRkJFQWdFeUFGSUFsc0lBUnFJQlJ4UVFKMGFpQU9JQVVnQ21wcUxRQUFPZ0FDSUFWQkFXb2hCUXdCQ3dzZ0NrRUNhaUVLSUFRZ0NHb2dGSEVoQkF3QUN3QUZJQVlnREVFQmRHb3VBUUFoQ1NBT0lBOXFJZ1FnR0RjQUFFRUlJUVVEUUNBRklBbE9SUVJBSUFRZ0JXb2dHRGNBQUNBRlFRaHFJUVVNQVFzTElCaENnWUtFaUpDZ3dJQUJmQ0VZSUF4QkFXb2hEQ0FKSUE5cUlROE1BUXNBQ3dBTElBMUJBM1lnRFVFQmRtcEJBMm9oQ0VFQUlRVURRQ0FNSUJWR1JRUkFRUUFoQ1NBR0lBeEJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBSlJrVUVRQ0FUSUFWQkFuUnFJQXc2QUFJRFFDQUZJQWhxSUJSeElnVWdDa3NOQUFzZ0NVRUJhaUVKREFFTEN5QU1RUUZxSVF3TUFRc0xRWDhoQ0NBRkRRSUxJQkJCQVdvaENFRUFJUVVEUUNBRklBMUdSUVJBSUJFZ0V5QUZRUUowYWlJT0xRQUNRUUYwYWlJRUlBUXZBUUFpQ1VFQmFqc0JBQ0FPSUFnZ0NXZEJZSE5xSWdRNkFBTWdEaUFKSUFSMElBMXJPd0VBSUFWQkFXb2hCUXdCQ3dzQ1FBSkFJQVl2QVlJRUJFQWdCMEVjYWlJRUlCY2dGaEFOSWdoQmlIOUxEUUlnQjBFVWFpQUVJQklRRGlBSFFReHFJQVFnRWhBT1FRQWhCUU5BSUFkQkhHb2lCQkFQSUFWQit3RkxjZzBDSUFBZ0JXb2lCaUFIUVJScUlBUVFFRG9BQUNBR0lBZEJER29nQkJBUU9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVNQXdVZ0FDQUVhaUFIUVJScUlBZEJIR29pQkJBUU9nQUFJQVlnQjBFTWFpQUVFQkE2QUFNZ0JVRUVhaUVGREFFTEFBc0FDeUFIUVJ4cUlnUWdGeUFXRUEwaUNFR0lmMHNOQVNBSFFSUnFJQVFnRWhBT0lBZEJER29nQkNBU0VBNUJBQ0VGQTBBZ0IwRWNhaUlFRUE4Z0JVSDdBVXR5UlFSQUlBQWdCV29pQmlBSFFSUnFJQVFRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FCSUFWQkFuSWhCQ0FIUVJ4cUVBOEVRQ0FFSVFVRklBQWdCR29nQjBFVWFpQUhRUnhxSWdRUUVUb0FBQ0FHSUFkQkRHb2dCQkFST2dBRElBVkJCR29oQlF3Q0N3c0xBbjhEUUVHNmZ5RUlJQVZCL1FGTERRTWdBQ0FGYWlJR0lBZEJGR29nQjBFY2FpSUpFQkU2QUFBZ0JrRUJhaUVFSUFrUUQwRURSZ1JBSUFkQkRHb2hDRUVDREFJTElBVkIvQUZMRFFNZ0JpQUhRUXhxSUFkQkhHb2lCQkFST2dBQklBVkJBbW9oQlNBRUVBOUJBMGNOQUFzZ0FDQUZhaUVFSUFkQkZHb2hDRUVEQ3lBRUlBZ2dCMEVjYWhBUk9nQUFJQVpxSUFCcklRZ01BUXNDZndOQVFicC9JUWdnQlVIOUFVc05BaUFBSUFWcUlnWWdCMEVVYWlBSFFSeHFJZ2tRRURvQUFDQUdRUUZxSVFRZ0NSQVBRUU5HQkVBZ0IwRU1haUVJUVFJTUFnc2dCVUg4QVVzTkFpQUdJQWRCREdvZ0IwRWNhaUlFRUJBNkFBRWdCVUVDYWlFRklBUVFEMEVEUncwQUN5QUFJQVZxSVFRZ0IwRVVhaUVJUVFNTElBUWdDQ0FIUVJ4cUVCQTZBQUFnQm1vZ0FHc2hDQXNnQ0VHSWYwc05BUXNnQ0NFRVFRQWhCU0FCUVFCQk5CQURJUWxCQUNFS0EwQWdCQ0FGUndSQUlBQWdCV29pQmkwQUFDSUJRUXRMQkVCQmJDRUlEQU1GSUFrZ0FVRUNkR29pQVNBQktBSUFRUUZxTmdJQUlBVkJBV29oQlVFQklBWXRBQUIwUVFGMUlBcHFJUW9NQWdzQUN3dEJiQ0VJSUFwRkRRQWdDbWNpQlVFZmN5SUJRUXRMRFFBZ0EwRWdJQVZyTmdJQVFRRkJBaUFCZENBS2F5SURaMEVmY3lJQmRDQURSdzBBSUFBZ0JHb2dBVUVCYWlJQU9nQUFJQWtnQUVFQ2RHb2lBQ0FBS0FJQVFRRnFOZ0lBSUFrb0FnUWlBRUVDU1NBQVFRRnhjZzBBSUFJZ0JFRUJhallDQUNBTFFRRnFJUWdMSUFkQk1Hb2tBQ0FJQzZBRkFReC9Jd0JCRUdzaURDUUFBbjhnQkVFSFRRUkFJQXhDQURjRENDQU1RUWhxSWdVZ0F5QUVFQUlhUVd3Z0FDQUJJQUlnQlVFSUVBd2lBQ0FBSUFSTEd5QUFJQUJCaVg5Skd3d0JDeUFBUVFBZ0FTZ0NBRUVCYWlJTlFRRjBFQU1oRDBGVUlBTW9BQUFpQmtFUGNTSUFRUXBMRFFBYUlBSWdBRUVGYWpZQ0FDQURJQVJxSWdKQkJHc2hCeUFDUVFkcklRc2dBRUVHYWlFT1FRUWhBaUFHUVFSMklRVkJJQ0FBZENJSVFRRnlJUWxCQUNFQVFRRWhCaUFESVFRRFFBSkFJQVpCQVhGRkJFQURRQ0FGUVg5elFZQ0FnSUI0Y21naUJrRVlTVVVFUUNBQVFTUnFJUUFnQkNBTFRRUi9JQVJCQTJvRklBUWdDMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMSUFJZ0JrRWVjU0lLYWtFQ2FpRUNJQVpCQVhaQkEyd2dBR29nQlNBS2RrRURjV29pQUNBTlR3MEJBbjhnQkNBTFN5QUNRUU4ySUFScUlnVWdCMHR4UlFSQUlBSkJCM0VoQWlBRkRBRUxJQVFnQjJ0QkEzUWdBbXBCSDNFaEFpQUhDeUlFS0FBQUlBSjJJUVVMSUFVZ0NFRUJhM0VpQmlBSVFRRjBRUUZySWdvZ0NXc2lFRWtFZnlBT1FRRnJCU0FGSUFweElnVWdFRUVBSUFVZ0NFNGJheUVHSUE0TElRVWdEeUFBUVFGMGFpQUdRUUZySWdvN0FRQWdBRUVCYWlFQUlBSWdCV29oQWlBSVFRRWdCbXNnQ2lBR1FRQktHeUFKYWlJSlNnUkFJQWxCQWtnTkFVRWdJQWxuSWdWcklRNUJBU0FGUVI5emRDRUlDeUFBSUExUERRQWdDa0VBUnlFR0FuOGdCQ0FMU3lBQ1FRTjFJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBSWdCQ0FIYTBFRGRHcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVU1BUXNMUVd3Z0NVRUJSdzBBR2tGUUlBQWdEVXNOQUJwQmJDQUNRU0JLRFFBYUlBRWdBRUVCYXpZQ0FDQUVJQUpCQjJwQkEzVnFJQU5yQ3lBTVFSQnFKQUFMOGdFQkFYOGdBa1VFUUNBQVFnQTNBZ0FnQUVFQU5nSVFJQUJDQURjQ0NFRzRmdzhMSUFBZ0FUWUNEQ0FBSUFGQkJHbzJBaEFnQWtFRVR3UkFJQUFnQVNBQ2FpSUJRUVJySWdNMkFnZ2dBQ0FES0FBQU5nSUFJQUZCQVdzdEFBQWlBUVJBSUFBZ0FXZEJGMnMyQWdRZ0FnOExJQUJCQURZQ0JFRi9Ed3NnQUNBQk5nSUlJQUFnQVMwQUFDSUROZ0lBQWtBQ1FBSkFJQUpCQW1zT0FnRUFBZ3NnQUNBQkxRQUNRUkIwSUFOeUlnTTJBZ0FMSUFBZ0FTMEFBVUVJZENBRGFqWUNBQXNnQVNBQ2FrRUJheTBBQUNJQlJRUkFJQUJCQURZQ0JFRnNEd3NnQUNBQlp5QUNRUU4wYTBFSmFqWUNCQ0FDQzBRQkFuOGdBU0FDTHdFQUlnTWdBU2dDQkdvaUJEWUNCQ0FBSUFOQkFuUkJvQjFxS0FJQUlBRW9BZ0JCQUNBRWEzWnhOZ0lBSUFFUUR4b2dBQ0FDUVFScU5nSUVDNThCQVFSL1FRTWhBU0FBS0FJRUlnSkJJRTBFUUNBQUtBSUlJZ0VnQUNnQ0VFOEVRQ0FBSUFKQkIzRTJBZ1FnQUNBQklBSkJBM1pySWdJMkFnZ2dBQ0FDS0FBQU5nSUFRUUFQQ3lBQUtBSU1JZ01nQVVZRVFFRUJRUUlnQWtFZ1NSc1BDeUFBSUFFZ0FTQURheUFDUVFOMklnUWdBU0FFYXlBRFNTSUJHeUlEYXlJRU5nSUlJQUFnQWlBRFFRTjBhellDQkNBQUlBUW9BQUEyQWdBTElBRUxTQUVFZnlBQUtBSUVJQUFvQWdCQkFuUnFJZ0l0QUFJZ0FpOEJBQ0VFSUFFZ0FTZ0NCQ0lGSUFJdEFBTWlBbW8yQWdRZ0FDQUVJQUVvQWdBZ0JYUkJBQ0FDYTNacU5nSUFDMUlCQkg4Z0FDZ0NCQ0FBS0FJQVFRSjBhaUlDTFFBQ0lBSXZBUUFoQkNBQklBSXRBQU1pQWlBQktBSUVhaUlGTmdJRUlBQWdCQ0FDUVFKMFFhQWRhaWdDQUNBQktBSUFRUUFnQld0MmNXbzJBZ0FMQ0FBZ0FFR0lmMHNMR2dBZ0FBUkFJQUVFUUNBQ0lBQWdBUkVDQUE4TElBQVFCZ3NMcGdnQ0RYOEJmaU1BUVJCcklna2tBQ0FKUVFBMkFnd2dDVUVBTmdJSUFuOENRQ0FEUWVnSmFpQURJQWxCQ0dvZ0NVRU1haUFCSUFJZ0EwR0FBV29RQ3lJUFFZaC9TdzBBUVZRZ0NTZ0NEQ0lFSUFBb0FnQWlBVUgvQVhGQkFXcExEUUVhSUFCQkJHb2hDeUFBSUFGQi80R0FlSEVnQkVFUWRFR0FnUHdIY1hJMkFnQkJmeUFFSUFSQkFFZ2JRUUZxSVFCQkFDRUJJQWtvQWdnaEJVRUFJUUlEUUNBQUlBSkdCRUFnQlVFRGF5RUJRUUFoQUFOQUFrQkJBQ0VDSUFBZ0FVNEVRQU5BSUFBZ0JVNE5BaUFESUFBZ0EycEI2QWxxTFFBQVFRSjBha0ZBYXlJQklBRW9BZ0FpQVVFQmFqWUNBQ0FCSUFOcUlBQTZBT2dISUFCQkFXb2hBQXdBQ3dBRkEwQWdBa0VFUmtVRVFDQURJQU1nQUNBQ2FpSUhha0hvQ1dvdEFBQkJBblJxUVVCcklnZ2dDQ2dDQUNJSVFRRnFOZ0lBSUFNZ0NHb2dCem9BNkFjZ0FrRUJhaUVDREFFTEN5QUFRUVJxSVFBTUFnc0FDd3NnQkVFQmFpRU9JQU1vQWdBaEIwRUFJUUJCQVNFSUEwQWdDQ0FPUmcwRElBNGdDR3NoQkNBRElBaEJBblJxS0FJQUlRVUNRQUpBQWtBQ1FBSkFBa0JCQVNBSWRFRUJkU0lOUVFGckRnZ0FBUVFDQkFRRUF3UUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUFJUUVEUUNBQ0lBWkdEUVVnQXlBQ0lBZHFhaTBBNkFjaENpQUxJQUZCQVhScUlnd2dCRG9BQVNBTUlBbzZBQUFnQWtFQmFpRUNJQUZCQVdvaEFRd0FDd0FMUVFBaEFpQUZRUUFnQlVFQVNoc2hDaUFBSVFFRFFDQUNJQXBHRFFRZ0N5QUJRUUYwYWlJR0lBTWdBaUFIYW1vdEFPZ0hJZ3c2QUFJZ0JpQUVPZ0FCSUFZZ0REb0FBQ0FHSUFRNkFBTWdBa0VCYWlFQ0lBRkJBbW9oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaEJpQUVRUWgwUVlEK0EzRWhCQ0FBSVFFRFFDQUNJQVpHRFFNZ0N5QUJRUUYwYWlBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrTndBQUlBSkJBV29oQWlBQlFRUnFJUUVNQUFzQUMwRUFJUUlnQlVFQUlBVkJBRW9iSVFZZ0JFRUlkRUdBL2dOeElRUWdBQ0VCQTBBZ0FpQUdSZzBDSUFzZ0FVRUJkR29pQ2lBRUlBTWdBaUFIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSWhFM0FBZ2dDaUFSTndBQUlBSkJBV29oQWlBQlFRaHFJUUVNQUFzQUMwRUFJUUVnQlVFQUlBVkJBRW9iSVFvZ0JFRUlkRUdBL2dOeElRd2dBQ0VFQTBBZ0FTQUtSZzBCSUFzZ0JFRUJkR29oRUNBTUlBTWdBU0FIYW1vdEFPZ0hjcTFDZ1lDRWdKQ0F3QUIrSVJGQkFDRUNBMEFnQWlBTlRrVUVRQ0FRSUFKQkFYUnFJZ1lnRVRjQUdDQUdJQkUzQUJBZ0JpQVJOd0FJSUFZZ0VUY0FBQ0FDUVJCcUlRSU1BUXNMSUFGQkFXb2hBU0FFSUExcUlRUU1BQXNBQ3lBSVFRRnFJUWdnQlNBSGFpRUhJQVVnRFd3Z0FHb2hBQXdBQ3dBRklBTWdBa0VDZEdvaUIwRkFheUFCTmdJQUlBSkJBV29oQWlBSEtBSUFJQUZxSVFFTUFRc0FDd0FMSUE4TElBbEJFR29rQUF2eUFnRUdmeU1BUVNCcklnVWtBQ0FFS0FJQUlRWWdCVUVNYWlBQ0lBTVFEU0lEUVloL1RRUkFJQVJCQkdvaEFpQUFJQUZxSWdsQkEyc2hCRUVBSUFaQkVIWnJRUjl4SVFNRFFDQUZRUXhxRUE4Z0FDQUVUM0pGQkVBZ0FpQUZLQUlNSWdZZ0JTZ0NFQ0lIZENBRGRrRUJkR29pQ0MwQUFTRUtJQUFnQ0MwQUFEb0FBQ0FDSUFZZ0J5QUthaUlHZENBRGRrRUJkR29pQnkwQUFDRUlJQVVnQmlBSExRQUJhallDRUNBQUlBZzZBQUVnQUVFQ2FpRUFEQUVMQ3dOQUlBVkJER29RRHlFSElBVW9BZ3doQmlBRktBSVFJUVFnQUNBSlR5QUhja1VFUUNBQ0lBWWdCSFFnQTNaQkFYUnFJZ1l0QUFBaEJ5QUZJQVFnQmkwQUFXbzJBaEFnQUNBSE9nQUFJQUJCQVdvaEFBd0JDd3NEUUNBQUlBbFBSUVJBSUFJZ0JpQUVkQ0FEZGtFQmRHb2lCeTBBQVNFSUlBQWdCeTBBQURvQUFDQUFRUUZxSVFBZ0JDQUlhaUVFREFFTEMwRnNRV3dnQVNBRktBSVVJQVVvQWhoSEd5QUVRU0JIR3lFREN5QUZRU0JxSkFBZ0F3dlBGQUVqZnlNQVFkQUFheUlGSkFCQmJDRUpBa0FnQTBFS1NRMEFBa0FnQXlBQ0x3QUVJZ2NnQWk4QUFDSUlJQUl2QUFJaURXcHFRUVpxSWd4SkRRQWdCQzhCQWlFR0lBVkJQR29nQWtFR2FpSUNJQWdRRFNJSlFZaC9TdzBCSUFWQktHb2dBaUFJYWlJQ0lBMFFEU0lKUVloL1N3MEJJQVZCRkdvZ0FpQU5haUlDSUFjUURTSUpRWWgvU3cwQklBVWdBaUFIYWlBRElBeHJFQTBpQ1VHSWYwc05BU0FFUVFScUlRb2dBQ0FCYWlJZlFRTnJJU0JCQUNBR2EwRWZjU0VMSUFVb0FnZ2hFU0FGS0FJY0lSSWdCU2dDTUNFVElBVW9Ba1FoRkNBRktBSUVJUWtnQlNnQ0dDRU5JQVVvQWl3aERDQUZLQUpBSVFZZ0JTZ0NFQ0VoSUFVb0FpUWhJaUFGS0FJNElTTWdCU2dDVENFa0lBVW9BZ0FoRlNBRktBSVVJUllnQlNnQ0tDRVhJQVVvQWp3aEdFRUJJUThnQUNBQlFRTnFRUUoySWdScUlnTWdCR29pQWlBRWFpSVpJUVFnQWlFSUlBTWhCd05BSUE5QkFYRkZJQVFnSUU5eVJRUkFJQUFnQ2lBWUlBWjBJQXQyUVFKMGFpSU9Md0VBT3dBQUlBNHRBQUloR2lBT0xRQURJUkFnQnlBS0lCY2dESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdEaTBBQWlFYklBNHRBQU1oRHlBSUlBb2dGaUFOZENBTGRrRUNkR29pRGk4QkFEc0FBQ0FPTFFBQ0lSd2dEaTBBQXlFZElBUWdDaUFWSUFsMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhIaUFPTFFBRElRNGdBQ0FRYWlJbElBb2dHQ0FHSUJwcUlnWjBJQXQyUVFKMGFpSVFMd0VBT3dBQUlCQXRBQUlnRUMwQUF5RW1JQWNnRDJvaUp5QUtJQmNnRENBYmFpSWFkQ0FMZGtFQ2RHb2lCeThCQURzQUFDQUhMUUFDSVF3Z0J5MEFBeUVRSUFnZ0hXb2lHeUFLSUJZZ0RTQWNhaUlQZENBTGRrRUNkR29pQ0M4QkFEc0FBQ0FJTFFBQ0lRMGdDQzBBQXlFY0lBUWdEbW9pSFNBS0lCVWdDU0FlYWlJT2RDQUxka0VDZEdvaUNTOEJBRHNBQUNBR2FpRUFRUU1oQndKL0lCUWdKRWtFUUNBQUlRWkJBd3dCQ3lBQVFRZHhJUVlnRkNBQVFRTjJheUlVS0FBQUlSaEJBQXNnQ1MwQUF5RWVJQWt0QUFJaENDQU1JQnBxSVFBZ0V5QWpTUVIvSUFBRklCTWdBRUVEZG1zaUV5Z0FBQ0VYUVFBaEJ5QUFRUWR4Q3lFTUlBMGdEMm9oQUNBSGNpRUpRUU1oRHdKL0lCSWdJa2tFUUNBQUlRMUJBd3dCQ3lBQVFRZHhJUTBnRWlBQVFRTjJheUlTS0FBQUlSWkJBQXNnQ0NBT2FpRUFJQWx5SUJFZ0lVa0VmeUFBQlNBUklBQkJBM1pySWhFb0FBQWhGVUVBSVE4Z0FFRUhjUXNoQ1NBbElDWnFJUUFnRUNBbmFpRUhJQnNnSEdvaENDQWRJQjVxSVFRZ0QzSkZJUThNQVFzTElBVWdERFlDTENBRklBWTJBa0FnQlNBTk5nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUlnQjBrZ0FDQURTM0lOQUVGc0lRa2dDQ0FaU3cwQklBTkJBMnNoQ1FOQUlBVkJQR29RRDBVZ0FDQUpTWEVFUUNBQUlBb2dCU2dDUENJTklBVW9Ba0FpREhRZ0MzWkJBblJxSWc0dkFRQTdBQUFnQUNBT0xRQURhaUlHSUFvZ0RTQU1JQTR0QUFKcUlnQjBJQXQyUVFKMGFpSU1Md0VBT3dBQUlBVWdBQ0FNTFFBQ2FqWUNRQ0FHSUF3dEFBTnFJUUFNQVFVZ0EwRUNheUVNQTBBZ0JVRThhaEFQSVFZZ0JTZ0NQQ0VOSUFVb0FrQWhDU0FBSUF4TElBWnlSUVJBSUFBZ0NpQU5JQWwwSUF0MlFRSjBhaUlHTHdFQU93QUFJQVVnQ1NBR0xRQUNhallDUUNBQUlBWXRBQU5xSVFBTUFRc0xBMEFnQUNBTVMwVUVRQ0FBSUFvZ0RTQUpkQ0FMZGtFQ2RHb2lCaThCQURzQUFDQUFJQVl0QUFOcUlRQWdDU0FHTFFBQ2FpRUpEQUVMQ3dKQUlBQWdBMDhOQUNBQUlBb2dEU0FKZENBTGRpSUFRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSklBTXRBQUpxSVFrTUFRc2dDVUVmU3cwQVFTQWdDU0FLSUFCQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFrTElBSkJBMnNoREFOQUlBVkJLR29RRDBVZ0J5QU1TWEVFUUNBSElBb2dCU2dDS0NJR0lBVW9BaXdpQUhRZ0MzWkJBblJxSWcwdkFRQTdBQUFnQnlBTkxRQURhaUlESUFvZ0JpQUFJQTB0QUFKcUlnQjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBQ0FHTFFBQ2FqWUNMQ0FESUFZdEFBTnFJUWNNQVFVZ0FrRUNheUVHQTBBZ0JVRW9haEFQSVFNZ0JTZ0NLQ0VNSUFVb0Fpd2hBQ0FHSUFkSklBTnlSUVJBSUFjZ0NpQU1JQUIwSUF0MlFRSjBhaUlETHdFQU93QUFJQVVnQUNBRExRQUNhallDTENBSElBTXRBQU5xSVFjTUFRc0xBMEFnQmlBSFNVVUVRQ0FISUFvZ0RDQUFkQ0FMZGtFQ2RHb2lBeThCQURzQUFDQUhJQU10QUFOcUlRY2dBQ0FETFFBQ2FpRUFEQUVMQ3dKQUlBSWdCMDBOQUNBSElBb2dEQ0FBZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBQUlBTXRBQUpxSVFBTUFRc2dBRUVmU3cwQVFTQWdBQ0FLSUFKQkFuUnFMUUFDYWlJQUlBQkJJRThiSVFBTElCbEJBMnNoREFOQUlBVkJGR29RRDBVZ0NDQU1TWEVFUUNBSUlBb2dCU2dDRkNJR0lBVW9BaGdpQW5RZ0MzWkJBblJxSWcwdkFRQTdBQUFnQ0NBTkxRQURhaUlESUFvZ0JpQUNJQTB0QUFKcUlnSjBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdBaUFHTFFBQ2FqWUNHQ0FESUFZdEFBTnFJUWdNQVFVZ0dVRUNheUVEQTBBZ0JVRVVhaEFQSVFJZ0JTZ0NGQ0VHSUFVb0FoZ2hCeUFESUFoSklBSnlSUVJBSUFnZ0NpQUdJQWQwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVVnQnlBQ0xRQUNhallDR0NBSUlBSXRBQU5xSVFnTUFRc0xBMEFnQXlBSVNVVUVRQ0FJSUFvZ0JpQUhkQ0FMZGtFQ2RHb2lBaThCQURzQUFDQUlJQUl0QUFOcUlRZ2dCeUFDTFFBQ2FpRUhEQUVMQ3dKQUlBZ2dHVThOQUNBSUlBb2dCaUFIZENBTGRpSUNRUUowYWlJRExRQUFPZ0FBSUFNdEFBTkJBVVlFUUNBSElBTXRBQUpxSVFjTUFRc2dCMEVmU3cwQVFTQWdCeUFLSUFKQkFuUnFMUUFDYWlJQ0lBSkJJRThiSVFjTEEwQWdCUkFQUlNBRUlDQkpjUVJBSUFRZ0NpQUZLQUlBSWdZZ0JTZ0NCQ0lDZENBTGRrRUNkR29pREM4QkFEc0FBQ0FFSUF3dEFBTnFJZ01nQ2lBR0lBSWdEQzBBQW1vaUFuUWdDM1pCQW5ScUlnUXZBUUE3QUFBZ0JTQUNJQVF0QUFKcU5nSUVJQU1nQkMwQUEyb2hCQXdCQlNBZlFRSnJJUU1EUUNBRkVBOGhBaUFGS0FJQUlRWWdCU2dDQkNFSUlBTWdCRWtnQW5KRkJFQWdCQ0FLSUFZZ0NIUWdDM1pCQW5ScUlnSXZBUUE3QUFBZ0JTQUlJQUl0QUFKcU5nSUVJQVFnQWkwQUEyb2hCQXdCQ3dzRFFDQURJQVJKUlFSQUlBUWdDaUFHSUFoMElBdDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0FpMEFBMm9oQkNBSUlBSXRBQUpxSVFnTUFRc0xBa0FnQkNBZlR3MEFJQVFnQ2lBR0lBaDBJQXQySWdKQkFuUnFJZ010QUFBNkFBQWdBeTBBQTBFQlJnUkFJQWdnQXkwQUFtb2hDQXdCQ3lBSVFSOUxEUUJCSUNBSUlBb2dBa0VDZEdvdEFBSnFJZ0lnQWtFZ1R4c2hDQXRCYkVGc1FXeEJiRUZzUVd4QmJFRnNJQUVnQ0VFZ1J4c2dCU2dDQ0NBRktBSU1SeHNnQjBFZ1J4c2dCU2dDSENBRktBSWdSeHNnQUVFZ1J4c2dCU2dDTUNBRktBSTBSeHNnQ1VFZ1J4c2dCU2dDUkNBRktBSklSeHNoQ1F3SkN3QUxBQXNBQ3dBTEFBc0FDd0FMQUF0QmJDRUpDeUFGUWRBQWFpUUFJQWtMN0JBQkhuOGpBRUhRQUdzaUJTUUFRV3doQ1FKQUlBTkJDa2tOQUFKQUlBTWdBaThBQkNJR0lBSXZBQUFpQnlBQ0x3QUNJZ2hxYWtFR2FpSU9TUTBBSUFRdkFRSWhEeUFGUVR4cUlBSkJCbW9pQWlBSEVBMGlDVUdJZjBzTkFTQUZRU2hxSUFJZ0Iyb2lBaUFJRUEwaUNVR0lmMHNOQVNBRlFSUnFJQUlnQ0dvaUFpQUdFQTBpQ1VHSWYwc05BU0FGSUFJZ0Jtb2dBeUFPYXhBTklnbEJpSDlMRFFFZ0JFRUVhaUVLSUFBZ0FXb2lIRUVEYXlFZFFRQWdEMnRCSDNFaEN5QUZLQUlJSVJFZ0JTZ0NIQ0VTSUFVb0FqQWhFeUFGS0FKRUlSUWdCU2dDQkNFSklBVW9BaGdoQmlBRktBSXNJUWNnQlNnQ1FDRUlJQVVvQWhBaEhpQUZLQUlrSVI4Z0JTZ0NPQ0VnSUFVb0Frd2hJU0FGS0FJQUlSVWdCU2dDRkNFV0lBVW9BaWdoRnlBRktBSThJUmhCQVNFTklBQWdBVUVEYWtFQ2RpSUNhaUlPSUFKcUlnOGdBbW9pR1NFRUlBOGhBaUFPSVFNRFFDQU5SU0FFSUIxUGNrVUVRQ0FLSUJnZ0NIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFBZ0NpQVhJQWQwSUF0MlFRRjBhaUlNTFFBQklSQWdBeUFNTFFBQU9nQUFJQW9nRmlBR2RDQUxka0VCZEdvaURDMEFBU0VhSUFJZ0RDMEFBRG9BQUNBS0lCVWdDWFFnQzNaQkFYUnFJZ3d0QUFFaEd5QUVJQXd0QUFBNkFBQWdDaUFZSUFnZ0RXb2lDSFFnQzNaQkFYUnFJZ3d0QUFFaERTQUFJQXd0QUFBNkFBRWdDaUFYSUFjZ0VHb2lCM1FnQzNaQkFYUnFJZ3d0QUFFaEVDQURJQXd0QUFBNkFBRWdDaUFXSUFZZ0dtb2lESFFnQzNaQkFYUnFJZ1l0QUFFaEdpQUNJQVl0QUFBNkFBRWdDaUFWSUFrZ0cyb2lHM1FnQzNaQkFYUnFJZ2t0QUFFaElpQUVJQWt0QUFBNkFBRWdDQ0FOYWlFR1FRTWhDUUovSUJRZ0lVa0VRRUVESVEwZ0Jnd0JDeUFVSUFaQkEzWnJJaFFvQUFBaEdFRUFJUTBnQmtFSGNRc2hDQ0FISUJCcUlRWWdFeUFnU1FSL0lBWUZJQk1nQmtFRGRtc2lFeWdBQUNFWFFRQWhDU0FHUVFkeEN5RUhJQXdnR21vaERDQUpJQTF5SVJCQkF5RU5BbjhnRWlBZlNRUkFJQXdoQmtFRERBRUxJQXhCQjNFaEJpQVNJQXhCQTNackloSW9BQUFoRmtFQUN5QWJJQ0pxSVF3Z0VISWhFQ0FSSUI1SkJIOGdEQVVnRVNBTVFRTjJheUlSS0FBQUlSVkJBQ0VOSUF4QkIzRUxJUWtnQkVFQ2FpRUVJQUpCQW1vaEFpQURRUUpxSVFNZ0FFRUNhaUVBSUEwZ0VISkZJUTBNQVFzTElBVWdCellDTENBRklBZzJBa0FnQlNBR05nSVlJQVVnQ1RZQ0JDQUZJQlEyQWtRZ0JTQVROZ0l3SUFVZ0VqWUNIQ0FGSUJFMkFnZ2dCU0FZTmdJOElBVWdGellDS0NBRklCWTJBaFFnQlNBVk5nSUFJQUFnRGtzZ0F5QVBTM0lOQUVGc0lRa2dBaUFaU3cwQklBNUJBMnNoQ1FOQUlBVkJQR29RRHlBQUlBbFBja1VFUUNBS0lBVW9BandpQmlBRktBSkFJZ2QwSUF0MlFRRjBhaUlJTFFBQklRd2dBQ0FJTFFBQU9nQUFJQW9nQmlBSElBeHFJZ1owSUF0MlFRRjBhaUlITFFBQUlRZ2dCU0FHSUFjdEFBRnFOZ0pBSUFBZ0NEb0FBU0FBUVFKcUlRQU1BUXNMQTBBZ0JVRThhaEFQSVFjZ0JTZ0NQQ0VHSUFVb0FrQWhDU0FBSUE1UElBZHlSUVJBSUFvZ0JpQUpkQ0FMZGtFQmRHb2lCaTBBQUNFSElBVWdDU0FHTFFBQmFqWUNRQ0FBSUFjNkFBQWdBRUVCYWlFQURBRUxDd05BSUFBZ0RrOUZCRUFnQ2lBR0lBbDBJQXQyUVFGMGFpSUhMUUFCSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQ1dvaENRd0JDd3NnRDBFRGF5RUFBMEFnQlVFb2FoQVBJQUFnQTAxeVJRUkFJQW9nQlNnQ0tDSUdJQVVvQWl3aUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBRElBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFpd2dBeUFJT2dBQklBTkJBbW9oQXd3QkN3c0RRQ0FGUVNocUVBOGhCeUFGS0FJb0lRWWdCU2dDTENFQUlBTWdEMDhnQjNKRkJFQWdDaUFHSUFCMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBQUlBWXRBQUZxTmdJc0lBTWdCem9BQUNBRFFRRnFJUU1NQVFzTEEwQWdBeUFQVDBVRVFDQUtJQVlnQUhRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FESUFjdEFBQTZBQUFnQTBFQmFpRURJQUFnQ0dvaEFBd0JDd3NnR1VFRGF5RURBMEFnQlVFVWFoQVBJQUlnQTA5eVJRUkFJQW9nQlNnQ0ZDSUdJQVVvQWhnaUIzUWdDM1pCQVhScUlnZ3RBQUVoRGlBQ0lBZ3RBQUE2QUFBZ0NpQUdJQWNnRG1vaUJuUWdDM1pCQVhScUlnY3RBQUFoQ0NBRklBWWdCeTBBQVdvMkFoZ2dBaUFJT2dBQklBSkJBbW9oQWd3QkN3c0RRQ0FGUVJScUVBOGhCeUFGS0FJVUlRWWdCU2dDR0NFRElBSWdHVThnQjNKRkJFQWdDaUFHSUFOMElBdDJRUUYwYWlJR0xRQUFJUWNnQlNBRElBWXRBQUZxTmdJWUlBSWdCem9BQUNBQ1FRRnFJUUlNQVFzTEEwQWdBaUFaVDBVRVFDQUtJQVlnQTNRZ0MzWkJBWFJxSWdjdEFBRWhDQ0FDSUFjdEFBQTZBQUFnQWtFQmFpRUNJQU1nQ0dvaEF3d0JDd3NEUUNBRkVBOGdCQ0FkVDNKRkJFQWdDaUFGS0FJQUlnSWdCU2dDQkNJR2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBS0lBSWdCaUFJYWlJQ2RDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0FpQUdMUUFCYWpZQ0JDQUVJQWM2QUFFZ0JFRUNhaUVFREFFTEN3TkFJQVVRRHlFSElBVW9BZ0FoQmlBRktBSUVJUUlnQkNBY1R5QUhja1VFUUNBS0lBWWdBblFnQzNaQkFYUnFJZ1l0QUFBaEJ5QUZJQUlnQmkwQUFXbzJBZ1FnQkNBSE9nQUFJQVJCQVdvaEJBd0JDd3NEUUNBRUlCeFBSUVJBSUFvZ0JpQUNkQ0FMZGtFQmRHb2lCeTBBQVNFSUlBUWdCeTBBQURvQUFDQUVRUUZxSVFRZ0FpQUlhaUVDREFFTEMwRnNRV3hCYkVGc1FXeEJiRUZzUVd3Z0FTQUNRU0JIR3lBRktBSUlJQVVvQWd4SEd5QURRU0JIR3lBRktBSWNJQVVvQWlCSEd5QUFRU0JIR3lBRktBSXdJQVVvQWpSSEd5QUpRU0JIR3lBRktBSkVJQVVvQWtoSEd5RUpEQUVMUVd3aENRc2dCVUhRQUdva0FDQUpDMWdCQTM4Q1FDQUFLQUtRNndFaUFVVU5BQ0FCS0FJQUlBRkJ0TlVCYWlnQ0FDSUNJQUZCdU5VQmFpZ0NBQ0lERUJNZ0FnUkFJQU1nQVNBQ0VRSUFEQUVMSUFFUUJnc2dBRUVBTmdLZzZ3RWdBRUlBTndPUTZ3RUw2UU1DQkg4Q2ZpQUFRUUJCS0JBRElRUWdBa0VCUVFVZ0F4c2lBRWtFUUNBQUR3c2dBVVVFUUVGL0R3dEJBU0VHQWtBQ1FDQURRUUZHRFFBZ0F5RUdJQUVvQUFBaUJVR282cjVwUmcwQVFYWWhBeUFGUVhCeFFkRFV0TUlCUncwQlFRZ2hBeUFDUVFoSkRRRWdBVFVBQkNFSUlBUkJBVFlDRkNBRUlBZzNBd0JCQUE4TElBRWdBaUFHRUJvaUF5QUNTdzBBSUFRZ0F6WUNHRUZ5SVFNZ0FDQUJhaUlGUVFGckxRQUFJZ0pCQ0hFTkFDQUNRU0J4SWdaRkJFQkJjQ0VESUFVdEFBQWlCVUduQVVzTkFTQUZRUWR4clVJQklBVkJBM1pCQ21xdGhpSUlRZ09JZmlBSWZDRUpJQUJCQVdvaEFBc2dBa0VHZGlFRklBSkJBblpCQUNFREFrQUNRQUpBQWtBZ0FrRURjVUVCYXc0REFBRUNBd3NnQUNBQmFpMEFBQ0VESUFCQkFXb2hBQXdDQ3lBQUlBRnFMd0FBSVFNZ0FFRUNhaUVBREFFTElBQWdBV29vQUFBaEF5QUFRUVJxSVFBTFFRRnhJUUlDZmdKQUFrQUNRQUpBSUFWQkFXc09Bd0VDQXdBTFFuOGdCa1VOQXhvZ0FDQUJhakVBQUF3REN5QUFJQUZxTXdBQVFvQUNmQXdDQ3lBQUlBRnFOUUFBREFFTElBQWdBV29wQUFBTElRZ2dCQ0FDTmdJZ0lBUWdBellDSENBRUlBZzNBd0JCQUNFRElBUkJBRFlDRkNBRUlBZ2dDU0FHR3lJSU53TUlJQVJDZ0lBSUlBZ2dDRUtBZ0FoYUd6NENFQXNnQXd0ZkFRRi9RYmgvSVFNZ0FVRUJRUVVnQWhzaUFrOEVmeUFBSUFKcVFRRnJMUUFBSWdCQkEzRkJBblJCb0I1cUtBSUFJQUpxSUFCQkJIWkJESEZCc0I1cUtBSUFhaUFBUVNCeElnRkZhaUFCUVFWMklBQkJ3QUJKY1dvRlFiaC9Dd3NNQUNBQUlBRWdBa0VBRUJrTGx3TUNCWDhDZmlNQVFVQnFJZ1FrQUFKQUEwQWdBVUVGVHdSQUFrQWdBQ2dBQUVGd2NVSFExTFRDQVVZRVFFSitJUWNnQVVFSVNRMEVJQUFvQUFRaUFrRjNTdzBFSUFKQkNHb2lBeUFCU3cwRUlBSkJnWDlKRFFFTUJBc2dCRUVZYWlBQUlBRVFHeUVDUW40Z0JDa0RHRUlBSUFRb0FpeEJBVWNiSUFJYklnZENmVllOQXlBSElBaDhJZ2dnQjFSQ2ZpRUhEUU1DUUFKQUlBRkJDRWtOQUNBQUtBQUFRWEJ4UWREVXRNSUJSdzBBSUFBb0FBUWlBa0YzU3cwRlFiaC9JQUpCQ0dvaUFpQUJJQUpKR3lFRERBRUxJQVJCR0dvZ0FDQUJFQnNpQWtHSWYwc0VRQ0FDSVFNTUFRdEJ1SDhoQXlBQ0RRQWdBU0FFS0FJd0lnSnJJUVVnQUNBQ2FpRUdBMEFnQmlBRklBUkJER29RSFNJRFFZaC9TdzBCSUFOQkEyb2lBaUFGU3dSQVFiaC9JUU1NQWdzZ0JTQUNheUVGSUFJZ0Jtb2hCaUFFS0FJUVJRMEFDeUFFS0FJNEJIOUJ1SDhoQXlBRlFRUkpEUUVnQmtFRWFnVWdCZ3NnQUdzaEF3c2dBMEdJZjBzTkF3c2dBU0FEYXlFQklBQWdBMm9oQUF3QkN3dENmaUFJSUFFYklRY0xJQVJCUUdza0FDQUhDMlFCQVg5QnVIOGhBd0pBSUFGQkEwa05BQ0FBTFFBQ0lRRWdBaUFBTHdBQUlnQkJBWEUyQWdRZ0FpQUFRUUYyUVFOeElnTTJBZ0FnQWlBQUlBRkJFSFJ5UVFOMklnQTJBZ2dDUUFKQUlBTkJBV3NPQXdJQkFBRUxRV3dQQ3lBQUlRTUxJQU1MUkFFQ2Z5QUJJQUlvQWdRaUF5QUJLQUlFYWlJRU5nSUVJQUFnQTBFQ2RFR2dIV29vQWdBZ0FTZ0NBRUVBSUFScmRuRTJBZ0FnQVJBUEdpQUFJQUpCQ0dvMkFnUUx6Z0VCQm45QnVuOGhDZ0pBSUFJb0FnUWlDQ0FDS0FJQUlnbHFJZzBnQVNBQWEwc05BRUZzSVFvZ0NTQUVJQU1vQWdBaUMydExEUUFnQUNBSmFpSUVJQUlvQWdnaURHc2hBaUFBSUFGQklHc2lBQ0FMSUFsQkFCQWdJQU1nQ1NBTGFqWUNBQUpBQWtBZ0JDQUZheUFNVHdSQUlBSWhCUXdCQ3lBTUlBUWdCbXRMRFFJZ0J5QUhJQUlnQldzaUFtb2lBU0FJYWs4RVFDQUVJQUVnQ0JBS0dnd0NDeUFDSUFocUlRZ2dCQ0FCUVFBZ0Ftc1FDaUFDYXlFRUN5QUVJQUFnQlNBSVFRRVFJQXNnRFNFS0N5QUtDOGNFQVFKL0lBQWdBMm9oQmdKQUlBTkJCMHdFUUFOQUlBQWdCazhOQWlBQUlBSXRBQUE2QUFBZ0FFRUJhaUVBSUFKQkFXb2hBZ3dBQ3dBTElBUkJBVVlFUUFKQUlBQWdBbXNpQlVFSFRRUkFJQUFnQWkwQUFEb0FBQ0FBSUFJdEFBRTZBQUVnQUNBQ0xRQUNPZ0FDSUFBZ0FpMEFBem9BQXlBQUlBSWdCVUVDZENJRlFjQWVhaWdDQUdvaUFpZ0FBRFlBQkNBQ0lBVkI0QjVxS0FJQWF5RUNEQUVMSUFBZ0Fpa0FBRGNBQUFzZ0FrRUlhaUVDSUFCQkNHb2hBQXNnQVNBR1R3UkFJQUFnQTJvaEFTQUVRUUZISUFBZ0FtdEJEMHB5UlFSQUEwQWdBQ0FDS1FBQU53QUFJQUpCQ0dvaEFpQUFRUWhxSWdBZ0FVa05BQXdEQ3dBTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dBMEVSU1EwQklBQkJFR29oQUFOQUlBQWdBaWtBRURjQUFDQUFJQUlwQUJnM0FBZ2dBQ0FDS1FBZ053QVFJQUFnQWlrQUtEY0FHQ0FDUVNCcUlRSWdBRUVnYWlJQUlBRkpEUUFMREFFTEFrQWdBQ0FCU3dSQUlBQWhBUXdCQ3lBQklBQnJJUVVDUUNBRVFRRkhJQUFnQW10QkQwcHlSUVJBSUFJaEF3TkFJQUFnQXlrQUFEY0FBQ0FEUVFocUlRTWdBRUVJYWlJQUlBRkpEUUFMREFFTElBQWdBaWtBQURjQUFDQUFJQUlwQUFnM0FBZ2dCVUVSU0EwQUlBQkJFR29oQUNBQ0lRTURRQ0FBSUFNcEFCQTNBQUFnQUNBREtRQVlOd0FJSUFBZ0F5a0FJRGNBRUNBQUlBTXBBQ2czQUJnZ0EwRWdhaUVESUFCQklHb2lBQ0FCU1EwQUN3c2dBaUFGYWlFQ0N3TkFJQUVnQms4TkFTQUJJQUl0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29oQWd3QUN3QUxDNjRIQWdWL0FYNGpBRUdBQVdzaUVTUUFJQkVnQXpZQ2ZFRi9JUThDUUFKQUFrQUNRQUpBSUFJT0JBRUFBd0lFQ3lBR1JRUkFRYmgvSVE4TUJBdEJiQ0VQSUFVdEFBQWlBaUFEU3cwRElBZ2dBa0VDZENJQ2FpZ0NBQ0VESUFJZ0Iyb29BZ0FoQWlBQVFRQTZBQXNnQUVJQU53SUFJQUFnQWpZQ0RDQUFJQU02QUFvZ0FFRUFPd0VJSUFFZ0FEWUNBRUVCSVE4TUF3c2dBU0FKTmdJQVFRQWhEd3dDQ3lBS1JRUkFRV3doRHd3Q0MwRUFJUThnQzBVZ0RFRVpTSElOQVVFSUlBUjBRUWhxSVFCQkFDRURBMEFnQUNBRFRRMENJQU5CUUdzaEF3d0FDd0FMUVd3aER5QVJJQkZCL0FCcUlCRkIrQUJxSUFVZ0JoQU1JZ05CaUg5TERRQWdFU2dDZUNJQ0lBUkxEUUFnRVNnQ2ZFRUJhaUVKSUFCQkNHb2hDMEdBZ0FJZ0FuUkJFSFVoQlVFQklSQkJBU0FDZENJUFFRRnJJZ29oRWdOQUlBa2dEa2NFUUFKQUlCRWdEa0VCZENJRWFpOEJBQ0lNUWYvL0EwWUVRQ0FMSUJKQkEzUnFJQTQyQWdRZ0VrRUJheUVTUVFFaERBd0JDeUFRUVFBZ0JTQU13VW9iSVJBTElBUWdEV29nRERzQkFDQU9RUUZxSVE0TUFRc0xJQUFnQWpZQ0JDQUFJQkEyQWdBQ1FDQUtJQkpHQkVBZ0RVSHFBR29oQmtFQUlSQkJBQ0VNQTBBZ0NTQVFSZ1JBSUE5QkEzWWdEMEVCZG1wQkEyb2lCVUVCZENFRVFRQWhERUVBSVJJRFFFRUFJUTRnRHlBU1RRMEVBMEFnRGtFQ1J3UkFJQXNnQlNBT2JDQU1haUFLY1VFRGRHb2dCaUFPSUJKcWFpMEFBRFlDQkNBT1FRRnFJUTRNQVFzTElCSkJBbW9oRWlBRUlBeHFJQXB4SVF3TUFBc0FCU0FSSUJCQkFYUnFMZ0VBSVFVZ0JpQU1haUlFSUJNM0FBQkJDQ0VPQTBBZ0JTQU9TZ1JBSUFRZ0Rtb2dFemNBQUNBT1FRaHFJUTRNQVFzTElCTkNnWUtFaUpDZ3dJQUJmQ0VUSUJCQkFXb2hFQ0FGSUF4cUlRd01BUXNBQ3dBTElBOUJBM1lnRDBFQmRtcEJBMm9oQlVFQUlSQkJBQ0VPQTBBZ0NTQVFSZzBCUVFBaERDQVJJQkJCQVhScUxnRUFJZ1JCQUNBRVFRQktHeUVFQTBBZ0JDQU1Sd1JBSUFzZ0RrRURkR29nRURZQ0JBTkFJQVVnRG1vZ0NuRWlEaUFTU3cwQUN5QU1RUUZxSVF3TUFRc0xJQkJCQVdvaEVBd0FDd0FMSUFKQkFXb2hCVUVBSVF3RFFDQU1JQTlIQkVBZ0RTQUxJQXhCQTNScUlna29BZ1FpQkVFQmRHb2lBaUFDTHdFQUlnWkJBV283QVFBZ0NTQUZJQVpuUVdCemFpSUNPZ0FESUFrZ0JpQUNkQ0FQYXpzQkFDQUpJQWdnQkVFQ2RDSUNhaWdDQURvQUFpQUpJQUlnQjJvb0FnQTJBZ1FnREVFQmFpRU1EQUVMQ3lBQklBQTJBZ0FnQXlFUEN5QVJRWUFCYWlRQUlBOEw3Vm9DTzM4R2ZpTUFRZUFCYXlJRUpBQUNRRUd3N0FrUUJTSUZSUVJBUVVBaEJ3d0JDeUFGUWdBM0F2VHFBU0FGUVFBMkFzVHJBU0FGUVFBMkFyVHJBU0FGUWdBM0FwenJBU0FGUVFBMkFyanBBU0FGUVFBMkFxenNDU0FGUWdBM0F0VHJBU0FGUWdBM0FxenJBU0FGUWdBM0E0anJBU0FGUWdBM0F1VHFBU0FGUWdBM0F1VHJBU0FGUVlHQWdNQUFOZ0s4NndFZ0JVSUFOd0trNndFZ0JVSDg2Z0ZxUVFBMkFnQWdCVUdRNndGcVFnQTNBd0FnQlJBWUlBVkJyTlVCYWlFVUlBVkIrT3NCYWlFY0lBVkJzT29CYWlFaUlBVkJvREJxSVNvZ0JVR1lJR29oS3lBRlFhalFBR29oSGlBRlFSQnFJU3dnQlVFSWFpRW9JQVZCQkdvaExTQUZRY0RwQVdvaEtTQUZRWWpyQVdvZ0JFR1VBV29oTHlBRVFZd0JhaUV3SUFSQmhBRnFJVEVnQkVIY0FHb2hNaUFFUWRRQWFpRXpJQVJCekFCcUlUUWdBQ0VkQWtBQ1FBSkFBa0FDUUFOQVFRRkJCU0FGS0FMazZnRWJJUVlDUUFOQUlBTWdCa2tOQVNBQ0tBQUFRWEJ4UWREVXRNSUJSZ1JBUWJoL0lRY2dBMEVJU1EwSUlBSW9BQVFpRGtGM1N3UkFRWEloQnd3SkN5QURJQTVCQ0dvaUNVa05DQ0FPUVlCL1N3UkFJQWtoQnd3SkN5QURJQWxySVFNZ0FpQUphaUVDREFFTEN5QUZRZ0EzQXF6cEFTQUZRZ0EzQStqcEFTQUZRUUEyQXBqckFTQUZRZ0EzQTREcUFTQUZRZ00zQS9qcEFTQUZRYlRwQVdwQ0FEY0NBQ0FGUWZEcEFXcENBRGNEQUNBRlFhalFBR29pQ1VHTWdJRGdBRFlDQUNBRlFhelFBV3BCNEJJcEFnQTNBZ0FnQlVHMDBBRnFRZWdTS0FJQU5nSUFJQVVnQlVFUWFqWUNBQ0FGSUFWQm9EQnFOZ0lFSUFVZ0JVR1lJR28yQWdnZ0JTQUpOZ0lNSUFWQkFVRUZJQVVvQXVUcUFSczJBcnpwQVFKQUlBRkZEUUFnQlNnQ3JPa0JJZ2tnSFVZTkFDQUZJQWsyQXJqcEFTQUZJQjAyQXF6cEFTQUZLQUt3NlFFaERpQUZJQjAyQXJEcEFTQUZJQjBnRGlBSmEybzJBclRwQVF0QnVIOGhDU0FEUVFWQkNTQUZLQUxrNmdFaUJodEpEUVVnQWtFQlFRVWdCaHNnQmhBYUlnNUJpSDlMQkVBZ0RpRUpEQVVMSUFNZ0RrRURha2tOQlNBcElBSWdEaUFHRUJraUJrR0lmMHNFUUNBR0lRa01CUXNnQmcwRkFrQUNRQ0FGS0FLbzZ3RkJBVWNOQUNBRktBS2s2d0VpQ1VVTkFDQUZLQUtVNndGRkRRQWdDU2dDQkVFQmF5SUhJQVVvQXR6cEFTSUtyVUtIbGErdm1MYmVtNTUvZmtMSno5bXk4ZVc2NmllRlFoZUpRcy9XMDc3U3g2dlpRbjVDK2ZQZDhabjJtYXNXZkNJL1FpR0lJRCtGUXMvVzA3N1N4NnZaUW40aVAwSWRpQ0EvaFVMNTg5M3htZmFacXhaK0lqOUNJSWdnUDRXbmNTRUdJQWtvQWdBaEZRTkFRUUFoQ0FKQUlCVWdCa0VDZEdvb0FnQWlDVVVOQUNBSktBSUlRUWhKRFFBZ0NTZ0NCQ0lTS0FBQVFiZkl3dUYrUncwQUlCSW9BQVFoQ0FzZ0NDQUtSd1JBSUFZZ0IzRkJBV29oQmlBSURRRUxDeUFKUlEwQUlBVVFHQ0FGUVg4MkFxRHJBU0FGSUFrMkFwVHJBU0FGSUFVb0F0enBBU0lJTmdLWTZ3RU1BUXNnQlNnQzNPa0JJUWdMQWtBZ0NFVU5BQ0FGS0FLWTZ3RWdDRVlOQUVGZ0lRa01CZ3NDUUNBRktBTGc2UUVFUUNBRklBVW9BdWpxQVNJSlJUWUM3T29CSUFrTkFTQUZRdm5xME5EbnlhSGs0UUEzQTZqcUFTQUZRZ0EzQTZEcUFTQUZRcy9XMDc3U3g2dlpRamNEbU9vQklBVkMxdXVDN3VyOWlmWGdBRGNEa09vQklBVkNBRGNEaU9vQklDSkJBRUVvRUFNYURBRUxJQVZCQURZQzdPb0JDeUFCSUIxcUlTVWdCU0FGS1FQbzZRRWdEcTE4TndQbzZRRWdBeUFPYXlFRElBSWdEbW9oQWlBZElRNERRQ0FDSUFNZ0JFRXNhaEFkSWhWQmlIOUxCRUFnRlNFSkRBWUxJQU5CQTJzaU5TQVZTUTBFSUFKQkEyb2hHMEZzSVFrQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFS0FJc0RnTUNBUUFWQ3lBVlFmLy9CMHNORXlBVlFRTkpEUklnQlNrRHlPa0JJVDhDUUFKQUlCc3RBQUFpQ1VFRGNTSWFRUUZyRGdNR0FRQUhDeUFGS0FLQTZnRU5BRUZpSVFrTUZRc2dGVUVGU1EwU0lCc29BQUFoQXdKL0FrQUNRQUpBSUFsQkFuWkJBM0VpQ1VFQ2F3NENBUUlBQ3lBSlFRQkhJUWNnQTBFRWRrSC9CM0VoQzBFRElRWWdBMEVPZGtIL0IzRU1BZ3RCQkNFR0lBTkJCSFpCLy84QWNTRUxRUUVoQnlBRFFSSjJEQUVMSUFOQkJIWkIvLzhQY1NJTFFZQ0FDRXNORTBFQklRZEJCU0VHSUFJdEFBZEJDblFnQTBFV2RuSUxJZ2dnQm1vaUNTQVZTdzBTQWtBZ0MwR0JCa2tOQUNBRktBS2M2d0ZGRFFCQkFDRURBMEFnQTBHRGdBRkxEUUVnQTBGQWF5RUREQUFMQUFzZ0JpQWJhaUVQSUJwQkEwY05CaUFGS0FJTUlnSXRBQUZCQ0hRaEF5QUhEUWNnQTBVTkNDQUVRZkFBYWlBUElBZ1FEU0lEUVloL1N3MEpJQUpCQkdvaEJpQUxJQnhxSWhKQkEyc2hDa0VBSUFJdkFRSnJRUjl4SVFjZ0hDRURBMEFnQkVId0FHb1FEMFVnQXlBS1NYRUVRQ0FESUFZZ0JDZ0NjQ0lJSUFRb0FuUWlEM1FnQjNaQkFuUnFJZ0l2QVFBN0FBQWdBeUFDTFFBRGFpSURJQVlnQ0NBUElBSXRBQUpxSWdoMElBZDJRUUowYWlJQ0x3RUFPd0FBSUFRZ0NDQUNMUUFDYWpZQ2RDQURJQUl0QUFOcUlRTU1BUVVnRWtFQ2F5RUlBMEFnQkVId0FHb1FEeUVQSUFRb0FuQWhDaUFFS0FKMElRSWdBeUFJU3lBUGNrVUVRQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lDaThCQURzQUFDQUVJQUlnQ2kwQUFtbzJBblFnQXlBS0xRQURhaUVEREFFTEN3TkFJQU1nQ0UwRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUR5OEJBRHNBQUNBRElBOHRBQU5xSVFNZ0FpQVBMUUFDYWlFQ0RBRUxDd0pBSUFNZ0VrOE5BQ0FESUFZZ0NpQUNkQ0FIZGtFQ2RHb2lBeTBBQURvQUFDQURMUUFEUVFGR0JFQWdBaUFETFFBQ2FpRUNEQUVMSUFKQkgwc05BRUVnSUFJZ0F5MEFBbW9pQWlBQ1FTQlBHeUVDQzBGc1FXd2dDeUFFS0FKNElBUW9BbnhIR3lBQ1FTQkhHeUVEREFzTEFBc0FDeUFFS0FJMElnSWdKU0FPYTBzTkNpQU9SUVJBUVFBaENTQUNEUUlNRGdzZ0RpQWJMUUFBSUFJUUF4b2dBaUVKREF3TElCVWdKU0FPYTBzTkNTQU9EUUZCQUNFSklCVkZEUXdMUWJaL0lRa01FUXNnRGlBYklCVVFBaG9nRlNFSkRBb0xJQndnR3dKL0FrQUNRQUpBSUFsQkFuWkJBM0ZCQVdzT0F3RUFBZ0FMSUFsQkEzWWhBMEVCREFJTElCc3ZBQUJCQkhZaEEwRUNEQUVMSUJWQkJFa05EaUFDTHdBRElBSXRBQVZCRUhSeUlnSkJqNENBQVVzTkRpQUNRUVIySVFOQkF3c2lBbW90QUFBZ0EwRWdhaEFESVFrZ0JTQUROZ0tBNndFZ0JTQUpOZ0x3NmdFZ0FrRUJhaUVKREFVTElCVUNmd0pBQWtBQ1FDQUpRUUoyUVFOeFFRRnJEZ01CQUFJQUN5QUpRUU4ySVFOQkFRd0NDeUFiTHdBQVFRUjJJUU5CQWd3QkN5QUNMd0FESUFJdEFBVkJFSFJ5UVFSMklRTkJBd3NpQWlBRGFpSUpRU0JxU1FSQUlBa2dGVXNORFNBY0lBSWdHMm9nQXhBQ0lRSWdCU0FETmdLQTZ3RWdCU0FDTmdMdzZnRWdBaUFEYWlJQ1FnQTNBQmdnQWtJQU53QVFJQUpDQURjQUNDQUNRZ0EzQUFBTUJRc2dCU0FETmdLQTZ3RWdCU0FDSUJ0cU5nTHc2Z0VNQkFzZ0IwVUVRQ0FlSUE4Z0NDQVVFQlFpQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZTRUREQU1MSUF0RklBaEZjZzBMSUF0QkNIWWlBeUFJSUF0SkJIOGdDRUVFZENBTGJnVkJEd3RCR0d3aUFrR01DR29vQWdCc0lBSkJpQWhxS0FJQWFpSUdRUU4ySUFacUlBSkJnQWhxS0FJQUlBSkJoQWhxS0FJQUlBTnNha2tFUUNNQVFSQnJJaEFrQUNBZUtBSUFJUU1nRkVId0JHcEJBRUhzQUJBRElRWkJWQ0VDQWtBZ0EwSC9BWEVpREVFTVN3MEFBa0FnRkVIY0NXb2dCaUFRUVFocUlCQkJER29nRHlBSUlCUkIzQXRxSWhjUUN5SVNRWWgvU3cwQUlCQW9BZ3dpQmlBTVN3MEJJQlJCcUFWcUlRMGdGRUdrQldvaE5pQWVRUVJxSVJFZ0EwR0FnSUI0Y1NFM0lBWkJBV29pRXlFQ0lBWWhBd05BSUFJaUIwRUJheUVDSUFNaUNrRUJheUVESUJRZ0NrRUNkR29vQXZBRVJRMEFDMEVCSUFjZ0IwRUJUUnNoRmtFQUlRZEJBU0VDQTBBZ0FpQVdSd1JBSUJRZ0FrRUNkQ0lEYWlnQzhBUWhHQ0FESUExcUlBYzJBZ0FnQWtFQmFpRUNJQWNnR0dvaEJ3d0JDd3NnRFNBSE5nSUFRUUFoQWlBUUtBSUlJUU1EUUNBQ0lBTkhCRUFnRFNBQ0lCUnFRZHdKYWkwQUFDSVlRUUowYWlJWklCa29BZ0FpR1VFQmFqWUNBQ0FVSUJsQkFYUnFJaGtnR0RvQTNRVWdHU0FDT2dEY0JTQUNRUUZxSVFJTUFRc0xRUUFoQXlBTlFRQTJBZ0FnRENBR1FYOXphaUVHUVFFaEFnTkFJQUlnRmtjRVFDQVVJQUpCQW5ScUlnMGdBellDQUNBTktBTHdCQ0FDSUFacWRDQURhaUVESUFKQkFXb2hBZ3dCQ3dzZ0RDQVRJQXBySWdaclFRRnFJUW9nQmlFREEwQWdBeUFLU1FSQUlCUWdBMEUwYkdvaERVRUJJUUlEUUNBQ0lCWkhCRUFnRFNBQ1FRSjBJaGhxSUJRZ0dHb29BZ0FnQTNZMkFnQWdBa0VCYWlFQ0RBRUxDeUFEUVFGcUlRTU1BUXNMSUJjZ0ZFRTBFQUloT0NBVVFaQU1haUU1SUJNZ0RHc2hPaUFVUWR3RmFpRVhRUUFoQ2dOQUFrQUNRQ0FISUFwSEJFQkJBU0FNSUJNZ0Z5QUtRUUYwYWlJQ0xRQUJJZzFySWdOckloaDBJUmtnQWkwQUFDRVdJRGdnRFVFQ2RHb2lIeWdDQUNFQ0lBWWdHRTBFUUNBMlFRRWdBeUE2YWlJTklBMUJBVXdiSWlCQkFuUWlKR29vQWdBaERTQTVJQlFnQTBFMGJHcEJOQkFDSVNFZ0RVRUJkQ0VtSUJFZ0FrRUNkR29oSXlBZ1FRRk5EUUlnQTBFUWRFR0FnUHdIY1NBV2NrR0FnSUFJY2lFZ0lDRWdKR29vQWdBaEpFRUFJUUlEUUNBQ0lDUkdEUU1nSXlBQ1FRSjBhaUFnTmdFQUlBSkJBV29oQWd3QUN3QUxJQUlnQWlBWmFpSU5JQUlnRFVzYklRMGdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVEQTBBZ0FpQU5SZzBESUJFZ0FrRUNkR29nQXpZQkFDQUNRUUZxSVFJTUFBc0FDeUFlSUF4QkVIUWdOM0lnREhKQmdBSnlOZ0lBREFNTElBY2dEV3NoSkNBWElDWnFJU1pCQUNFTkEwQWdEU0FrUmcwQlFRRWdHQ0FUSUNZZ0RVRUJkR29pSnkwQUFTSUNheUk3YTNRaVBDQWhJQUpCQW5ScUlpQW9BZ0FpQW1vaFBTQURJRHRxUVJCMFFZQ0EvQWR4SUNjdEFBQkJDSFJ5SUJaeVFZQ0FnQkJ5SVNjRFFDQWpJQUpCQW5ScUlDYzJBUUFnQWtFQmFpSUNJRDFKRFFBTElDQWdJQ2dDQUNBOGFqWUNBQ0FOUVFGcUlRME1BQXNBQ3lBZklCOG9BZ0FnR1dvMkFnQWdDa0VCYWlFS0RBQUxBQXNnRWlFQ0N5QVFRUkJxSkFBZ0FrR0lmMHNnQWlBSVQzSU5EQ0FjSUFzZ0FpQVBhaUFJSUFKcklCNFFGaUVEREFNTElCNGdEeUFJSUJRUUZDSUNRWWgvU3lBQ0lBaFBjZzBMSUJ3Z0N5QUNJQTlxSUFnZ0Ftc2dIaEFYSVFNTUFnc2dBd1JBSUJ3Z0N5QVBJQWdnQWhBV0lRTU1BZ3NnSENBTElBOGdDQ0FDRUJjaEF3d0JDeUFjSUFzZ0R5QUlJQUlRRlNFREN5QURRWWgvU3cwSUlBVWdDellDZ09zQklBVWdIRFlDOE9vQklBVkJBVFlDZ09vQklCcEJBa1lFUUNBRklCNDJBZ3dMSUFzZ0hHb2lBa0lBTndBQUlBSkNBRGNBR0NBQ1FnQTNBQkFnQWtJQU53QUlJQWxCaUg5TERRb0xJQWtnRlVZTkNDQVZJQWxySVFZZ0JTZ0NuT3NCSVFvQ1FDQUpJQnRxSWdNdEFBQWlEMFVFUUVFQklRSkJBQ0VQUWJoL0lRa2dCa0VCUmcwQkRBc0xBbjhnQTBFQmFpQVB3Q0lDUVFCT0RRQWFJQUpCZjBZRVFDQUdRUU5JRFFzZ0F5OEFBVUdBL2dGcUlROGdBMEVEYWd3QkN5QUdRUUpJRFFvZ0F5MEFBU0FQUVFoMGNrR0FnQUpySVE4Z0EwRUNhZ3NoRWtHNGZ5RUpJQkpCQVdvaUFpQVZJQnRxSWdkTERRb2dMQ0FGSUJJdEFBQWlFa0VHZGtFalFRa2dBaUFISUFKclFjQVFRZEFSUWZBU0lBVW9Bb1RxQVNBS0lBOGdGQkFoSWdsQmlIOUxEUWdnS3lBb0lCSkJCSFpCQTNGQkgwRUlJQUlnQ1dvaUFpQUhJQUpyUVlBTFFZQU1RWUFYSUFVb0FvVHFBU0FGS0FLYzZ3RWdEeUFVRUNFaUNFR0lmMHNOQ0VGc0lRa2dLaUF0SUJKQkFuWkJBM0ZCTkVFSklBSWdDR29pQWlBSElBSnJRWUFOUWVBT1FaQVpJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQjBHSWYwc05DaUFDSUFkcUlBTnJJZ0loQ1NBQ1FZaC9TdzBLQ3lBT0lBOUJBRXh5RFFFTFFicC9JUWtNQ0FzZ0pTQU9heUVKSUFZZ0Ftc2hCaUFDSUFOcUlRY0NRQUpBQWtBZ0NrVUVRQ0FQUVFsSUlBVXBBOGpwQVVLQmdJQUlWSElOQWlBb0tBSUFJZ0pCQ0dvaEVpQUNLQUlFSVFwQkFDRURRUUFoQWdOQUlBTWdDblpGQkVBZ0FpQVNJQU5CQTNScUxRQUNRUlpMYWlFQ0lBTkJBV29oQXd3QkN3c2dCVUVBTmdLYzZ3RWdBa0VJSUFwcmRFRVVUdzBCREFNTElBVkJBRFlDbk9zQkN5QUVJQVVvQXZEcUFTSUROZ0xjQVNBSklBNXFJUllnQXlBRktBS0E2d0ZxSVJjQ1FDQVBSUVJBSUE0aEJ3d0JDeUFGS0FLNDZRRWhHaUFGS0FLMDZRRWhHQ0FGS0FLdzZRRWhFaUFGUVFFMkFvVHFBVUVBSVFNRFFDQURRUU5IQkVBZ0JDQURRUUowSWdKcUlBSWdCV3BCck5BQmFpZ0NBRFlDWkNBRFFRRnFJUU1NQVFzTFFXd2hDU0FFUVRocUlnSWdCeUFHRUExQmlIOUxEUU5CQ0NBUElBOUJDRTRiSVI4Z05DQUNJQVVvQWdBUUhpQXpJQUlnQlNnQ0NCQWVJRElnQWlBRktBSUVFQjRnRGlBU2F5RVpRUUFoQ0FOQUlBUkJPR29RRDBFRFJpQUlJQjlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ2RCRUhZaUVVSC9BWEVoQ3lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklneEJFSFlpSVVIL0FYRWhFQ0FFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRWWdRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ2tIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSUtheUlOSUFJZ0FpQU5TeHNpRXlBS2FqWUNQQ0FHSUFRb0FqZ2dDblJCQUNBVGEzWWdBaUFUYXlJVGRHb2hDaUFFUVRocUVBOGFJQUlnRFUwTkFTQUVJQVFvQWp3aUFpQVRhallDUENBRUtBSTRJQUowUVFBZ0UydDJJQXBxSVFvTUFRc2dCQ0FDSUFRb0Fqd2lEV28yQWp3Z0JDZ0NPQ0FOZEVFQUlBcHJkaUFHYWlFS0lBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlBbzJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FEQkVBZ0JDZ0NaQ0VLREFNTElBUW9BbWdoQ2d3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBWWdBMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ1pGSUFacUlRb2dBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUFvMkFtUUxweUVDSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lCQnFOZ0k4SUFRb0FqZ2dCblJCQUNBaGEzWWdBbW9oQWdzZ0N5QVFha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUdJQXRxTmdJOElBUW9BamdnQm5SQkFDQVJhM1lnQTJvaEF3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUJrRUFJQWRCR0hZaUN5QUVLQUk4YWlJUWEzWWdDMEVDZEVHZ0hXb29BZ0J4SUFkQi8vOERjV28yQWt3Z0JDQVFJQXhCR0hZaUIyb2lDellDUENBRUlBZEJBblJCb0IxcUtBSUFJQVpCQUNBTGEzWnhJQXhCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnWkJHSFlpQnlBRUtBSThhaUlMTmdJOElBUWdCMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQXRyZG5FZ0JrSC8vd054YWpZQ1ZDQUVRZkFBYWlBSVFReHNhaUlHSUFvMkFnZ2dCaUFDTmdJRUlBWWdBellDQUNBSVFRRnFJUWdnQXlBWmFpQUNhaUVaREFFTEN5QUlJQjlJRFFNZ0ZrRWdheUVoSUE0aEJ3TkFJQVJCT0dvUUQwRURSaUFJSUE5T2NrVUVRQ0FFS0FKUUlBUW9Ba3hCQTNScUtRSUFJa0NuSWdaQkVIWWlJMEgvQVhFaENpQUVLQUpnSUFRb0FseEJBM1JxS1FJQUlrR25JZzFCRUhZaUlFSC9BWEVoRXlBRUtBSllJQVFvQWxSQkEzUnFLUUlBSWtKQ0lJaW5JUU1nUVVJZ2lDQkFRaUNJcHlFTEFrQWdRa0lRaUtjaURFSC9BWEVpQWtFQ1R3UkFBa0FnQWtFWlNTQS9Rb0dBZ0JCVWNrVUVRQ0FFUVNBZ0JDZ0NQQ0lNYXlJUklBSWdBaUFSU3hzaUVDQU1hallDUENBRElBUW9BamdnREhSQkFDQVFhM1lnQWlBUWF5SU1kR29oRUNBRVFUaHFFQThhSUFJZ0VVME5BU0FFSUFRb0Fqd2lBaUFNYWpZQ1BDQUVLQUk0SUFKMFFRQWdER3QySUJCcUlSQU1BUXNnQkNBQ0lBUW9BandpRUdvMkFqd2dCQ2dDT0NBUWRFRUFJQXhyZGlBRGFpRVFJQVJCT0dvUUR4b0xJQVFwQW1RaFJDQUVJQkEyQW1RZ0JDQkVOd0pvREFFTEFrQWdBa1VFUUNBTEJFQWdCQ2dDWkNFUURBTUxJQVFvQW1naEVBd0JDeUFFSUFRb0Fqd2lBa0VCYWpZQ1BBSi9JQU1nQzBWcUlBUW9BamdnQW5SQkgzWnFJZ0pCQTBZRVFDQUVLQUprUVFGckRBRUxJQUpCQW5RZ0JHb29BbVFMSWdORklBTnFJUkFnQWtFQlJ3UkFJQVFnQkNnQ2FEWUNiQXNMSUFRZ0JDZ0NaRFlDYUNBRUlCQTJBbVFMcHlFTUlFRkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQk5xTmdJOElBUW9BamdnQW5SQkFDQWdhM1lnREdvaERBc2dDaUFUYWtFVVR3UkFJQVJCT0dvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lDSUFwcU5nSThJQVFvQWpnZ0FuUkJBQ0FqYTNZZ0Myb2hDd3NnQkVFNGFoQVBHaUFFSUFRb0FqZ2lBa0VBSUFaQkdIWWlBeUFFS0FJOGFpSUthM1lnQTBFQ2RFR2dIV29vQWdCeElBWkIvLzhEY1dvMkFrd2dCQ0FLSUExQkdIWWlBMm9pQmpZQ1BDQUVJQU5CQW5SQm9CMXFLQUlBSUFKQkFDQUdhM1p4SUExQi8vOERjV28yQWx3Z0JFRTRhaEFQR2lBRUlFS25JZ0pCR0hZaUF5QUVLQUk4YWlJR05nSThJQVFnQTBFQ2RFR2dIV29vQWdBZ0JDZ0NPRUVBSUFacmRuRWdBa0gvL3dOeGFqWUNWQUpBQWtBQ1FDQUVLQUxjQVNJRElBUkI4QUJxSUFoQkIzRkJER3hxSWhNb0FnQWlFV29pSXlBWFN3MEFJQWNnRXlnQ0JDSU5JQkZxSWdwcUlDRkxEUUFnQ2tFZ2FpQVdJQWRyVFEwQkN5QUVJQk1vQWdnMkFoZ2dCQ0FUS1FJQU53TVFJQWNnRmlBRVFSQnFJQVJCM0FGcUlCY2dFaUFZSUJvUUh5RUtEQUVMSUFjZ0VXb2hBaUFUS0FJSUlRWWdCeUFES1FBQU53QUFJQWNnQXlrQUNEY0FDQUpBSUJGQkVVa05BQ0FISUFNcEFCQTNBQkFnQnlBREtRQVlOd0FZSUJGQkVHdEJFVWdOQUNBRFFSQnFJUU1nQjBFZ2FpRVJBMEFnRVNBREtRQVFOd0FBSUJFZ0F5a0FHRGNBQ0NBUklBTXBBQ0EzQUJBZ0VTQURLUUFvTndBWUlBTkJJR29oQXlBUlFTQnFJaEVnQWtrTkFBc0xJQUlnQm1zaEF5QUVJQ00yQXR3QklBSWdFbXNnQmtrRVFDQUdJQUlnR0d0TERRY2dHaUFhSUFNZ0Vtc2lBMm9pRVNBTmFrOEVRQ0FDSUJFZ0RSQUtHZ3dDQ3lBRElBMXFJUTBnQWlBUlFRQWdBMnNRQ2lBRGF5RUNJQkloQXdzZ0JrRVFUd1JBSUFJZ0F5a0FBRGNBQUNBQ0lBTXBBQWczQUFnZ0RVRVJTQTBCSUFJZ0RXb2hCaUFDUVJCcUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFHU1EwQUN3d0JDd0pBSUFaQkIwMEVRQ0FDSUFNdEFBQTZBQUFnQWlBRExRQUJPZ0FCSUFJZ0F5MEFBam9BQWlBQ0lBTXRBQU02QUFNZ0FpQURJQVpCQW5RaUJrSEFIbW9vQWdCcUlnTW9BQUEyQUFRZ0F5QUdRZUFlYWlnQ0FHc2hBd3dCQ3lBQ0lBTXBBQUEzQUFBTElBMUJDVWtOQUNBQ0lBMXFJUkVnQWtFSWFpSUdJQU5CQ0dvaUEydEJEMHdFUUFOQUlBWWdBeWtBQURjQUFDQURRUWhxSVFNZ0JrRUlhaUlHSUJGSkRRQU1BZ3NBQ3lBR0lBTXBBQUEzQUFBZ0JpQURLUUFJTndBSUlBMUJHVWdOQUNBQ1FSaHFJUUlEUUNBQ0lBTXBBQkEzQUFBZ0FpQURLUUFZTndBSUlBSWdBeWtBSURjQUVDQUNJQU1wQUNnM0FCZ2dBMEVnYWlFRElBSkJJR29pQWlBUlNRMEFDd3NnQ2tHSWYwc0VRQ0FLSVFrTUJnVWdFeUFRTmdJSUlCTWdERFlDQkNBVElBczJBZ0FnQ0VFQmFpRUlJQWNnQ21vaEJ5QUxJQmxxSUF4cUlSa01BZ3NBQ3dzZ0NDQVBTQTBESUFnZ0gyc2hCZ05BQWtBZ0JpQVBUZ1JBUVFBaEF3TkFJQU5CQTBZTkFpQUZJQU5CQW5RaUFtcEJyTkFCYWlBQ0lBUnFLQUprTmdJQUlBTkJBV29oQXd3QUN3QUxBa0FDUUFKQUlBUW9BdHdCSWdNZ0JFSHdBR29nQmtFSGNVRU1iR29pQ0NnQ0FDSU1haUlRSUJkTERRQWdCeUFJS0FJRUlnc2dER29pQ21vZ0lVc05BQ0FLUVNCcUlCWWdCMnRORFFFTElBUWdDQ2dDQ0RZQ0tDQUVJQWdwQWdBM0F5QWdCeUFXSUFSQklHb2dCRUhjQVdvZ0Z5QVNJQmdnR2hBZklRb01BUXNnQnlBTWFpRUNJQWdvQWdnaENDQUhJQU1wQUFBM0FBQWdCeUFES1FBSU53QUlBa0FnREVFUlNRMEFJQWNnQXlrQUVEY0FFQ0FISUFNcEFCZzNBQmdnREVFUWEwRVJTQTBBSUFOQkVHb2hBeUFIUVNCcUlRd0RRQ0FNSUFNcEFCQTNBQUFnRENBREtRQVlOd0FJSUF3Z0F5a0FJRGNBRUNBTUlBTXBBQ2czQUJnZ0EwRWdhaUVESUF4QklHb2lEQ0FDU1EwQUN3c2dBaUFJYXlFRElBUWdFRFlDM0FFZ0FpQVNheUFJU1FSQUlBZ2dBaUFZYTBzTkJ5QWFJQm9nQXlBU2F5SURhaUlNSUF0cVR3UkFJQUlnRENBTEVBb2FEQUlMSUFNZ0Myb2hDeUFDSUF4QkFDQURheEFLSUFOcklRSWdFaUVEQ3lBSVFSQlBCRUFnQWlBREtRQUFOd0FBSUFJZ0F5a0FDRGNBQ0NBTFFSRklEUUVnQWlBTGFpRUlJQUpCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQUlnQXkwQUFEb0FBQ0FDSUFNdEFBRTZBQUVnQWlBRExRQUNPZ0FDSUFJZ0F5MEFBem9BQXlBQ0lBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFJZ0F5a0FBRGNBQUFzZ0MwRUpTUTBBSUFJZ0Myb2hEQ0FDUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnREVrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0MwRVpTQTBBSUFKQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF4SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3R0JTQUdRUUZxSVFZZ0J5QUthaUVIREFJTEFBc0xJQVFvQXR3QklRTUxRYnAvSVFrZ0Z5QURheUlDSUJZZ0IydExEUUlnQndSL0lBY2dBeUFDRUFJZ0Ftb0ZRUUFMSUE1cklRa01BZ3NnQlVFQU5nS2M2d0VMSUFRZ0JTZ0M4T29CSWdNMkF0d0JJQWtnRG1vaERDQURJQVVvQW9EckFXb2hFQUpBSUE5RkJFQWdEaUVHREFFTElBVW9BcmpwQVNFTklBVW9BclRwQVNFVElBVW9BckRwQVNFU0lBVkJBVFlDaE9vQlFRQWhBd05BSUFOQkEwY0VRQ0FFSUFOQkFuUWlBbW9nQWlBRmFrR3MwQUZxS0FJQU5nS2NBU0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRZkFBYWlJQ0lBY2dCaEFOUVloL1N3MEJJREVnQWlBRktBSUFFQjRnTUNBQ0lBVW9BZ2dRSGlBdklBSWdCU2dDQkJBZUlBeEJJR3NoR0NBT0lRWURRQ0FFS0FLSUFTQUVLQUtFQVVFRGRHb3BBZ0FpUUtjaUNrRVFkaUlaUWY4QmNTRUxJQVFvQXBnQklBUW9BcFFCUVFOMGFpa0NBQ0pCcHlJV1FSQjJJaDlCL3dGeElSb2dCQ2dDa0FFZ0JDZ0NqQUZCQTNScUtRSUFJa0pDSUlpbklRY2dRVUlnaUNCQVFpQ0lweUVEQWtBZ1FrSVFpS2NpQ0VIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ2RDSUlheUlSSUFJZ0FpQVJTeHNpRnlBSWFqWUNkQ0FISUFRb0FuQWdDSFJCQUNBWGEzWWdBaUFYYXlJWGRHb2hDQ0FFUWZBQWFoQVBHaUFDSUJGTkRRRWdCQ0FFS0FKMElnSWdGMm8yQW5RZ0JDZ0NjQ0FDZEVFQUlCZHJkaUFJYWlFSURBRUxJQVFnQWlBRUtBSjBJaEZxTmdKMElBUW9BbkFnRVhSQkFDQUlhM1lnQjJvaENDQUVRZkFBYWhBUEdnc2dCQ2tDbkFFaFJDQUVJQWcyQXB3QklBUWdSRGNDb0FFTUFRc0NRQ0FDUlFSQUlBTUVRQ0FFS0FLY0FTRUlEQU1MSUFRb0FxQUJJUWdNQVFzZ0JDQUVLQUowSWdKQkFXbzJBblFDZnlBSElBTkZhaUFFS0FKd0lBSjBRUjkyYWlJQ1FRTkdCRUFnQkNnQ25BRkJBV3NNQVFzZ0FrRUNkQ0FFYWlnQ25BRUxJZ2RGSUFkcUlRZ2dBa0VCUndSQUlBUWdCQ2dDb0FFMkFxUUJDd3NnQkNBRUtBS2NBVFlDb0FFZ0JDQUlOZ0tjQVF1bklRSWdRVUtBZ1B3SGcxQkZCRUFnQkNBRUtBSjBJZ2NnR21vMkFuUWdCQ2dDY0NBSGRFRUFJQjlyZGlBQ2FpRUNDeUFMSUJwcVFSUlBCRUFnQkVId0FHb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDZENJSElBdHFOZ0owSUFRb0FuQWdCM1JCQUNBWmEzWWdBMm9oQXdzZ0JFSHdBR29RRHhvZ0JDQUVLQUp3SWdkQkFDQUtRUmgySWdzZ0JDZ0NkR29pR210MklBdEJBblJCb0IxcUtBSUFjU0FLUWYvL0EzRnFOZ0tFQVNBRUlCb2dGa0VZZGlJS2FpSUxOZ0owSUFRZ0NrRUNkRUdnSFdvb0FnQWdCMEVBSUF0cmRuRWdGa0gvL3dOeGFqWUNsQUVnQkVId0FHb1FEeG9nQkNCQ3B5SUhRUmgySWdvZ0JDZ0NkR29pQ3pZQ2RDQUVJQXBCQW5SQm9CMXFLQUlBSUFRb0FuQkJBQ0FMYTNaeElBZEIvLzhEY1dvMkFvd0JJQVFnQXpZQ09DQUVJQUkyQWp3Z0JDQUlOZ0pBQWtBQ1FBSkFJQVFvQXR3Qklnc2dBMm9pRmlBUVN3MEFJQVlnQWlBRGFpSUthaUFZU3cwQUlBcEJJR29nRENBR2EwME5BUXNnQkNBRVFVQnJLQUlBTmdJSUlBUWdCQ2tET0RjREFDQUdJQXdnQkNBRVFkd0JhaUFRSUJJZ0V5QU5FQjhoQ2d3QkN5QURJQVpxSVFjZ0JpQUxLUUFBTndBQUlBWWdDeWtBQ0RjQUNBSkFJQU5CRVVrTkFDQUdJQXNwQUJBM0FCQWdCaUFMS1FBWU53QVlJQU5CRUd0QkVVZ05BQ0FMUVJCcUlRTWdCa0VnYWlFTEEwQWdDeUFES1FBUU53QUFJQXNnQXlrQUdEY0FDQ0FMSUFNcEFDQTNBQkFnQ3lBREtRQW9Od0FZSUFOQklHb2hBeUFMUVNCcUlnc2dCMGtOQUFzTElBY2dDR3NoQXlBRUlCWTJBdHdCSUFjZ0Vtc2dDRWtFUUNBSUlBY2dFMnRMRFFRZ0RTQU5JQU1nRW1zaUEyb2lDeUFDYWs4RVFDQUhJQXNnQWhBS0dnd0NDeUFISUF0QkFDQURheEFLSUFRZ0FpQURhaUlDTmdJOElBTnJJUWNnRWlFREN5QUlRUkJQQkVBZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNDQUNRUkZJRFFFZ0FpQUhhaUVJSUFkQkVHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUFoSkRRQUxEQUVMQWtBZ0NFRUhUUVJBSUFjZ0F5MEFBRG9BQUNBSElBTXRBQUU2QUFFZ0J5QURMUUFDT2dBQ0lBY2dBeTBBQXpvQUF5QUhJQU1nQ0VFQ2RDSUlRY0FlYWlnQ0FHb2lBeWdBQURZQUJDQURJQWhCNEI1cUtBSUFheUVEREFFTElBY2dBeWtBQURjQUFBc2dBa0VKU1EwQUlBSWdCMm9oQ3lBSFFRaHFJZ2dnQTBFSWFpSURhMEVQVEFSQUEwQWdDQ0FES1FBQU53QUFJQU5CQ0dvaEF5QUlRUWhxSWdnZ0Mwa05BQXdDQ3dBTElBZ2dBeWtBQURjQUFDQUlJQU1wQUFnM0FBZ2dBa0VaU0EwQUlBZEJHR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBdEpEUUFMQ3lBS1FZaC9Td1JBSUFvaENRd0RDeUFHSUFwcUlRWWdCRUh3QUdvUUR5RURJQTlCQVdzaUR3MEFDMEVBSVFJZ0EwRUNTUTBCQTBBZ0FrRURSd1JBSUFVZ0FrRUNkQ0lEYWtHczBBRnFJQU1nQkdvb0Fwd0JOZ0lBSUFKQkFXb2hBZ3dCQ3dzZ0JDZ0MzQUVoQXd0QnVuOGhDU0FRSUFOcklnSWdEQ0FHYTBzTkFDQUdCSDhnQmlBRElBSVFBaUFDYWdWQkFBc2dEbXNoQ1FzZ0NVR0lmMHNOQmdzQ1FDQUZLQUxzNmdGRkRRQWdCU0FGS1FPSTZnRWdDYTE4TndPSTZnRUNRQ0FGS0FMUTZnRWlBaUFKYWlJSVFSOU5CRUFnRGtVTkFTQUNJQ0pxSUE0Z0NSQUNHaUFGS0FMUTZnRWdDV29oQ0F3QkN5QU9JUU1nQWdSQUlBSWdJbW9nQTBFZ0lBSnJFQUlhSUFVb0F0RHFBU0VDSUFWQkFEWUMwT29CSUFVZ0JTa0RrT29CSUFVcEFMRHFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEa09vQklBVWdCU2tEbU9vQklBVXBBTGpxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG1Pb0JJQVVnQlNrRG9Pb0JJQVVwQU1EcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RvT29CSUFVZ0JTa0RxT29CSUFVcEFNanFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEcU9vQklBTWdBbXRCSUdvaEF3c2dDU0FPYWlJQ0lBTkJJR3BQQkVBZ0FrRWdheUVHSUFVcEE2anFBU0UvSUFVcEE2RHFBU0ZBSUFVcEE1anFBU0ZCSUFVcEE1RHFBU0ZDQTBBZ0F5a0FHRUxQMXRPKzBzZXIyVUorSUQ5OFFoK0pRb2VWcjYrWXR0NmJubjkrSVQ4Z0F5a0FFRUxQMXRPKzBzZXIyVUorSUVCOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVBZ0F5a0FDRUxQMXRPKzBzZXIyVUorSUVGOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVFZ0F5a0FBRUxQMXRPKzBzZXIyVUorSUVKOFFoK0pRb2VWcjYrWXR0NmJubjkrSVVJZ0EwRWdhaUlESUFaTkRRQUxJQVVnUHpjRHFPb0JJQVVnUURjRG9Pb0JJQVVnUVRjRG1Pb0JJQVVnUWpjRGtPb0JDeUFDSUFOTkRRRWdJaUFESUFJZ0Eyc2lDQkFDR2dzZ0JTQUlOZ0xRNmdFTElEVWdGV3NoQXlBVklCdHFJUUlnQ1NBT2FpRU9JQVFvQWpCRkRRQUxJQ2twQXdBaVAwSi9VU0EvSUE0Z0hXdXNVWEpGQkVCQmJDRUpEQVlMSUFVb0F1RHBBUVJBUVdvaENTQURRUVJKRFFZZ0JTZ0M2T29CUlFSQUlDSWdCU2dDME9vQmFpRUtBbjRnQlNrRGlPb0JJajlDSUZvRVFDQUZLUU9ZNmdFaVFFSUhpU0FGS1FPUTZnRWlRVUlCaVh3Z0JTa0RvT29CSWtKQ0RJbDhJQVVwQTZqcUFTSkRRaEtKZkNCQlFzL1cwNzdTeDZ2WlFuNUNINGxDaDVXdnI1aTIzcHVlZjM2RlFvZVZyNitZdHQ2Ym5uOStRcDJqdGVxRHNZMksrZ0I5SUVCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZm9WQ2g1V3ZyNWkyM3B1ZWYzNUNuYU8xNm9PeGpZcjZBSDBnUWtMUDF0Tyswc2VyMlVKK1FoK0pRb2VWcjYrWXR0NmJubjkraFVLSGxhK3ZtTGJlbTU1L2ZrS2RvN1hxZzdHTml2b0FmU0JEUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlEQUVMSUFVcEE2RHFBVUxGejlteThlVzY2aWQ4Q3lBL2ZDRS9JQ0loQmdOQUlBb2dCa0VJYWlJSFR3UkFJQVlwQUFCQ3o5YlR2dExIcTlsQ2ZrSWZpVUtIbGErdm1MYmVtNTUvZmlBL2hVSWJpVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTRS9JQWNoQmd3QkN3c0NRQ0FLSUFaQkJHb2lDRWtFUUNBR0lRZ01BUXNnQmpVQUFFS0hsYSt2bUxiZW01NS9maUEvaFVJWGlVTFAxdE8rMHNlcjJVSitRdm56M2ZHWjlwbXJGbndoUHdzRFFDQUlJQXBKQkVBZ0NERUFBRUxGejlteThlVzY2aWQrSUQrRlFndUpRb2VWcjYrWXR0NmJubjkrSVQ4Z0NFRUJhaUVJREFFTEN5QUNLQUFBSUQ5Q0lZZ2dQNFZDejliVHZ0TEhxOWxDZmlJL1FoMklJRCtGUXZuejNmR1o5cG1yRm40aVAwSWdpQ0EvaGFkSERRY0xJQU5CQkdzaEF5QUNRUVJxSVFJTElBNGdIV3NpQ1VHSmYwOE5CQ0FCSUFscklRRWdDU0FkYWlFZFFRRWhQZ3dCQ3d0QnVIOGhCeUFERFFRZ0hTQUFheUVIREFRTFFXd2hDUXdCQzBHNGZ5RUpDMEc0ZnlFSElBbEJka1lnUG5FTkFRc2dDU0VIQ3lnQ0FBMEFJQVZCL09vQmFpZ0NBQ0VCSUFWQitPb0JhaWdDQUNFQUlBVVFHQ0FGS0FLdzZ3RWdBQ0FCRUJNZ0JVRUFOZ0t3NndFZ0JTZ0NwT3NCSWdJRVFBSkFBa0FDUUFKQUlBSW9BZ0FpQXdSQUlBQkZEUUlnQVNBRElBQVJBZ0FNQVFzZ0FFVU5BZ3NnQVNBQ0lBQVJBZ0FNQWdzZ0F4QUdDeUFDRUFZTElBVkJBRFlDcE9zQkN5QUFCRUFnQVNBRklBQVJBZ0FNQVFzZ0JSQUdDeUFFUWVBQmFpUUFJQWNMQzZnVkNRQkJpQWdMRFFFQUFBQUJBQUFBQWdBQUFBSUFRYUFJQzdNR0FRQUFBQUVBQUFBQ0FBQUFBZ0FBQUNZQUFBQ0NBQUFBSVFVQUFFb0FBQUJuQ0FBQUpnQUFBTUFCQUFDQUFBQUFTUVVBQUVvQUFBQytDQUFBS1FBQUFDd0NBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFMd0FBQU1vQ0FBQ0FBQUFBaWdVQUFFb0FBQUNFQ1FBQU5RQUFBSE1EQUFDQUFBQUFuUVVBQUVvQUFBQ2dDUUFBUFFBQUFJRURBQUNBQUFBQTZ3VUFBRXNBQUFBK0NnQUFSQUFBQUo0REFBQ0FBQUFBVFFZQUFFc0FBQUNxQ2dBQVN3QUFBTE1EQUFDQUFBQUF3UVlBQUUwQUFBQWZEUUFBVFFBQUFGTUVBQUNBQUFBQUl3Z0FBRkVBQUFDbUR3QUFWQUFBQUprRUFBQ0FBQUFBU3drQUFGY0FBQUN4RWdBQVdBQUFBTm9FQUFDQUFBQUFid2tBQUYwQUFBQWpGQUFBVkFBQUFFVUZBQUNBQUFBQVZBb0FBR29BQUFDTUZBQUFhZ0FBQUs4RkFBQ0FBQUFBZGdrQUFId0FBQUJPRUFBQWZBQUFBTklDQUFDQUFBQUFZd2NBQUpFQUFBQ1FCd0FBa2dBQUFBQUFBQUFCQUFBQUFRQUFBQVVBQUFBTkFBQUFIUUFBQUQwQUFBQjlBQUFBL1FBQUFQMEJBQUQ5QXdBQS9RY0FBUDBQQUFEOUh3QUEvVDhBQVAxL0FBRDkvd0FBL2Y4QkFQMy9Bd0Q5L3djQS9mOFBBUDMvSHdEOS96OEEvZjkvQVAzLy93RDkvLzhCL2YvL0EvMy8vd2Y5Ly84UC9mLy9ILzMvL3ovOS8vOS9BQUFBQUFFQUFBQUNBQUFBQXdBQUFBUUFBQUFGQUFBQUJnQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBQUFBUkFBQUFFZ0FBQUJNQUFBQVVBQUFBRlFBQUFCWUFBQUFYQUFBQUdBQUFBQmtBQUFBYUFBQUFHd0FBQUJ3QUFBQWRBQUFBSGdBQUFCOEFBQUFEQUFBQUJBQUFBQVVBQUFBR0FBQUFCd0FBQUFnQUFBQUpBQUFBQ2dBQUFBc0FBQUFNQUFBQURRQUFBQTRBQUFBUEFBQUFFQUFBQUJFQUFBQVNBQUFBRXdBQUFCUUFBQUFWQUFBQUZnQUFBQmNBQUFBWUFBQUFHUUFBQUJvQUFBQWJBQUFBSEFBQUFCMEFBQUFlQUFBQUh3QUFBQ0FBQUFBaEFBQUFJZ0FBQUNNQUFBQWxBQUFBSndBQUFDa0FBQUFyQUFBQUx3QUFBRE1BQUFBN0FBQUFRd0FBQUZNQUFBQmpBQUFBZ3dBQUFBTUJBQUFEQWdBQUF3UUFBQU1JQUFBREVBQUFBeUFBQUFOQUFBQURnQUFBQXdBQkFFSGdEd3RSQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQkFBQUFBVUFBQUFIQUFBQUNBQUFBQWtBQUFBS0FBQUFDd0FBQUF3QUFBQU5BQUFBRGdBQUFBOEFBQUFRQUVIRUVBdUxBUUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFTQUFBQUZBQUFBQllBQUFBWUFBQUFIQUFBQUNBQUFBQW9BQUFBTUFBQUFFQUFBQUNBQUFBQUFBRUFBQUFDQUFBQUJBQUFBQWdBQUFBUUFBQUFJQUFBQUVBQUFBQ0FBQUFBQUFFQVFaQVNDK1lFQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQUVBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFCQUFBQUJBQUFBQWdBQUFBQUFBQUFBUUFCQVFZQUFBQUFBQUFFQUFBQUFCQUFBQVFBQUFBQUlBQUFCUUVBQUFBQUFBQUZBd0FBQUFBQUFBVUVBQUFBQUFBQUJRWUFBQUFBQUFBRkJ3QUFBQUFBQUFVSkFBQUFBQUFBQlFvQUFBQUFBQUFGREFBQUFBQUFBQVlPQUFBQUFBQUJCUkFBQUFBQUFBRUZGQUFBQUFBQUFRVVdBQUFBQUFBQ0JSd0FBQUFBQUFNRklBQUFBQUFBQkFVd0FBQUFJQUFHQlVBQUFBQUFBQWNGZ0FBQUFBQUFDQVlBQVFBQUFBQUtCZ0FFQUFBQUFBd0dBQkFBQUNBQUFBUUFBQUFBQUFBQUJBRUFBQUFBQUFBRkFnQUFBQ0FBQUFVRUFBQUFBQUFBQlFVQUFBQWdBQUFGQndBQUFBQUFBQVVJQUFBQUlBQUFCUW9BQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBSUFBQkJSQUFBQUFBQUFFRkVnQUFBQ0FBQVFVV0FBQUFBQUFDQlJnQUFBQWdBQU1GSUFBQUFBQUFBd1VvQUFBQUFBQUdCRUFBQUFBUUFBWUVRQUFBQUNBQUJ3V0FBQUFBQUFBSkJnQUNBQUFBQUFzR0FBZ0FBREFBQUFRQUFBQUFFQUFBQkFFQUFBQWdBQUFGQWdBQUFDQUFBQVVEQUFBQUlBQUFCUVVBQUFBZ0FBQUZCZ0FBQUNBQUFBVUlBQUFBSUFBQUJRa0FBQUFnQUFBRkN3QUFBQ0FBQUFVTUFBQUFBQUFBQmc4QUFBQWdBQUVGRWdBQUFDQUFBUVVVQUFBQUlBQUNCUmdBQUFBZ0FBSUZIQUFBQUNBQUF3VW9BQUFBSUFBRUJUQUFBQUFBQUJBR0FBQUJBQUFBRHdZQWdBQUFBQUFPQmdCQUFBQUFBQTBHQUNBQVFZQVhDNGNDQVFBQkFRVUFBQUFBQUFBRkFBQUFBQUFBQmdROUFBQUFBQUFKQmYwQkFBQUFBQThGL1g4QUFBQUFGUVg5L3g4QUFBQURCUVVBQUFBQUFBY0VmUUFBQUFBQURBWDlEd0FBQUFBU0JmMy9Bd0FBQUJjRi9mOS9BQUFBQlFVZEFBQUFBQUFJQlAwQUFBQUFBQTRGL1Q4QUFBQUFGQVg5L3c4QUFBQUNCUUVBQUFBUUFBY0VmUUFBQUFBQUN3WDlCd0FBQUFBUkJmMy9BUUFBQUJZRi9mOC9BQUFBQkFVTkFBQUFFQUFJQlAwQUFBQUFBQTBGL1I4QUFBQUFFd1g5L3djQUFBQUJCUUVBQUFBUUFBWUVQUUFBQUFBQUNnWDlBd0FBQUFBUUJmMy9BQUFBQUJ3Ri9mLy9Ed0FBR3dYOS8vOEhBQUFhQmYzLy93TUFBQmtGL2YvL0FRQUFHQVg5Ly84QVFaQVpDNFlFQVFBQkFRWUFBQUFBQUFBR0F3QUFBQUFBQUFRRUFBQUFJQUFBQlFVQUFBQUFBQUFGQmdBQUFBQUFBQVVJQUFBQUFBQUFCUWtBQUFBQUFBQUZDd0FBQUFBQUFBWU5BQUFBQUFBQUJoQUFBQUFBQUFBR0V3QUFBQUFBQUFZV0FBQUFBQUFBQmhrQUFBQUFBQUFHSEFBQUFBQUFBQVlmQUFBQUFBQUFCaUlBQUFBQUFBRUdKUUFBQUFBQUFRWXBBQUFBQUFBQ0JpOEFBQUFBQUFNR093QUFBQUFBQkFaVEFBQUFBQUFIQm9NQUFBQUFBQWtHQXdJQUFCQUFBQVFFQUFBQUFBQUFCQVVBQUFBZ0FBQUZCZ0FBQUFBQUFBVUhBQUFBSUFBQUJRa0FBQUFBQUFBRkNnQUFBQUFBQUFZTUFBQUFBQUFBQmc4QUFBQUFBQUFHRWdBQUFBQUFBQVlWQUFBQUFBQUFCaGdBQUFBQUFBQUdHd0FBQUFBQUFBWWVBQUFBQUFBQUJpRUFBQUFBQUFFR0l3QUFBQUFBQVFZbkFBQUFBQUFDQmlzQUFBQUFBQU1HTXdBQUFBQUFCQVpEQUFBQUFBQUZCbU1BQUFBQUFBZ0dBd0VBQUNBQUFBUUVBQUFBTUFBQUJBUUFBQUFRQUFBRUJRQUFBQ0FBQUFVSEFBQUFJQUFBQlFnQUFBQWdBQUFGQ2dBQUFDQUFBQVVMQUFBQUFBQUFCZzRBQUFBQUFBQUdFUUFBQUFBQUFBWVVBQUFBQUFBQUJoY0FBQUFBQUFBR0dnQUFBQUFBQUFZZEFBQUFBQUFBQmlBQUFBQUFBQkFHQXdBQkFBQUFEd1lEZ0FBQUFBQU9CZ05BQUFBQUFBMEdBeUFBQUFBQURBWURFQUFBQUFBTEJnTUlBQUFBQUFvR0F3UUFRYVFkQzlrQkFRQUFBQU1BQUFBSEFBQUFEd0FBQUI4QUFBQS9BQUFBZndBQUFQOEFBQUQvQVFBQS93TUFBUDhIQUFEL0R3QUEveDhBQVA4L0FBRC9md0FBLy84QUFQLy9BUUQvL3dNQS8vOEhBUC8vRHdELy94OEEvLzgvQVAvL2Z3RC8vLzhBLy8vL0FmLy8vd1AvLy84SC8vLy9ELy8vL3gvLy8vOC8vLy8vZndBQUFBQUJBQUFBQWdBQUFBUUFBQUFBQUFBQUFnQUFBQVFBQUFBSUFBQUFBQUFBQUFFQUFBQUNBQUFBQVFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUFnQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QkJnQjhMQTRBUkFRPT0iO3ZhciB3ZT1uZXcgX0EsbWU9ITE7YXN5bmMgZnVuY3Rpb24gZHIoQSx0LGUpe2xldCBJPW51bGw7dHlwZW9mIEEhPSJzdHJpbmciP0k9QS5ocmVmOkEuc3RhcnRzV2l0aCgiaHR0cCIpP0k9QTpJPWAke3R9LyR7QX1gLEkuZW5kc1dpdGgoIi5qcyIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTMpKSxJLmVuZHNXaXRoKCIud2FzbSIpJiYoST1JLnN1YnN0cmluZygwLEkubGVuZ3RoLTUpKSxJLmVuZHNXaXRoKCIud2FzbS56c3QiKSYmKEk9SS5zdWJzdHJpbmcoMCxJLmxlbmd0aC05KSk7bGV0IHI9YCR7SX0ud2FzbWAsbz1hd2FpdCBXQS5nZXQoYCR7cn0uenN0YCx7cmVzcG9uc2VUeXBlOiJhcnJheWJ1ZmZlciIscGFyYW1zOmV9KTttZXx8KGF3YWl0IHdlLmluaXQoKSxtZT0hMCk7bGV0IHM9d2UuZGVjb2RlKG5ldyBVaW50OEFycmF5KG8uZGF0YSkpLmJ1ZmZlcjtyZXR1cm4oYXdhaXQgaW1wb3J0KGAke0l9LmpzYCkpLmRlZmF1bHQoe3dhc21CaW5hcnk6c30pfXZhciBwZT1kcjt2YXIgWkE9bmV3IE1hcDthc3luYyBmdW5jdGlvbiBEcihBLHQsZSl7bGV0IEk9QSxyPUEsbz1udWxsO3JldHVybiB0eXBlb2YgQSE9InN0cmluZyImJihJPW5ldyBVUkwoQS5ocmVmKSxyPUkuaHJlZiksWkEuaGFzKHIpP289YXdhaXQgWkEuZ2V0KHIpOihaQS5zZXQocixwZShJLHQsZSkpLG89YXdhaXQgWkEuZ2V0KHIpKSxvfXZhciBTZT1Ecjt2YXIgaHI9e1RleHRGaWxlOiJUZXh0RmlsZSIsQmluYXJ5RmlsZToiQmluYXJ5RmlsZSIsVGV4dFN0cmVhbToiVGV4dFN0cmVhbSIsQmluYXJ5U3RyZWFtOiJCaW5hcnlTdHJlYW0iLEltYWdlOiJJbWFnZSIsUG9pbnRTZXQ6IlBvaW50U2V0IixNZXNoOiJNZXNoIixQb2x5RGF0YToiUG9seURhdGEiLFRyYW5zZm9ybUxpc3Q6IlRyYW5zZm9ybUxpc3QiLEpzb25Db21wYXRpYmxlOiJKc29uQ29tcGF0aWJsZSJ9LEQ9aHI7dmFyIHlyPXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0saz15cjt2YXIgd3I9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LFY9d3I7ZnVuY3Rpb24gbXIoQSx0KXtsZXQgZT1udWxsO3N3aXRjaChBKXtjYXNlIGsuVUludDg6e2U9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBrLkludDg6e2U9bmV3IEludDhBcnJheSh0KTticmVha31jYXNlIGsuVUludDE2OntlPW5ldyBVaW50MTZBcnJheSh0KTticmVha31jYXNlIGsuSW50MTY6e2U9bmV3IEludDE2QXJyYXkodCk7YnJlYWt9Y2FzZSBrLlVJbnQzMjp7ZT1uZXcgVWludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBrLkludDMyOntlPW5ldyBJbnQzMkFycmF5KHQpO2JyZWFrfWNhc2Ugay5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP2U9bmV3IEJpZ1VpbnQ2NEFycmF5KHQpOmU9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBrLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP2U9bmV3IEJpZ0ludDY0QXJyYXkodCk6ZT1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIFYuRmxvYXQzMjp7ZT1uZXcgRmxvYXQzMkFycmF5KHQpO2JyZWFrfWNhc2UgVi5GbG9hdDY0OntlPW5ldyBGbG9hdDY0QXJyYXkodCk7YnJlYWt9Y2FzZSJudWxsIjp7ZT1udWxsO2JyZWFrfWNhc2UgbnVsbDp7ZT1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIGV9dmFyIE89bXI7dmFyIE5lPXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLFJlPW5ldyBUZXh0RW5jb2RlcixGZT1uZXcgVGV4dERlY29kZXIoInV0Zi04Iik7ZnVuY3Rpb24gcHIoQSx0KXtsZXQgZT17ZmxhZ3M6InIiLGVuY29kaW5nOiJiaW5hcnkifSxJPUEuZnNfb3Blbih0LGUuZmxhZ3MpLG89QS5mc19zdGF0KHQpLnNpemUsZz1udWxsO05lP2c9bmV3IFNoYXJlZEFycmF5QnVmZmVyKG8pOmc9bmV3IEFycmF5QnVmZmVyKG8pO2xldCBzPW5ldyBVaW50OEFycmF5KGcpO3JldHVybiBBLmZzX3JlYWQoSSxzLDAsbywwKSxBLmZzX2Nsb3NlKEkpLHN9ZnVuY3Rpb24gVWUoQSx0LGUpe2xldCBJPW51bGw7TmU/ST1uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZSk6ST1uZXcgQXJyYXlCdWZmZXIoZSk7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoSSksbz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsdCxlKTtyZXR1cm4gci5zZXQobykscn1mdW5jdGlvbiBwKEEsdCxlLEkpe2xldCByPTA7cmV0dXJuIHQhPT1udWxsJiYocj1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9hcnJheV9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLEksdC5idWZmZXIuYnl0ZUxlbmd0aF0pPj4+MCxBLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpLHIpKSxyfWZ1bmN0aW9uIFAoQSx0LGUpe2xldCBJPUpTT04uc3RyaW5naWZ5KHQpLHI9QS5sZW5ndGhCeXRlc1VURjgoSSkrMSxvPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2pzb25fYWxsb2MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsZSxyXSk+Pj4wO0Euc3RyaW5nVG9VVEY4KEksbyxyKX1mdW5jdGlvbiBSKEEsdCxlLEkpe2xldCByPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsZV0pPj4+MCxvPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsZV0pLGc9VWUoQSxyLG8pO3JldHVybiBPKEksZy5idWZmZXIpfWZ1bmN0aW9uIGhBKEEsdCl7bGV0IGU9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2pzb25fYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiXSxbMCx0XSk+Pj4wLEk9QS5VVEY4VG9TdHJpbmcoZSk7cmV0dXJuIEpTT04ucGFyc2UoSSl9ZnVuY3Rpb24gU3IoQSx0LGUsSSl7SSE9bnVsbCYmSS5sZW5ndGg+MCYmSS5mb3JFYWNoKGZ1bmN0aW9uKEIsaSl7c3dpdGNoKEIudHlwZSl7Y2FzZSBELlRleHRTdHJlYW06e2xldCBhPVJlLmVuY29kZShCLmRhdGEuZGF0YSksbD1wKEEsYSxpLDApLEM9e3NpemU6YS5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gfTtQKEEsQyxpKTticmVha31jYXNlIEQuSnNvbkNvbXBhdGlibGU6e2xldCBhPVJlLmVuY29kZShKU09OLnN0cmluZ2lmeShCLmRhdGEpKSxsPXAoQSxhLGksMCksQz17c2l6ZTphLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWB9O1AoQSxDLGkpO2JyZWFrfWNhc2UgRC5CaW5hcnlTdHJlYW06e2xldCBhPUIuZGF0YS5kYXRhLGw9cChBLGEsaSwwKSxDPXtzaXplOmEuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YH07UChBLEMsaSk7YnJlYWt9Y2FzZSBELlRleHRGaWxlOntBLmZzX3dyaXRlRmlsZShCLmRhdGEucGF0aCxCLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBELkJpbmFyeUZpbGU6e0EuZnNfd3JpdGVGaWxlKEIuZGF0YS5wYXRoLEIuZGF0YS5kYXRhKTticmVha31jYXNlIEQuSW1hZ2U6e2xldCBhPUIuZGF0YSxsPXAoQSxhLmRhdGEsaSwwKSxDPXAoQSxhLmRpcmVjdGlvbixpLDEpLFE9dHlwZW9mIGEubWV0YWRhdGE/LmVudHJpZXM8InUiP0FycmF5LmZyb20oYS5tZXRhZGF0YS5lbnRyaWVzKCkpOltdLGY9e2ltYWdlVHlwZTphLmltYWdlVHlwZSxuYW1lOmEubmFtZSxvcmlnaW46YS5vcmlnaW4sc3BhY2luZzphLnNwYWNpbmcsZGlyZWN0aW9uOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Q31gLHNpemU6YS5zaXplLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAsbWV0YWRhdGE6UX07UChBLGYsaSk7YnJlYWt9Y2FzZSBELk1lc2g6e2xldCBhPUIuZGF0YSxsPXAoQSxhLnBvaW50cyxpLDApLEM9cChBLGEuY2VsbHMsaSwxKSxRPXAoQSxhLnBvaW50RGF0YSxpLDIpLGY9cChBLGEuY2VsbERhdGEsaSwzKSxFPXttZXNoVHlwZTphLm1lc2hUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLG51bWJlck9mQ2VsbHM6YS5udW1iZXJPZkNlbGxzLGNlbGxzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Q31gLGNlbGxCdWZmZXJTaXplOmEuY2VsbEJ1ZmZlclNpemUsbnVtYmVyT2ZQb2ludFBpeGVsczphLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7UX1gLG51bWJlck9mQ2VsbFBpeGVsczphLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07UChBLEUsaSk7YnJlYWt9Y2FzZSBELlBvaW50U2V0OntsZXQgYT1CLmRhdGEsbD1wKEEsYS5wb2ludHMsaSwwKSxDPXAoQSxhLnBvaW50RGF0YSxpLDEpLFE9e3BvaW50U2V0VHlwZTphLnBvaW50U2V0VHlwZSxuYW1lOmEubmFtZSxudW1iZXJPZlBvaW50czphLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtDfWB9O1AoQSxRLGkpO2JyZWFrfWNhc2UgRC5UcmFuc2Zvcm1MaXN0OntsZXQgYT1CLmRhdGEsbD1bXSxDPTA7YS5mb3JFYWNoKFE9PntsZXQgZj0iIixFPSIiO1EudHJhbnNmb3JtVHlwZS50cmFuc2Zvcm1QYXJhbWV0ZXJpemF0aW9uIT09IkNvbXBvc2l0ZSImJihmPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7cChBLFEuZml4ZWRQYXJhbWV0ZXJzLGksQyl9YCxDKz0xLEU9YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtwKEEsUS5wYXJhbWV0ZXJzLGksQyl9YCxDKz0xKTtsZXQgZD17dHJhbnNmb3JtVHlwZTpRLnRyYW5zZm9ybVR5cGUsbnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM6US5udW1iZXJPZkZpeGVkUGFyYW1ldGVycyxudW1iZXJPZlBhcmFtZXRlcnM6US5udW1iZXJPZlBhcmFtZXRlcnMsbmFtZTpRLm5hbWUsaW5wdXRTcGFjZU5hbWU6US5pbnB1dFNwYWNlTmFtZSxvdXRwdXRTcGFjZU5hbWU6US5vdXRwdXRTcGFjZU5hbWUscGFyYW1ldGVyczpFLGZpeGVkUGFyYW1ldGVyczpmfTtsLnB1c2goZCl9KSxQKEEsbCxpKTticmVha31jYXNlIEQuUG9seURhdGE6e2xldCBhPUIuZGF0YSxsPXAoQSxhLnBvaW50cyxpLDApLEM9cChBLGEudmVydGljZXMsaSwxKSxRPXAoQSxhLmxpbmVzLGksMiksZj1wKEEsYS5wb2x5Z29ucyxpLDMpLEU9cChBLGEudHJpYW5nbGVTdHJpcHMsaSw0KSxkPXAoQSxhLnBvaW50RGF0YSxpLDUpLEw9cChBLGEucG9pbnREYXRhLGksNikseT17cG9seURhdGFUeXBlOmEucG9seURhdGFUeXBlLG5hbWU6YS5uYW1lLG51bWJlck9mUG9pbnRzOmEubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLHZlcnRpY2VzQnVmZmVyU2l6ZTphLnZlcnRpY2VzQnVmZmVyU2l6ZSx2ZXJ0aWNlczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0N9YCxsaW5lc0J1ZmZlclNpemU6YS5saW5lc0J1ZmZlclNpemUsbGluZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtRfWAscG9seWdvbnNCdWZmZXJTaXplOmEucG9seWdvbnNCdWZmZXJTaXplLHBvbHlnb25zOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLHRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZTphLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZSx0cmlhbmdsZVN0cmlwczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0V9YCxudW1iZXJPZlBvaW50UGl4ZWxzOmEubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtkfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOmEubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7TH1gfTtQKEEseSxpKTticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBpbnB1dCBJbnRlcmZhY2VUeXBlIil9fSksQS5yZXNldE1vZHVsZVN0ZG91dCgpLEEucmVzZXRNb2R1bGVTdGRlcnIoKTtsZXQgcj1BLnN0YWNrU2F2ZSgpLG89MDt0cnl7bz1BLmNhbGxNYWluKHQuc2xpY2UoKSl9Y2F0Y2goQil7dGhyb3cgdHlwZW9mIEI9PSJudW1iZXIiJiYoY29uc29sZS5sb2coIkV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHBpcGVsaW5lOiIpLGNvbnNvbGUubG9nKCJzdGRvdXQ6IixBLmdldE1vZHVsZVN0ZG91dCgpKSxjb25zb2xlLmVycm9yKCJzdGRlcnI6IixBLmdldE1vZHVsZVN0ZGVycigpKSx0eXBlb2YgQS5nZXRFeGNlcHRpb25NZXNzYWdlPCJ1Ij9jb25zb2xlLmVycm9yKCJleGNlcHRpb246IixBLmdldEV4Y2VwdGlvbk1lc3NhZ2UoQikpOmNvbnNvbGUuZXJyb3IoIkJ1aWxkIG1vZHVsZSBpbiBEZWJ1ZyBtb2RlIGZvciBleGNlcHRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4iKSksQn1maW5hbGx5e0Euc3RhY2tSZXN0b3JlKHIpfWxldCBnPUEuZ2V0TW9kdWxlU3Rkb3V0KCkscz1BLmdldE1vZHVsZVN0ZGVycigpLGM9W107cmV0dXJuIGUhPW51bGwmJmUubGVuZ3RoPjAmJm89PT0wJiZlLmZvckVhY2goZnVuY3Rpb24oQixpKXtsZXQgYT1udWxsO3N3aXRjaChCLnR5cGUpe2Nhc2UgRC5UZXh0U3RyZWFtOntsZXQgQz1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxpLDBdKT4+PjAsUT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxpLDBdKSxmPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixDLFEpO2E9e2RhdGE6RmUuZGVjb2RlKGYpfTticmVha31jYXNlIEQuSnNvbkNvbXBhdGlibGU6e2xldCBDPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGksMF0pPj4+MCxRPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGksMF0pLGY9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLEMsUSk7YT1KU09OLnBhcnNlKEZlLmRlY29kZShmKSk7YnJlYWt9Y2FzZSBELkJpbmFyeVN0cmVhbTp7bGV0IEM9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsaSwwXSk+Pj4wLFE9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsaSwwXSk7YT17ZGF0YTpVZShBLEMsUSl9O2JyZWFrfWNhc2UgRC5UZXh0RmlsZTp7YT17cGF0aDpCLmRhdGEucGF0aCxkYXRhOkEuZnNfcmVhZEZpbGUoQi5kYXRhLnBhdGgse2VuY29kaW5nOiJ1dGY4In0pfTticmVha31jYXNlIEQuQmluYXJ5RmlsZTp7YT17cGF0aDpCLmRhdGEucGF0aCxkYXRhOnByKEEsQi5kYXRhLnBhdGgpfTticmVha31jYXNlIEQuSW1hZ2U6e2xldCBDPWhBKEEsaSk7Qy5kYXRhPVIoQSxpLDAsQy5pbWFnZVR5cGUuY29tcG9uZW50VHlwZSksQy5kaXJlY3Rpb249UihBLGksMSxWLkZsb2F0NjQpLEMubWV0YWRhdGE9bmV3IE1hcChDLm1ldGFkYXRhKSxhPUM7YnJlYWt9Y2FzZSBELk1lc2g6e2xldCBDPWhBKEEsaSk7Qy5udW1iZXJPZlBvaW50cz4wP0MucG9pbnRzPVIoQSxpLDAsQy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUpOkMucG9pbnRzPU8oQy5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mQ2VsbHM+MD9DLmNlbGxzPVIoQSxpLDEsQy5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSk6Qy5jZWxscz1PKEMubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxDLm51bWJlck9mUG9pbnRQaXhlbHM+MD9DLnBvaW50RGF0YT1SKEEsaSwyLEMubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkMucG9pbnREYXRhPU8oQy5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/Qy5jZWxsRGF0YT1SKEEsaSwzLEMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6Qy5jZWxsRGF0YT1PKEMubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGE9QzticmVha31jYXNlIEQuUG9pbnRTZXQ6e2xldCBDPWhBKEEsaSk7Qy5udW1iZXJPZlBvaW50cz4wP0MucG9pbnRzPVIoQSxpLDAsQy5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTpDLnBvaW50cz1PKEMucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEMubnVtYmVyT2ZQb2ludFBpeGVscz4wP0MucG9pbnREYXRhPVIoQSxpLDEsQy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkMucG9pbnREYXRhPU8oQy5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhPUM7YnJlYWt9Y2FzZSBELlRyYW5zZm9ybUxpc3Q6e2xldCBDPWhBKEEsaSksUT0wO0MuZm9yRWFjaCgoZixFKT0+e2YudHJhbnNmb3JtVHlwZS50cmFuc2Zvcm1QYXJhbWV0ZXJpemF0aW9uIT09IkNvbXBvc2l0ZSImJihmLm51bWJlck9mRml4ZWRQYXJhbWV0ZXJzPjAmJihDW0VdLmZpeGVkUGFyYW1ldGVycz1SKEEsaSxRLFYuRmxvYXQ2NCkpLFErPTEsZi5udW1iZXJPZlBhcmFtZXRlcnM+MCYmKENbRV0ucGFyYW1ldGVycz1SKEEsaSxRLGYudHJhbnNmb3JtVHlwZS5wYXJhbWV0ZXJzVmFsdWVUeXBlKSksUSs9MSl9KSxhPUM7YnJlYWt9Y2FzZSBELlBvbHlEYXRhOntsZXQgQz1oQShBLGkpO0MubnVtYmVyT2ZQb2ludHM+MD9DLnBvaW50cz1SKEEsaSwwLFYuRmxvYXQzMik6Qy5wb2ludHM9bmV3IEZsb2F0MzJBcnJheSxDLnZlcnRpY2VzQnVmZmVyU2l6ZT4wP0MudmVydGljZXM9UihBLGksMSxrLlVJbnQzMik6Qy52ZXJ0aWNlcz1uZXcgVWludDMyQXJyYXksQy5saW5lc0J1ZmZlclNpemU+MD9DLmxpbmVzPVIoQSxpLDIsay5VSW50MzIpOkMubGluZXM9bmV3IFVpbnQzMkFycmF5LEMucG9seWdvbnNCdWZmZXJTaXplPjA/Qy5wb2x5Z29ucz1SKEEsaSwzLGsuVUludDMyKTpDLnBvbHlnb25zPW5ldyBVaW50MzJBcnJheSxDLnRyaWFuZ2xlU3RyaXBzQnVmZmVyU2l6ZT4wP0MudHJpYW5nbGVTdHJpcHM9UihBLGksNCxrLlVJbnQzMik6Qy50cmlhbmdsZVN0cmlwcz1uZXcgVWludDMyQXJyYXksQy5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qy5wb2ludERhdGE9UihBLGksNSxDLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qy5wb2ludERhdGE9TyhDLnBvbHlEYXRhVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEMubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/Qy5jZWxsRGF0YT1SKEEsaSw2LEMucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUpOkMuY2VsbERhdGE9TyhDLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksYT1DO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIG91dHB1dCBJbnRlcmZhY2VUeXBlIil9bGV0IGw9e3R5cGU6Qi50eXBlLGRhdGE6YX07Yy5wdXNoKGwpfSkse3JldHVyblZhbHVlOm8sc3Rkb3V0Omcsc3RkZXJyOnMsb3V0cHV0czpjfX12YXIgR2U9U3I7dmFyIFJyPXR5cGVvZiBnbG9iYWxUaGlzLlNoYXJlZEFycmF5QnVmZmVyPCJ1IjtmdW5jdGlvbiBGcihBLHQpe2lmKEE9PW51bGwpcmV0dXJuW107bGV0IGU9W107Zm9yKGxldCBJPTA7STxBLmxlbmd0aDtJKyspe2xldCByPU5yKEFbSV0sdCk7ciE9PW51bGwmJmUucHVzaChyKX1yZXR1cm4gZX1mdW5jdGlvbiBOcihBLHQpe2lmKEE9PW51bGwpcmV0dXJuIG51bGw7bGV0IGU9bnVsbDtyZXR1cm4gQS5idWZmZXIhPT12b2lkIDA/ZT1BLmJ1ZmZlcjpBLmJ5dGVMZW5ndGghPT12b2lkIDAmJihlPUEpLFJyJiZlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXI/bnVsbDp0P2U6ZS5zbGljZSgwKX12YXIga2U9RnI7ZnVuY3Rpb24gVXIoQSl7cmV0dXJuW0EuZGF0YSxBLmRpcmVjdGlvbl19dmFyIExlPVVyO2Z1bmN0aW9uIEdyKEEpe3JldHVybltBLnBvaW50cyxBLnBvaW50RGF0YSxBLmNlbGxzLEEuY2VsbERhdGFdfXZhciBiZT1HcjtmdW5jdGlvbiBrcihBKXtyZXR1cm5bQS5wb2ludHMsQS52ZXJ0aWNlcyxBLmxpbmVzLEEucG9seWdvbnMsQS50cmlhbmdsZVN0cmlwcyxBLnBvaW50RGF0YSxBLmNlbGxEYXRhXX12YXIgSmU9a3I7YXN5bmMgZnVuY3Rpb24gTHIoQSx0LGUsSSl7bGV0IHI9R2UoQSx0LGUsSSksbz1bXTtyZXR1cm4gci5vdXRwdXRzLmZvckVhY2goZnVuY3Rpb24oZyl7aWYoZy50eXBlPT09RC5CaW5hcnlTdHJlYW18fGcudHlwZT09PUQuQmluYXJ5RmlsZSl7bGV0IHM9Zy5kYXRhO28ucHVzaChzKX1lbHNlIGlmKGcudHlwZT09PUQuSW1hZ2Upe2xldCBzPWcuZGF0YTtvLnB1c2goLi4uTGUocykpfWVsc2UgaWYoZy50eXBlPT09RC5NZXNoKXtsZXQgcz1nLmRhdGE7by5wdXNoKC4uLmJlKHMpKX1lbHNlIGlmKGcudHlwZT09PUQuUG9seURhdGEpe2xldCBzPWcuZGF0YTtvLnB1c2goLi4uSmUocykpfX0pLHZBKHIsa2UobywhMCkpfXZhciBIZT1Mcjt2YXIgYnI9e3J1blBpcGVsaW5lOmFzeW5jIGZ1bmN0aW9uKEEsdCxlLEkscixvKXtsZXQgZz1hd2FpdCBTZShBLHQsbyk7cmV0dXJuIGF3YWl0IEhlKGcsZSxJLHIpfX07VUEoYnIpOyUwQS8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246JTBBJTBBY29tbGluay9kaXN0L2VzbS9jb21saW5rLm1qczolMEEgICgqKiUwQSAgICogQGxpY2Vuc2UlMEEgICAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMlMEEgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wJTBBICAgKiklMEEqLyUwQSc7ZUkoSUkpO2V4cG9ydHtjaSBhcyBkb3duc2FtcGxlLHNpIGFzIGRvd25zYW1wbGVCaW5TaHJpbmssQmkgYXMgZG93bnNhbXBsZUxhYmVsSW1hZ2UsRWkgYXMgZG93bnNhbXBsZVNpZ21hLHVpIGFzIGdhdXNzaWFuS2VybmVsUmFkaXVzLHEgYXMgZ2V0RGVmYXVsdFdlYldvcmtlcixiIGFzIGdldFBpcGVsaW5lV29ya2VyVXJsLE8gYXMgZ2V0UGlwZWxpbmVzQmFzZVVybCxwaSBhcyByZXNhbXBsZUJvdW5kaW5nQm94LFZhIGFzIHNldERlZmF1bHRXZWJXb3JrZXIsZUkgYXMgc2V0UGlwZWxpbmVXb3JrZXJVcmwsUGEgYXMgc2V0UGlwZWxpbmVzQmFzZVVybCxJZSBhcyB2ZXJzaW9ufTsKLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjoKCmNvbWxpbmsvZGlzdC9lc20vY29tbGluay5tanM6CiAgKCoqCiAgICogQGxpY2Vuc2UKICAgKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKICAgKikKKi8K""" +default_js_module = """data:text/javascript;base64,dmFyIGNyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZnI9KEEsZSk9Pntmb3IodmFyIHQgaW4gZSljcihBLHQse2dldDplW3RdLGVudW1lcmFibGU6ITB9KX07dmFyIHVyPSIxLjguMSIsUWU9dXI7dmFyIGRyPXtJbnQ4OiJpbnQ4IixVSW50ODoidWludDgiLEludDE2OiJpbnQxNiIsVUludDE2OiJ1aW50MTYiLEludDMyOiJpbnQzMiIsVUludDMyOiJ1aW50MzIiLEludDY0OiJpbnQ2NCIsVUludDY0OiJ1aW50NjQiLFNpemVWYWx1ZVR5cGU6InVpbnQ2NCIsSWRlbnRpZmllclR5cGU6InVpbnQ2NCIsSW5kZXhWYWx1ZVR5cGU6ImludDY0IixPZmZzZXRWYWx1ZVR5cGU6ImludDY0In0sTD1kcjt2YXIgcHI9e0Zsb2F0MzI6ImZsb2F0MzIiLEZsb2F0NjQ6ImZsb2F0NjQiLFNwYWNlUHJlY2lzaW9uVHlwZToiZmxvYXQ2NCJ9LHJBPXByO2Z1bmN0aW9uIGhyKEEsZSl7bGV0IHQ9bnVsbDtzd2l0Y2goQSl7Y2FzZSBMLlVJbnQ4Ont0PW5ldyBVaW50OEFycmF5KGUpO2JyZWFrfWNhc2UgTC5JbnQ4Ont0PW5ldyBJbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSBMLlVJbnQxNjp7dD1uZXcgVWludDE2QXJyYXkoZSk7YnJlYWt9Y2FzZSBMLkludDE2Ont0PW5ldyBJbnQxNkFycmF5KGUpO2JyZWFrfWNhc2UgTC5VSW50MzI6e3Q9bmV3IFVpbnQzMkFycmF5KGUpO2JyZWFrfWNhc2UgTC5JbnQzMjp7dD1uZXcgSW50MzJBcnJheShlKTticmVha31jYXNlIEwuVUludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdVaW50NjRBcnJheT09ImZ1bmN0aW9uIj90PW5ldyBCaWdVaW50NjRBcnJheShlKTp0PW5ldyBVaW50OEFycmF5KGUpO2JyZWFrfWNhc2UgTC5JbnQ2NDp7dHlwZW9mIGdsb2JhbFRoaXMuQmlnSW50NjRBcnJheT09ImZ1bmN0aW9uIj90PW5ldyBCaWdJbnQ2NEFycmF5KGUpOnQ9bmV3IFVpbnQ4QXJyYXkoZSk7YnJlYWt9Y2FzZSByQS5GbG9hdDMyOnt0PW5ldyBGbG9hdDMyQXJyYXkoZSk7YnJlYWt9Y2FzZSByQS5GbG9hdDY0Ont0PW5ldyBGbG9hdDY0QXJyYXkoZSk7YnJlYWt9Y2FzZSJudWxsIjp7dD1udWxsO2JyZWFrfWNhc2UgbnVsbDp7dD1udWxsO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJUeXBlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBUeXBlZEFycmF5Iil9cmV0dXJuIHR9dmFyIFc9aHI7dmFyIHlyPXtUZXh0RmlsZToiVGV4dEZpbGUiLEJpbmFyeUZpbGU6IkJpbmFyeUZpbGUiLFRleHRTdHJlYW06IlRleHRTdHJlYW0iLEJpbmFyeVN0cmVhbToiQmluYXJ5U3RyZWFtIixJbWFnZToiSW1hZ2UiLFBvaW50U2V0OiJQb2ludFNldCIsTWVzaDoiTWVzaCIsUG9seURhdGE6IlBvbHlEYXRhIixUcmFuc2Zvcm1MaXN0OiJUcmFuc2Zvcm1MaXN0IixKc29uQ29tcGF0aWJsZToiSnNvbkNvbXBhdGlibGUifSxwPXlyO3ZhciBJdD1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxEcj1TeW1ib2woIkNvbWxpbmsuZW5kcG9pbnQiKSxjZT1TeW1ib2woIkNvbWxpbmsucmVsZWFzZVByb3h5IiksRWU9U3ltYm9sKCJDb21saW5rLmZpbmFsaXplciIpLFRBPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxpdD1BPT50eXBlb2YgQT09Im9iamVjdCImJkEhPT1udWxsfHx0eXBlb2YgQT09ImZ1bmN0aW9uIix3cj17Y2FuSGFuZGxlOkE9Pml0KEEpJiZBW0l0XSxzZXJpYWxpemUoQSl7bGV0e3BvcnQxOmUscG9ydDI6dH09bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiBndChBLGUpLFt0LFt0XV19LGRlc2VyaWFsaXplKEEpe3JldHVybiBBLnN0YXJ0KCksZmUoQSl9fSxtcj17Y2FuSGFuZGxlOkE9Pml0KEEpJiZUQSBpbiBBLHNlcmlhbGl6ZSh7dmFsdWU6QX0pe2xldCBlO3JldHVybiBBIGluc3RhbmNlb2YgRXJyb3I/ZT17aXNFcnJvcjohMCx2YWx1ZTp7bWVzc2FnZTpBLm1lc3NhZ2UsbmFtZTpBLm5hbWUsc3RhY2s6QS5zdGFja319OmU9e2lzRXJyb3I6ITEsdmFsdWU6QX0sW2UsW11dfSxkZXNlcmlhbGl6ZShBKXt0aHJvdyBBLmlzRXJyb3I/T2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoQS52YWx1ZS5tZXNzYWdlKSxBLnZhbHVlKTpBLnZhbHVlfX0sb3Q9bmV3IE1hcChbWyJwcm94eSIsd3JdLFsidGhyb3ciLG1yXV0pO2Z1bmN0aW9uIFJyKEEsZSl7Zm9yKGxldCB0IG9mIEEpaWYoZT09PXR8fHQ9PT0iKiJ8fHQgaW5zdGFuY2VvZiBSZWdFeHAmJnQudGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBndChBLGU9Z2xvYmFsVGhpcyx0PVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIoSSl7aWYoIUl8fCFJLmRhdGEpcmV0dXJuO2lmKCFScih0LEkub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtJLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDppLHR5cGU6byxwYXRoOmd9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LEkuZGF0YSksUT0oSS5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcChJQSksczt0cnl7bGV0IGE9Zy5zbGljZSgwLC0xKS5yZWR1Y2UoKGwsQik9PmxbQl0sQSksQz1nLnJlZHVjZSgobCxCKT0+bFtCXSxBKTtzd2l0Y2gobyl7Y2FzZSJHRVQiOnM9QzticmVhaztjYXNlIlNFVCI6YVtnLnNsaWNlKC0xKVswXV09SUEoSS5kYXRhLnZhbHVlKSxzPSEwO2JyZWFrO2Nhc2UiQVBQTFkiOnM9Qy5hcHBseShhLFEpO2JyZWFrO2Nhc2UiQ09OU1RSVUNUIjp7bGV0IGw9bmV3IEMoLi4uUSk7cz1VcihsKX1icmVhaztjYXNlIkVORFBPSU5UIjp7bGV0e3BvcnQxOmwscG9ydDI6Qn09bmV3IE1lc3NhZ2VDaGFubmVsO2d0KEEsQikscz11ZShsLFtsXSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpzPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYSl7cz17dmFsdWU6YSxbVEFdOjB9fVByb21pc2UucmVzb2x2ZShzKS5jYXRjaChhPT4oe3ZhbHVlOmEsW1RBXTowfSkpLnRoZW4oYT0+e2xldFtDLGxdPUtBKGEpO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEMpLHtpZDppfSksbCksbz09PSJSRUxFQVNFIiYmKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsciksbnQoZSksRWUgaW4gQSYmdHlwZW9mIEFbRWVdPT0iZnVuY3Rpb24iJiZBW0VlXSgpKX0pLmNhdGNoKGE9PntsZXRbQyxsXT1LQSh7dmFsdWU6bmV3IFR5cGVFcnJvcigiVW5zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlIiksW1RBXTowfSk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sQykse2lkOml9KSxsKX0pfSksZS5zdGFydCYmZS5zdGFydCgpfWZ1bmN0aW9uIFNyKEEpe3JldHVybiBBLmNvbnN0cnVjdG9yLm5hbWU9PT0iTWVzc2FnZVBvcnQifWZ1bmN0aW9uIG50KEEpe1NyKEEpJiZBLmNsb3NlKCl9ZnVuY3Rpb24gZmUoQSxlKXtyZXR1cm4gbGUoQSxbXSxlKX1mdW5jdGlvbiBxQShBKXtpZihBKXRocm93IG5ldyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIil9ZnVuY3Rpb24gYXQoQSl7cmV0dXJuIGdBKEEse3R5cGU6IlJFTEVBU0UifSkudGhlbigoKT0+e250KEEpfSl9dmFyIHhBPW5ldyBXZWFrTWFwLFBBPSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoQT0+e2xldCBlPSh4QS5nZXQoQSl8fDApLTE7eEEuc2V0KEEsZSksZT09PTAmJmF0KEEpfSk7ZnVuY3Rpb24gRnIoQSxlKXtsZXQgdD0oeEEuZ2V0KGUpfHwwKSsxO3hBLnNldChlLHQpLFBBJiZQQS5yZWdpc3RlcihBLGUsQSl9ZnVuY3Rpb24gTnIoQSl7UEEmJlBBLnVucmVnaXN0ZXIoQSl9ZnVuY3Rpb24gbGUoQSxlPVtdLHQ9ZnVuY3Rpb24oKXt9KXtsZXQgcj0hMSxJPW5ldyBQcm94eSh0LHtnZXQoaSxvKXtpZihxQShyKSxvPT09Y2UpcmV0dXJuKCk9PntOcihJKSxhdChBKSxyPSEwfTtpZihvPT09InRoZW4iKXtpZihlLmxlbmd0aD09PTApcmV0dXJue3RoZW46KCk9Pkl9O2xldCBnPWdBKEEse3R5cGU6IkdFVCIscGF0aDplLm1hcChRPT5RLnRvU3RyaW5nKCkpfSkudGhlbihJQSk7cmV0dXJuIGcudGhlbi5iaW5kKGcpfXJldHVybiBsZShBLFsuLi5lLG9dKX0sc2V0KGksbyxnKXtxQShyKTtsZXRbUSxzXT1LQShnKTtyZXR1cm4gZ0EoQSx7dHlwZToiU0VUIixwYXRoOlsuLi5lLG9dLm1hcChhPT5hLnRvU3RyaW5nKCkpLHZhbHVlOlF9LHMpLnRoZW4oSUEpfSxhcHBseShpLG8sZyl7cUEocik7bGV0IFE9ZVtlLmxlbmd0aC0xXTtpZihRPT09RHIpcmV0dXJuIGdBKEEse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4oSUEpO2lmKFE9PT0iYmluZCIpcmV0dXJuIGxlKEEsZS5zbGljZSgwLC0xKSk7bGV0W3MsYV09cnQoZyk7cmV0dXJuIGdBKEEse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKEM9PkMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0OnN9LGEpLnRoZW4oSUEpfSxjb25zdHJ1Y3QoaSxvKXtxQShyKTtsZXRbZyxRXT1ydChvKTtyZXR1cm4gZ0EoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOmUubWFwKHM9PnMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omd9LFEpLnRoZW4oSUEpfX0pO3JldHVybiBGcihJLEEpLEl9ZnVuY3Rpb24ga3IoQSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sQSl9ZnVuY3Rpb24gcnQoQSl7bGV0IGU9QS5tYXAoS0EpO3JldHVybltlLm1hcCh0PT50WzBdKSxrcihlLm1hcCh0PT50WzFdKSldfXZhciBzdD1uZXcgV2Vha01hcDtmdW5jdGlvbiB1ZShBLGUpe3JldHVybiBzdC5zZXQoQSxlKSxBfWZ1bmN0aW9uIFVyKEEpe3JldHVybiBPYmplY3QuYXNzaWduKEEse1tJdF06ITB9KX1mdW5jdGlvbiBLQShBKXtmb3IobGV0W2UsdF1vZiBvdClpZih0LmNhbkhhbmRsZShBKSl7bGV0W3IsSV09dC5zZXJpYWxpemUoQSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmUsdmFsdWU6cn0sSV19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOkF9LHN0LmdldChBKXx8W11dfWZ1bmN0aW9uIElBKEEpe3N3aXRjaChBLnR5cGUpe2Nhc2UiSEFORExFUiI6cmV0dXJuIG90LmdldChBLm5hbWUpLmRlc2VyaWFsaXplKEEudmFsdWUpO2Nhc2UiUkFXIjpyZXR1cm4gQS52YWx1ZX19ZnVuY3Rpb24gZ0EoQSxlLHQpe3JldHVybiBuZXcgUHJvbWlzZShyPT57bGV0IEk9R3IoKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkobyl7IW8uZGF0YXx8IW8uZGF0YS5pZHx8by5kYXRhLmlkIT09SXx8KEEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihvLmRhdGEpKX0pLEEuc3RhcnQmJkEuc3RhcnQoKSxBLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOkl9LGUpLHQpfSl9ZnVuY3Rpb24gR3IoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfWZ1bmN0aW9uIHlBKEEsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEEuYXBwbHkoZSxhcmd1bWVudHMpfX12YXJ7dG9TdHJpbmc6YnJ9PU9iamVjdC5wcm90b3R5cGUse2dldFByb3RvdHlwZU9mOmpBfT1PYmplY3Qse2l0ZXJhdG9yOl9BLHRvU3RyaW5nVGFnOkV0fT1TeW1ib2wsdkE9KEE9PmU9PntsZXQgdD1ici5jYWxsKGUpO3JldHVybiBBW3RdfHwoQVt0XT10LnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkpfSkoT2JqZWN0LmNyZWF0ZShudWxsKSksVD1BPT4oQT1BLnRvTG93ZXJDYXNlKCksZT0+dkEoZSk9PT1BKSxaQT1BPT5lPT50eXBlb2YgZT09PUEse2lzQXJyYXk6YUF9PUFycmF5LG5BPVpBKCJ1bmRlZmluZWQiKTtmdW5jdGlvbiBEQShBKXtyZXR1cm4gQSE9PW51bGwmJiFuQShBKSYmQS5jb25zdHJ1Y3RvciE9PW51bGwmJiFuQShBLmNvbnN0cnVjdG9yKSYmSihBLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSYmQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihBKX12YXIgbHQ9VCgiQXJyYXlCdWZmZXIiKTtmdW5jdGlvbiBMcihBKXtsZXQgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyPCJ1IiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KEEpOmU9QSYmQS5idWZmZXImJmx0KEEuYnVmZmVyKSxlfXZhciBKcj1aQSgic3RyaW5nIiksSj1aQSgiZnVuY3Rpb24iKSxjdD1aQSgibnVtYmVyIiksd0E9QT0+QSE9PW51bGwmJnR5cGVvZiBBPT0ib2JqZWN0IixPcj1BPT5BPT09ITB8fEE9PT0hMSxXQT1BPT57aWYodkEoQSkhPT0ib2JqZWN0IilyZXR1cm4hMTtsZXQgZT1qQShBKTtyZXR1cm4oZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1udWxsKSYmIShFdCBpbiBBKSYmIShfQSBpbiBBKX0sSHI9QT0+e2lmKCF3QShBKXx8REEoQSkpcmV0dXJuITE7dHJ5e3JldHVybiBPYmplY3Qua2V5cyhBKS5sZW5ndGg9PT0wJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoQSk9PT1PYmplY3QucHJvdG90eXBlfWNhdGNoe3JldHVybiExfX0sTXI9VCgiRGF0ZSIpLFlyPVQoIkZpbGUiKSxxcj1BPT4hIShBJiZ0eXBlb2YgQS51cmk8InUiKSxUcj1BPT5BJiZ0eXBlb2YgQS5nZXRQYXJ0czwidSIseHI9VCgiQmxvYiIpLFByPVQoIkZpbGVMaXN0IiksS3I9QT0+d0EoQSkmJkooQS5waXBlKTtmdW5jdGlvbiBXcigpe3JldHVybiB0eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnt9fXZhciBCdD1XcigpLFF0PXR5cGVvZiBCdC5Gb3JtRGF0YTwidSI/QnQuRm9ybURhdGE6dm9pZCAwLGpyPUE9PntpZighQSlyZXR1cm4hMTtpZihRdCYmQSBpbnN0YW5jZW9mIFF0KXJldHVybiEwO2xldCBlPWpBKEEpO2lmKCFlfHxlPT09T2JqZWN0LnByb3RvdHlwZXx8IUooQS5hcHBlbmQpKXJldHVybiExO2xldCB0PXZBKEEpO3JldHVybiB0PT09ImZvcm1kYXRhInx8dD09PSJvYmplY3QiJiZKKEEudG9TdHJpbmcpJiZBLnRvU3RyaW5nKCk9PT0iW29iamVjdCBGb3JtRGF0YV0ifSxfcj1UKCJVUkxTZWFyY2hQYXJhbXMiKSxbdnIsWnIsVnIsenJdPVsiUmVhZGFibGVTdHJlYW0iLCJSZXF1ZXN0IiwiUmVzcG9uc2UiLCJIZWFkZXJzIl0ubWFwKFQpLFhyPUE9PkEudHJpbT9BLnRyaW0oKTpBLnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCIiKTtmdW5jdGlvbiBtQShBLGUse2FsbE93bktleXM6dD0hMX09e30pe2lmKEE9PT1udWxsfHx0eXBlb2YgQT4idSIpcmV0dXJuO2xldCByLEk7aWYodHlwZW9mIEEhPSJvYmplY3QiJiYoQT1bQV0pLGFBKEEpKWZvcihyPTAsST1BLmxlbmd0aDtyPEk7cisrKWUuY2FsbChudWxsLEFbcl0scixBKTtlbHNle2lmKERBKEEpKXJldHVybjtsZXQgaT10P09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpOk9iamVjdC5rZXlzKEEpLG89aS5sZW5ndGgsZztmb3Iocj0wO3I8bztyKyspZz1pW3JdLGUuY2FsbChudWxsLEFbZ10sZyxBKX19ZnVuY3Rpb24gZnQoQSxlKXtpZihEQShBKSlyZXR1cm4gbnVsbDtlPWUudG9Mb3dlckNhc2UoKTtsZXQgdD1PYmplY3Qua2V5cyhBKSxyPXQubGVuZ3RoLEk7Zm9yKDtyLS0gPjA7KWlmKEk9dFtyXSxlPT09SS50b0xvd2VyQ2FzZSgpKXJldHVybiBJO3JldHVybiBudWxsfXZhciBpQT10eXBlb2YgZ2xvYmFsVGhpczwidSI/Z2xvYmFsVGhpczp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6Z2xvYmFsLHV0PUE9PiFuQShBKSYmQSE9PWlBO2Z1bmN0aW9uIGRlKC4uLkEpe2xldHtjYXNlbGVzczplLHNraXBVbmRlZmluZWQ6dH09dXQodGhpcykmJnRoaXN8fHt9LHI9e30sST0oaSxvKT0+e2lmKG89PT0iX19wcm90b19fInx8bz09PSJjb25zdHJ1Y3RvciJ8fG89PT0icHJvdG90eXBlIilyZXR1cm47bGV0IGc9ZSYmZnQocixvKXx8byxRPXBlKHIsZyk/cltnXTp2b2lkIDA7V0EoUSkmJldBKGkpP3JbZ109ZGUoUSxpKTpXQShpKT9yW2ddPWRlKHt9LGkpOmFBKGkpP3JbZ109aS5zbGljZSgpOighdHx8IW5BKGkpKSYmKHJbZ109aSl9O2ZvcihsZXQgaT0wLG89QS5sZW5ndGg7aTxvO2krKylBW2ldJiZtQShBW2ldLEkpO3JldHVybiByfXZhciAkcj0oQSxlLHQse2FsbE93bktleXM6cn09e30pPT4obUEoZSwoSSxpKT0+e3QmJkooSSk/T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsaSx7X19wcm90b19fOm51bGwsdmFsdWU6eUEoSSx0KSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLGkse19fcHJvdG9fXzpudWxsLHZhbHVlOkksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX0se2FsbE93bktleXM6cn0pLEEpLEFJPUE9PihBLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKEE9QS5zbGljZSgxKSksQSksZUk9KEEsZSx0LHIpPT57QS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSxyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQS5wcm90b3R5cGUsImNvbnN0cnVjdG9yIix7X19wcm90b19fOm51bGwsdmFsdWU6QSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJzdXBlciIse19fcHJvdG9fXzpudWxsLHZhbHVlOmUucHJvdG90eXBlfSksdCYmT2JqZWN0LmFzc2lnbihBLnByb3RvdHlwZSx0KX0sdEk9KEEsZSx0LHIpPT57bGV0IEksaSxvLGc9e307aWYoZT1lfHx7fSxBPT1udWxsKXJldHVybiBlO2Rve2ZvcihJPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEEpLGk9SS5sZW5ndGg7aS0tID4wOylvPUlbaV0sKCFyfHxyKG8sQSxlKSkmJiFnW29dJiYoZVtvXT1BW29dLGdbb109ITApO0E9dCE9PSExJiZqQShBKX13aGlsZShBJiYoIXR8fHQoQSxlKSkmJkEhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gZX0sckk9KEEsZSx0KT0+e0E9U3RyaW5nKEEpLCh0PT09dm9pZCAwfHx0PkEubGVuZ3RoKSYmKHQ9QS5sZW5ndGgpLHQtPWUubGVuZ3RoO2xldCByPUEuaW5kZXhPZihlLHQpO3JldHVybiByIT09LTEmJnI9PT10fSxJST1BPT57aWYoIUEpcmV0dXJuIG51bGw7aWYoYUEoQSkpcmV0dXJuIEE7bGV0IGU9QS5sZW5ndGg7aWYoIWN0KGUpKXJldHVybiBudWxsO2xldCB0PW5ldyBBcnJheShlKTtmb3IoO2UtLSA+MDspdFtlXT1BW2VdO3JldHVybiB0fSxpST0oQT0+ZT0+QSYmZSBpbnN0YW5jZW9mIEEpKHR5cGVvZiBVaW50OEFycmF5PCJ1IiYmakEoVWludDhBcnJheSkpLG9JPShBLGUpPT57bGV0IHI9KEEmJkFbX0FdKS5jYWxsKEEpLEk7Zm9yKDsoST1yLm5leHQoKSkmJiFJLmRvbmU7KXtsZXQgaT1JLnZhbHVlO2UuY2FsbChBLGlbMF0saVsxXSl9fSxnST0oQSxlKT0+e2xldCB0LHI9W107Zm9yKDsodD1BLmV4ZWMoZSkpIT09bnVsbDspci5wdXNoKHQpO3JldHVybiByfSxuST1UKCJIVE1MRm9ybUVsZW1lbnQiKSxhST1BPT5BLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXHNdKFthLXpcZF0pKFx3KikvZyxmdW5jdGlvbih0LHIsSSl7cmV0dXJuIHIudG9VcHBlckNhc2UoKStJfSkscGU9KCh7aGFzT3duUHJvcGVydHk6QX0pPT4oZSx0KT0+QS5jYWxsKGUsdCkpKE9iamVjdC5wcm90b3R5cGUpLHNJPVQoIlJlZ0V4cCIpLGR0PShBLGUpPT57bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoQSkscj17fTttQSh0LChJLGkpPT57bGV0IG87KG89ZShJLGksQSkpIT09ITEmJihyW2ldPW98fEkpfSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQSxyKX0sQ0k9QT0+e2R0KEEsKGUsdCk9PntpZihKKEEpJiZbImFyZ3VtZW50cyIsImNhbGxlciIsImNhbGxlZSJdLmluY2x1ZGVzKHQpKXJldHVybiExO2xldCByPUFbdF07aWYoSihyKSl7aWYoZS5lbnVtZXJhYmxlPSExLCJ3cml0YWJsZSJpbiBlKXtlLndyaXRhYmxlPSExO3JldHVybn1lLnNldHx8KGUuc2V0PSgpPT57dGhyb3cgRXJyb3IoIkNhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kICciK3QrIiciKX0pfX0pfSxCST0oQSxlKT0+e2xldCB0PXt9LHI9ST0+e0kuZm9yRWFjaChpPT57dFtpXT0hMH0pfTtyZXR1cm4gYUEoQSk/cihBKTpyKFN0cmluZyhBKS5zcGxpdChlKSksdH0sUUk9KCk9Pnt9LEVJPShBLGUpPT5BIT1udWxsJiZOdW1iZXIuaXNGaW5pdGUoQT0rQSk/QTplO2Z1bmN0aW9uIGxJKEEpe3JldHVybiEhKEEmJkooQS5hcHBlbmQpJiZBW0V0XT09PSJGb3JtRGF0YSImJkFbX0FdKX12YXIgY0k9QT0+e2xldCBlPW5ldyBXZWFrU2V0LHQ9cj0+e2lmKHdBKHIpKXtpZihlLmhhcyhyKSlyZXR1cm47aWYoREEocikpcmV0dXJuIHI7aWYoISgidG9KU09OImluIHIpKXtlLmFkZChyKTtsZXQgST1hQShyKT9bXTp7fTtyZXR1cm4gbUEociwoaSxvKT0+e2xldCBnPXQoaSk7IW5BKGcpJiYoSVtvXT1nKX0pLGUuZGVsZXRlKHIpLEl9fXJldHVybiByfTtyZXR1cm4gdChBKX0sZkk9VCgiQXN5bmNGdW5jdGlvbiIpLHVJPUE9PkEmJih3QShBKXx8SihBKSkmJkooQS50aGVuKSYmSihBLmNhdGNoKSxwdD0oKEEsZSk9PkE/c2V0SW1tZWRpYXRlOmU/KCh0LHIpPT4oaUEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtzb3VyY2U6SSxkYXRhOml9KT0+e0k9PT1pQSYmaT09PXQmJnIubGVuZ3RoJiZyLnNoaWZ0KCkoKX0sITEpLEk9PntyLnB1c2goSSksaUEucG9zdE1lc3NhZ2UodCwiKiIpfSkpKGBheGlvc0Ake01hdGgucmFuZG9tKCl9YCxbXSk6dD0+c2V0VGltZW91dCh0KSkodHlwZW9mIHNldEltbWVkaWF0ZT09ImZ1bmN0aW9uIixKKGlBLnBvc3RNZXNzYWdlKSksZEk9dHlwZW9mIHF1ZXVlTWljcm90YXNrPCJ1Ij9xdWV1ZU1pY3JvdGFzay5iaW5kKGlBKTp0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MubmV4dFRpY2t8fHB0LHBJPUE9PkEhPW51bGwmJkooQVtfQV0pLG49e2lzQXJyYXk6YUEsaXNBcnJheUJ1ZmZlcjpsdCxpc0J1ZmZlcjpEQSxpc0Zvcm1EYXRhOmpyLGlzQXJyYXlCdWZmZXJWaWV3OkxyLGlzU3RyaW5nOkpyLGlzTnVtYmVyOmN0LGlzQm9vbGVhbjpPcixpc09iamVjdDp3QSxpc1BsYWluT2JqZWN0OldBLGlzRW1wdHlPYmplY3Q6SHIsaXNSZWFkYWJsZVN0cmVhbTp2cixpc1JlcXVlc3Q6WnIsaXNSZXNwb25zZTpWcixpc0hlYWRlcnM6enIsaXNVbmRlZmluZWQ6bkEsaXNEYXRlOk1yLGlzRmlsZTpZcixpc1JlYWN0TmF0aXZlQmxvYjpxcixpc1JlYWN0TmF0aXZlOlRyLGlzQmxvYjp4cixpc1JlZ0V4cDpzSSxpc0Z1bmN0aW9uOkosaXNTdHJlYW06S3IsaXNVUkxTZWFyY2hQYXJhbXM6X3IsaXNUeXBlZEFycmF5OmlJLGlzRmlsZUxpc3Q6UHIsZm9yRWFjaDptQSxtZXJnZTpkZSxleHRlbmQ6JHIsdHJpbTpYcixzdHJpcEJPTTpBSSxpbmhlcml0czplSSx0b0ZsYXRPYmplY3Q6dEksa2luZE9mOnZBLGtpbmRPZlRlc3Q6VCxlbmRzV2l0aDpySSx0b0FycmF5OklJLGZvckVhY2hFbnRyeTpvSSxtYXRjaEFsbDpnSSxpc0hUTUxGb3JtOm5JLGhhc093blByb3BlcnR5OnBlLGhhc093blByb3A6cGUscmVkdWNlRGVzY3JpcHRvcnM6ZHQsZnJlZXplTWV0aG9kczpDSSx0b09iamVjdFNldDpCSSx0b0NhbWVsQ2FzZTphSSxub29wOlFJLHRvRmluaXRlTnVtYmVyOkVJLGZpbmRLZXk6ZnQsZ2xvYmFsOmlBLGlzQ29udGV4dERlZmluZWQ6dXQsaXNTcGVjQ29tcGxpYW50Rm9ybTpsSSx0b0pTT05PYmplY3Q6Y0ksaXNBc3luY0ZuOmZJLGlzVGhlbmFibGU6dUksc2V0SW1tZWRpYXRlOnB0LGFzYXA6ZEksaXNJdGVyYWJsZTpwSX07dmFyIGhJPW4udG9PYmplY3RTZXQoWyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSksaHQ9QT0+e2xldCBlPXt9LHQscixJO3JldHVybiBBJiZBLnNwbGl0KGAKYCkuZm9yRWFjaChmdW5jdGlvbihvKXtJPW8uaW5kZXhPZigiOiIpLHQ9by5zdWJzdHJpbmcoMCxJKS50cmltKCkudG9Mb3dlckNhc2UoKSxyPW8uc3Vic3RyaW5nKEkrMSkudHJpbSgpLCEoIXR8fGVbdF0mJmhJW3RdKSYmKHQ9PT0ic2V0LWNvb2tpZSI/ZVt0XT9lW3RdLnB1c2gocik6ZVt0XT1bcl06ZVt0XT1lW3RdP2VbdF0rIiwgIityOnIpfSksZX07ZnVuY3Rpb24geUkoQSl7bGV0IGU9MCx0PUEubGVuZ3RoO2Zvcig7ZTx0Oyl7bGV0IHI9QS5jaGFyQ29kZUF0KGUpO2lmKHIhPT05JiZyIT09MzIpYnJlYWs7ZSs9MX1mb3IoO3Q+ZTspe2xldCByPUEuY2hhckNvZGVBdCh0LTEpO2lmKHIhPT05JiZyIT09MzIpYnJlYWs7dC09MX1yZXR1cm4gZT09PTAmJnQ9PT1BLmxlbmd0aD9BOkEuc2xpY2UoZSx0KX12YXIgREk9bmV3IFJlZ0V4cCgiW1xcdTAwMDAtXFx1MDAwOFxcdTAwMGEtXFx1MDAxZlxcdTAwN2ZdKyIsImciKSx3ST1uZXcgUmVnRXhwKCJbXlxcdTAwMDlcXHUwMDIwLVxcdTAwN2VcXHUwMDgwLVxcdTAwZmZdKyIsImciKTtmdW5jdGlvbiBoZShBLGUpe3JldHVybiBuLmlzQXJyYXkoQSk/QS5tYXAodD0+aGUodCxlKSk6eUkoU3RyaW5nKEEpLnJlcGxhY2UoZSwiIikpfXZhciB5dD1BPT5oZShBLERJKSxtST1BPT5oZShBLHdJKTtmdW5jdGlvbiBWQShBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBuLmZvckVhY2goQS50b0pTT04oKSwodCxyKT0+e2Vbcl09bUkodCl9KSxlfXZhciBEdD1TeW1ib2woImludGVybmFscyIpO2Z1bmN0aW9uIFJBKEEpe3JldHVybiBBJiZTdHJpbmcoQSkudHJpbSgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gekEoQSl7cmV0dXJuIEE9PT0hMXx8QT09bnVsbD9BOm4uaXNBcnJheShBKT9BLm1hcCh6QSk6eXQoU3RyaW5nKEEpKX1mdW5jdGlvbiBSSShBKXtsZXQgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9LyhbXlxzLDs9XSspXHMqKD86PVxzKihbXiw7XSspKT8vZyxyO2Zvcig7cj10LmV4ZWMoQSk7KWVbclsxXV09clsyXTtyZXR1cm4gZX12YXIgU0k9QT0+L15bLV9hLXpBLVowLTleYHx+LCEjJCUmJyorLl0rJC8udGVzdChBLnRyaW0oKSk7ZnVuY3Rpb24geWUoQSxlLHQscixJKXtpZihuLmlzRnVuY3Rpb24ocikpcmV0dXJuIHIuY2FsbCh0aGlzLGUsdCk7aWYoSSYmKGU9dCksISFuLmlzU3RyaW5nKGUpKXtpZihuLmlzU3RyaW5nKHIpKXJldHVybiBlLmluZGV4T2YocikhPT0tMTtpZihuLmlzUmVnRXhwKHIpKXJldHVybiByLnRlc3QoZSl9fWZ1bmN0aW9uIEZJKEEpe3JldHVybiBBLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XGRdKShcdyopL2csKGUsdCxyKT0+dC50b1VwcGVyQ2FzZSgpK3IpfWZ1bmN0aW9uIE5JKEEsZSl7bGV0IHQ9bi50b0NhbWVsQ2FzZSgiICIrZSk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKHI9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxyK3Qse19fcHJvdG9fXzpudWxsLHZhbHVlOmZ1bmN0aW9uKEksaSxvKXtyZXR1cm4gdGhpc1tyXS5jYWxsKHRoaXMsZSxJLGksbyl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyIHNBPWNsYXNze2NvbnN0cnVjdG9yKGUpe2UmJnRoaXMuc2V0KGUpfXNldChlLHQscil7bGV0IEk9dGhpcztmdW5jdGlvbiBpKGcsUSxzKXtsZXQgYT1SQShRKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IEM9bi5maW5kS2V5KEksYSk7KCFDfHxJW0NdPT09dm9pZCAwfHxzPT09ITB8fHM9PT12b2lkIDAmJklbQ10hPT0hMSkmJihJW0N8fFFdPXpBKGcpKX1sZXQgbz0oZyxRKT0+bi5mb3JFYWNoKGcsKHMsYSk9PmkocyxhLFEpKTtpZihuLmlzUGxhaW5PYmplY3QoZSl8fGUgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKW8oZSx0KTtlbHNlIGlmKG4uaXNTdHJpbmcoZSkmJihlPWUudHJpbSgpKSYmIVNJKGUpKW8oaHQoZSksdCk7ZWxzZSBpZihuLmlzT2JqZWN0KGUpJiZuLmlzSXRlcmFibGUoZSkpe2xldCBnPXt9LFEscztmb3IobGV0IGEgb2YgZSl7aWYoIW4uaXNBcnJheShhKSl0aHJvdyBUeXBlRXJyb3IoIk9iamVjdCBpdGVyYXRvciBtdXN0IHJldHVybiBhIGtleS12YWx1ZSBwYWlyIik7Z1tzPWFbMF1dPShRPWdbc10pP24uaXNBcnJheShRKT9bLi4uUSxhWzFdXTpbUSxhWzFdXTphWzFdfW8oZyx0KX1lbHNlIGUhPW51bGwmJmkodCxlLHIpO3JldHVybiB0aGlzfWdldChlLHQpe2lmKGU9UkEoZSksZSl7bGV0IHI9bi5maW5kS2V5KHRoaXMsZSk7aWYocil7bGV0IEk9dGhpc1tyXTtpZighdClyZXR1cm4gSTtpZih0PT09ITApcmV0dXJuIFJJKEkpO2lmKG4uaXNGdW5jdGlvbih0KSlyZXR1cm4gdC5jYWxsKHRoaXMsSSxyKTtpZihuLmlzUmVnRXhwKHQpKXJldHVybiB0LmV4ZWMoSSk7dGhyb3cgbmV3IFR5cGVFcnJvcigicGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24iKX19fWhhcyhlLHQpe2lmKGU9UkEoZSksZSl7bGV0IHI9bi5maW5kS2V5KHRoaXMsZSk7cmV0dXJuISEociYmdGhpc1tyXSE9PXZvaWQgMCYmKCF0fHx5ZSh0aGlzLHRoaXNbcl0scix0KSkpfXJldHVybiExfWRlbGV0ZShlLHQpe2xldCByPXRoaXMsST0hMTtmdW5jdGlvbiBpKG8pe2lmKG89UkEobyksbyl7bGV0IGc9bi5maW5kS2V5KHIsbyk7ZyYmKCF0fHx5ZShyLHJbZ10sZyx0KSkmJihkZWxldGUgcltnXSxJPSEwKX19cmV0dXJuIG4uaXNBcnJheShlKT9lLmZvckVhY2goaSk6aShlKSxJfWNsZWFyKGUpe2xldCB0PU9iamVjdC5rZXlzKHRoaXMpLHI9dC5sZW5ndGgsST0hMTtmb3IoO3ItLTspe2xldCBpPXRbcl07KCFlfHx5ZSh0aGlzLHRoaXNbaV0saSxlLCEwKSkmJihkZWxldGUgdGhpc1tpXSxJPSEwKX1yZXR1cm4gSX1ub3JtYWxpemUoZSl7bGV0IHQ9dGhpcyxyPXt9O3JldHVybiBuLmZvckVhY2godGhpcywoSSxpKT0+e2xldCBvPW4uZmluZEtleShyLGkpO2lmKG8pe3Rbb109ekEoSSksZGVsZXRlIHRbaV07cmV0dXJufWxldCBnPWU/RkkoaSk6U3RyaW5nKGkpLnRyaW0oKTtnIT09aSYmZGVsZXRlIHRbaV0sdFtnXT16QShJKSxyW2ddPSEwfSksdGhpc31jb25jYXQoLi4uZSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4uZSl9dG9KU09OKGUpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIG4uZm9yRWFjaCh0aGlzLChyLEkpPT57ciE9bnVsbCYmciE9PSExJiYodFtJXT1lJiZuLmlzQXJyYXkocik/ci5qb2luKCIsICIpOnIpfSksdH1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbZSx0XSk9PmUrIjogIit0KS5qb2luKGAKYCl9Z2V0U2V0Q29va2llKCl7cmV0dXJuIHRoaXMuZ2V0KCJzZXQtY29va2llIil8fFtdfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIkF4aW9zSGVhZGVycyJ9c3RhdGljIGZyb20oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0aGlzP2U6bmV3IHRoaXMoZSl9c3RhdGljIGNvbmNhdChlLC4uLnQpe2xldCByPW5ldyB0aGlzKGUpO3JldHVybiB0LmZvckVhY2goST0+ci5zZXQoSSkpLHJ9c3RhdGljIGFjY2Vzc29yKGUpe2xldCByPSh0aGlzW0R0XT10aGlzW0R0XT17YWNjZXNzb3JzOnt9fSkuYWNjZXNzb3JzLEk9dGhpcy5wcm90b3R5cGU7ZnVuY3Rpb24gaShvKXtsZXQgZz1SQShvKTtyW2ddfHwoTkkoSSxvKSxyW2ddPSEwKX1yZXR1cm4gbi5pc0FycmF5KGUpP2UuZm9yRWFjaChpKTppKGUpLHRoaXN9fTtzQS5hY2Nlc3NvcihbIkNvbnRlbnQtVHlwZSIsIkNvbnRlbnQtTGVuZ3RoIiwiQWNjZXB0IiwiQWNjZXB0LUVuY29kaW5nIiwiVXNlci1BZ2VudCIsIkF1dGhvcml6YXRpb24iXSk7bi5yZWR1Y2VEZXNjcmlwdG9ycyhzQS5wcm90b3R5cGUsKHt2YWx1ZTpBfSxlKT0+e2xldCB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO3JldHVybntnZXQ6KCk9PkEsc2V0KHIpe3RoaXNbdF09cn19fSk7bi5mcmVlemVNZXRob2RzKHNBKTt2YXIgUj1zQTt2YXIga0k9IltSRURBQ1RFRCAqKioqXSI7ZnVuY3Rpb24gVUkoQSl7aWYobi5oYXNPd25Qcm9wKEEsInRvSlNPTiIpKXJldHVybiEwO2xldCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihBKTtmb3IoO2UmJmUhPT1PYmplY3QucHJvdG90eXBlOyl7aWYobi5oYXNPd25Qcm9wKGUsInRvSlNPTiIpKXJldHVybiEwO2U9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfXJldHVybiExfWZ1bmN0aW9uIEdJKEEsZSl7bGV0IHQ9bmV3IFNldChlLm1hcChpPT5TdHJpbmcoaSkudG9Mb3dlckNhc2UoKSkpLHI9W10sST1pPT57aWYoaT09PW51bGx8fHR5cGVvZiBpIT0ib2JqZWN0Inx8bi5pc0J1ZmZlcihpKSlyZXR1cm4gaTtpZihyLmluZGV4T2YoaSkhPT0tMSlyZXR1cm47aSBpbnN0YW5jZW9mIFImJihpPWkudG9KU09OKCkpLHIucHVzaChpKTtsZXQgbztpZihuLmlzQXJyYXkoaSkpbz1bXSxpLmZvckVhY2goKGcsUSk9PntsZXQgcz1JKGcpO24uaXNVbmRlZmluZWQocyl8fChvW1FdPXMpfSk7ZWxzZXtpZighbi5pc1BsYWluT2JqZWN0KGkpJiZVSShpKSlyZXR1cm4gci5wb3AoKSxpO289T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0W2csUV1vZiBPYmplY3QuZW50cmllcyhpKSl7bGV0IHM9dC5oYXMoZy50b0xvd2VyQ2FzZSgpKT9rSTpJKFEpO24uaXNVbmRlZmluZWQocyl8fChvW2ddPXMpfX1yZXR1cm4gci5wb3AoKSxvfTtyZXR1cm4gSShBKX12YXIgTj1jbGFzcyBBIGV4dGVuZHMgRXJyb3J7c3RhdGljIGZyb20oZSx0LHIsSSxpLG8pe2xldCBnPW5ldyBBKGUubWVzc2FnZSx0fHxlLmNvZGUscixJLGkpO3JldHVybiBnLmNhdXNlPWUsZy5uYW1lPWUubmFtZSxlLnN0YXR1cyE9bnVsbCYmZy5zdGF0dXM9PW51bGwmJihnLnN0YXR1cz1lLnN0YXR1cyksbyYmT2JqZWN0LmFzc2lnbihnLG8pLGd9Y29uc3RydWN0b3IoZSx0LHIsSSxpKXtzdXBlcihlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWVzc2FnZSIse19fcHJvdG9fXzpudWxsLHZhbHVlOmUsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSx0aGlzLm5hbWU9IkF4aW9zRXJyb3IiLHRoaXMuaXNBeGlvc0Vycm9yPSEwLHQmJih0aGlzLmNvZGU9dCksciYmKHRoaXMuY29uZmlnPXIpLEkmJih0aGlzLnJlcXVlc3Q9SSksaSYmKHRoaXMucmVzcG9uc2U9aSx0aGlzLnN0YXR1cz1pLnN0YXR1cyl9dG9KU09OKCl7bGV0IGU9dGhpcy5jb25maWcsdD1lJiZuLmhhc093blByb3AoZSwicmVkYWN0Iik/ZS5yZWRhY3Q6dm9pZCAwLHI9bi5pc0FycmF5KHQpJiZ0Lmxlbmd0aD4wP0dJKGUsdCk6bi50b0pTT05PYmplY3QoZSk7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnIsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMuc3RhdHVzfX19O04uRVJSX0JBRF9PUFRJT05fVkFMVUU9IkVSUl9CQURfT1BUSU9OX1ZBTFVFIjtOLkVSUl9CQURfT1BUSU9OPSJFUlJfQkFEX09QVElPTiI7Ti5FQ09OTkFCT1JURUQ9IkVDT05OQUJPUlRFRCI7Ti5FVElNRURPVVQ9IkVUSU1FRE9VVCI7Ti5FQ09OTlJFRlVTRUQ9IkVDT05OUkVGVVNFRCI7Ti5FUlJfTkVUV09SSz0iRVJSX05FVFdPUksiO04uRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUz0iRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyI7Ti5FUlJfREVQUkVDQVRFRD0iRVJSX0RFUFJFQ0FURUQiO04uRVJSX0JBRF9SRVNQT05TRT0iRVJSX0JBRF9SRVNQT05TRSI7Ti5FUlJfQkFEX1JFUVVFU1Q9IkVSUl9CQURfUkVRVUVTVCI7Ti5FUlJfQ0FOQ0VMRUQ9IkVSUl9DQU5DRUxFRCI7Ti5FUlJfTk9UX1NVUFBPUlQ9IkVSUl9OT1RfU1VQUE9SVCI7Ti5FUlJfSU5WQUxJRF9VUkw9IkVSUl9JTlZBTElEX1VSTCI7Ti5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEPSJFUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEIjt2YXIgZD1OO3ZhciBYQT1udWxsO2Z1bmN0aW9uIHdlKEEpe3JldHVybiBuLmlzUGxhaW5PYmplY3QoQSl8fG4uaXNBcnJheShBKX1mdW5jdGlvbiB3dChBKXtyZXR1cm4gbi5lbmRzV2l0aChBLCJbXSIpP0Euc2xpY2UoMCwtMik6QX1mdW5jdGlvbiBEZShBLGUsdCl7cmV0dXJuIEE/QS5jb25jYXQoZSkubWFwKGZ1bmN0aW9uKEksaSl7cmV0dXJuIEk9d3QoSSksIXQmJmk/IlsiK0krIl0iOkl9KS5qb2luKHQ/Ii4iOiIiKTplfWZ1bmN0aW9uIGJJKEEpe3JldHVybiBuLmlzQXJyYXkoQSkmJiFBLnNvbWUod2UpfXZhciBMST1uLnRvRmxhdE9iamVjdChuLHt9LG51bGwsZnVuY3Rpb24oZSl7cmV0dXJuL15pc1tBLVpdLy50ZXN0KGUpfSk7ZnVuY3Rpb24gSkkoQSxlLHQpe2lmKCFuLmlzT2JqZWN0KEEpKXRocm93IG5ldyBUeXBlRXJyb3IoInRhcmdldCBtdXN0IGJlIGFuIG9iamVjdCIpO2U9ZXx8bmV3KFhBfHxGb3JtRGF0YSksdD1uLnRvRmxhdE9iamVjdCh0LHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsZnVuY3Rpb24oRSx1KXtyZXR1cm4hbi5pc1VuZGVmaW5lZCh1W0VdKX0pO2xldCByPXQubWV0YVRva2VucyxJPXQudmlzaXRvcnx8QyxpPXQuZG90cyxvPXQuaW5kZXhlcyxnPXQuQmxvYnx8dHlwZW9mIEJsb2I8InUiJiZCbG9iLFE9dC5tYXhEZXB0aD09PXZvaWQgMD8xMDA6dC5tYXhEZXB0aCxzPWcmJm4uaXNTcGVjQ29tcGxpYW50Rm9ybShlKTtpZighbi5pc0Z1bmN0aW9uKEkpKXRocm93IG5ldyBUeXBlRXJyb3IoInZpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24gYShjKXtpZihjPT09bnVsbClyZXR1cm4iIjtpZihuLmlzRGF0ZShjKSlyZXR1cm4gYy50b0lTT1N0cmluZygpO2lmKG4uaXNCb29sZWFuKGMpKXJldHVybiBjLnRvU3RyaW5nKCk7aWYoIXMmJm4uaXNCbG9iKGMpKXRocm93IG5ldyBkKCJCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLiIpO3JldHVybiBuLmlzQXJyYXlCdWZmZXIoYyl8fG4uaXNUeXBlZEFycmF5KGMpP3MmJnR5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFtjXSk6QnVmZmVyLmZyb20oYyk6Y31mdW5jdGlvbiBDKGMsRSx1KXtsZXQgRD1jO2lmKG4uaXNSZWFjdE5hdGl2ZShlKSYmbi5pc1JlYWN0TmF0aXZlQmxvYihjKSlyZXR1cm4gZS5hcHBlbmQoRGUodSxFLGkpLGEoYykpLCExO2lmKGMmJiF1JiZ0eXBlb2YgYz09Im9iamVjdCIpe2lmKG4uZW5kc1dpdGgoRSwie30iKSlFPXI/RTpFLnNsaWNlKDAsLTIpLGM9SlNPTi5zdHJpbmdpZnkoYyk7ZWxzZSBpZihuLmlzQXJyYXkoYykmJmJJKGMpfHwobi5pc0ZpbGVMaXN0KGMpfHxuLmVuZHNXaXRoKEUsIltdIikpJiYoRD1uLnRvQXJyYXkoYykpKXJldHVybiBFPXd0KEUpLEQuZm9yRWFjaChmdW5jdGlvbih5LE0peyEobi5pc1VuZGVmaW5lZCh5KXx8eT09PW51bGwpJiZlLmFwcGVuZChvPT09ITA/RGUoW0VdLE0saSk6bz09PW51bGw/RTpFKyJbXSIsYSh5KSl9KSwhMX1yZXR1cm4gd2UoYyk/ITA6KGUuYXBwZW5kKERlKHUsRSxpKSxhKGMpKSwhMSl9bGV0IGw9W10sQj1PYmplY3QuYXNzaWduKExJLHtkZWZhdWx0VmlzaXRvcjpDLGNvbnZlcnRWYWx1ZTphLGlzVmlzaXRhYmxlOndlfSk7ZnVuY3Rpb24gZihjLEUsdT0wKXtpZighbi5pc1VuZGVmaW5lZChjKSl7aWYodT5RKXRocm93IG5ldyBkKCJPYmplY3QgaXMgdG9vIGRlZXBseSBuZXN0ZWQgKCIrdSsiIGxldmVscykuIE1heCBkZXB0aDogIitRLGQuRVJSX0ZPUk1fREFUQV9ERVBUSF9FWENFRURFRCk7aWYobC5pbmRleE9mKGMpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK0Uuam9pbigiLiIpKTtsLnB1c2goYyksbi5mb3JFYWNoKGMsZnVuY3Rpb24oaCx5KXsoIShuLmlzVW5kZWZpbmVkKGgpfHxoPT09bnVsbCkmJkkuY2FsbChlLGgsbi5pc1N0cmluZyh5KT95LnRyaW0oKTp5LEUsQikpPT09ITAmJmYoaCxFP0UuY29uY2F0KHkpOlt5XSx1KzEpfSksbC5wb3AoKX19aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiZGF0YSBtdXN0IGJlIGFuIG9iamVjdCIpO3JldHVybiBmKEEpLGV9dmFyIFg9Skk7ZnVuY3Rpb24gbXQoQSl7bGV0IGU9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shJygpfl18JTIwL2csZnVuY3Rpb24ocil7cmV0dXJuIGVbcl19KX1mdW5jdGlvbiBSdChBLGUpe3RoaXMuX3BhaXJzPVtdLEEmJlgoQSx0aGlzLGUpfXZhciBTdD1SdC5wcm90b3R5cGU7U3QuYXBwZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy5fcGFpcnMucHVzaChbZSx0XSl9O1N0LnRvU3RyaW5nPWZ1bmN0aW9uKGUpe2xldCB0PWU/ZnVuY3Rpb24ocil7cmV0dXJuIGUuY2FsbCh0aGlzLHIsbXQpfTptdDtyZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uKEkpe3JldHVybiB0KElbMF0pKyI9Iit0KElbMV0pfSwiIikuam9pbigiJiIpfTt2YXIgJEE9UnQ7ZnVuY3Rpb24gT0koQSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIil9ZnVuY3Rpb24gU0EoQSxlLHQpe2lmKCFlKXJldHVybiBBO2xldCByPXQmJnQuZW5jb2RlfHxPSSxJPW4uaXNGdW5jdGlvbih0KT97c2VyaWFsaXplOnR9OnQsaT1JJiZJLnNlcmlhbGl6ZSxvO2lmKGk/bz1pKGUsSSk6bz1uLmlzVVJMU2VhcmNoUGFyYW1zKGUpP2UudG9TdHJpbmcoKTpuZXcgJEEoZSxJKS50b1N0cmluZyhyKSxvKXtsZXQgZz1BLmluZGV4T2YoIiMiKTtnIT09LTEmJihBPUEuc2xpY2UoMCxnKSksQSs9KEEuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrb31yZXR1cm4gQX12YXIgbWU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmhhbmRsZXJzPVtdfXVzZShlLHQscil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpyP3Iuc3luY2hyb25vdXM6ITEscnVuV2hlbjpyP3IucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX1lamVjdChlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX1jbGVhcigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX1mb3JFYWNoKGUpe24uZm9yRWFjaCh0aGlzLmhhbmRsZXJzLGZ1bmN0aW9uKHIpe3IhPT1udWxsJiZlKHIpfSl9fSxSZT1tZTt2YXIgQ0E9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITEsbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzohMH07dmFyIEZ0PXR5cGVvZiBVUkxTZWFyY2hQYXJhbXM8InUiP1VSTFNlYXJjaFBhcmFtczokQTt2YXIgTnQ9dHlwZW9mIEZvcm1EYXRhPCJ1Ij9Gb3JtRGF0YTpudWxsO3ZhciBrdD10eXBlb2YgQmxvYjwidSI/QmxvYjpudWxsO3ZhciBVdD17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczpGdCxGb3JtRGF0YTpOdCxCbG9iOmt0fSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX07dmFyIE5lPXt9O2ZyKE5lLHtoYXNCcm93c2VyRW52OigpPT5GZSxoYXNTdGFuZGFyZEJyb3dzZXJFbnY6KCk9PkhJLGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudjooKT0+TUksbmF2aWdhdG9yOigpPT5TZSxvcmlnaW46KCk9PllJfSk7dmFyIEZlPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUiLFNlPXR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3J8fHZvaWQgMCxIST1GZSYmKCFTZXx8WyJSZWFjdE5hdGl2ZSIsIk5hdGl2ZVNjcmlwdCIsIk5TIl0uaW5kZXhPZihTZS5wcm9kdWN0KTwwKSxNST10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGU8InUiJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIsWUk9RmUmJndpbmRvdy5sb2NhdGlvbi5ocmVmfHwiaHR0cDovL2xvY2FsaG9zdCI7dmFyIG09ey4uLk5lLC4uLlV0fTtmdW5jdGlvbiBrZShBLGUpe3JldHVybiBYKEEsbmV3IG0uY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMse3Zpc2l0b3I6ZnVuY3Rpb24odCxyLEksaSl7cmV0dXJuIG0uaXNOb2RlJiZuLmlzQnVmZmVyKHQpPyh0aGlzLmFwcGVuZChyLHQudG9TdHJpbmcoImJhc2U2NCIpKSwhMSk6aS5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LC4uLmV9KX1mdW5jdGlvbiBxSShBKXtyZXR1cm4gbi5tYXRjaEFsbCgvXHcrfFxbKFx3KildL2csQSkubWFwKGU9PmVbMF09PT0iW10iPyIiOmVbMV18fGVbMF0pfWZ1bmN0aW9uIFRJKEEpe2xldCBlPXt9LHQ9T2JqZWN0LmtleXMoQSkscixJPXQubGVuZ3RoLGk7Zm9yKHI9MDtyPEk7cisrKWk9dFtyXSxlW2ldPUFbaV07cmV0dXJuIGV9ZnVuY3Rpb24geEkoQSl7ZnVuY3Rpb24gZSh0LHIsSSxpKXtsZXQgbz10W2krK107aWYobz09PSJfX3Byb3RvX18iKXJldHVybiEwO2xldCBnPU51bWJlci5pc0Zpbml0ZSgrbyksUT1pPj10Lmxlbmd0aDtyZXR1cm4gbz0hbyYmbi5pc0FycmF5KEkpP0kubGVuZ3RoOm8sUT8obi5oYXNPd25Qcm9wKEksbyk/SVtvXT1uLmlzQXJyYXkoSVtvXSk/SVtvXS5jb25jYXQocik6W0lbb10scl06SVtvXT1yLCFnKTooKCFuLmhhc093blByb3AoSSxvKXx8IW4uaXNPYmplY3QoSVtvXSkpJiYoSVtvXT1bXSksZSh0LHIsSVtvXSxpKSYmbi5pc0FycmF5KElbb10pJiYoSVtvXT1USShJW29dKSksIWcpfWlmKG4uaXNGb3JtRGF0YShBKSYmbi5pc0Z1bmN0aW9uKEEuZW50cmllcykpe2xldCB0PXt9O3JldHVybiBuLmZvckVhY2hFbnRyeShBLChyLEkpPT57ZShxSShyKSxJLHQsMCl9KSx0fXJldHVybiBudWxsfXZhciBBZT14STt2YXIgQkE9KEEsZSk9PkEhPW51bGwmJm4uaGFzT3duUHJvcChBLGUpP0FbZV06dm9pZCAwO2Z1bmN0aW9uIFBJKEEsZSx0KXtpZihuLmlzU3RyaW5nKEEpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkoQSksbi50cmltKEEpfWNhdGNoKHIpe2lmKHIubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgcn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKEEpfXZhciBVZT17dHJhbnNpdGlvbmFsOkNBLGFkYXB0ZXI6WyJ4aHIiLCJodHRwIiwiZmV0Y2giXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe2xldCByPXQuZ2V0Q29udGVudFR5cGUoKXx8IiIsST1yLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKT4tMSxpPW4uaXNPYmplY3QoZSk7aWYoaSYmbi5pc0hUTUxGb3JtKGUpJiYoZT1uZXcgRm9ybURhdGEoZSkpLG4uaXNGb3JtRGF0YShlKSlyZXR1cm4gST9KU09OLnN0cmluZ2lmeShBZShlKSk6ZTtpZihuLmlzQXJyYXlCdWZmZXIoZSl8fG4uaXNCdWZmZXIoZSl8fG4uaXNTdHJlYW0oZSl8fG4uaXNGaWxlKGUpfHxuLmlzQmxvYihlKXx8bi5pc1JlYWRhYmxlU3RyZWFtKGUpKXJldHVybiBlO2lmKG4uaXNBcnJheUJ1ZmZlclZpZXcoZSkpcmV0dXJuIGUuYnVmZmVyO2lmKG4uaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIHQuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiwhMSksZS50b1N0cmluZygpO2xldCBnO2lmKGkpe2xldCBRPUJBKHRoaXMsImZvcm1TZXJpYWxpemVyIik7aWYoci5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT4tMSlyZXR1cm4ga2UoZSxRKS50b1N0cmluZygpO2lmKChnPW4uaXNGaWxlTGlzdChlKSl8fHIuaW5kZXhPZigibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpPi0xKXtsZXQgcz1CQSh0aGlzLCJlbnYiKSxhPXMmJnMuRm9ybURhdGE7cmV0dXJuIFgoZz97ImZpbGVzW10iOmV9OmUsYSYmbmV3IGEsUSl9fXJldHVybiBpfHxJPyh0LnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uIiwhMSksUEkoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7bGV0IHQ9QkEodGhpcywidHJhbnNpdGlvbmFsIil8fFVlLnRyYW5zaXRpb25hbCxyPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsST1CQSh0aGlzLCJyZXNwb25zZVR5cGUiKSxpPUk9PT0ianNvbiI7aWYobi5pc1Jlc3BvbnNlKGUpfHxuLmlzUmVhZGFibGVTdHJlYW0oZSkpcmV0dXJuIGU7aWYoZSYmbi5pc1N0cmluZyhlKSYmKHImJiFJfHxpKSl7bGV0IGc9ISh0JiZ0LnNpbGVudEpTT05QYXJzaW5nKSYmaTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSxCQSh0aGlzLCJwYXJzZVJldml2ZXIiKSl9Y2F0Y2goUSl7aWYoZyl0aHJvdyBRLm5hbWU9PT0iU3ludGF4RXJyb3IiP2QuZnJvbShRLGQuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsQkEodGhpcywicmVzcG9uc2UiKSk6UX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSxlbnY6e0Zvcm1EYXRhOm0uY2xhc3Nlcy5Gb3JtRGF0YSxCbG9iOm0uY2xhc3Nlcy5CbG9ifSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIsIkNvbnRlbnQtVHlwZSI6dm9pZCAwfX19O24uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJxdWVyeSJdLEE9PntVZS5oZWFkZXJzW0FdPXt9fSk7dmFyIFFBPVVlO2Z1bmN0aW9uIEZBKEEsZSl7bGV0IHQ9dGhpc3x8UUEscj1lfHx0LEk9Ui5mcm9tKHIuaGVhZGVycyksaT1yLmRhdGE7cmV0dXJuIG4uZm9yRWFjaChBLGZ1bmN0aW9uKGcpe2k9Zy5jYWxsKHQsaSxJLm5vcm1hbGl6ZSgpLGU/ZS5zdGF0dXM6dm9pZCAwKX0pLEkubm9ybWFsaXplKCksaX1mdW5jdGlvbiBOQShBKXtyZXR1cm4hIShBJiZBLl9fQ0FOQ0VMX18pfXZhciBHZT1jbGFzcyBleHRlbmRzIGR7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKGU/PyJjYW5jZWxlZCIsZC5FUlJfQ0FOQ0VMRUQsdCxyKSx0aGlzLm5hbWU9IkNhbmNlbGVkRXJyb3IiLHRoaXMuX19DQU5DRUxfXz0hMH19LGo9R2U7ZnVuY3Rpb24ga0EoQSxlLHQpe2xldCByPXQuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyF0LnN0YXR1c3x8IXJ8fHIodC5zdGF0dXMpP0EodCk6ZShuZXcgZCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Quc3RhdHVzLHQuc3RhdHVzPj00MDAmJnQuc3RhdHVzPDUwMD9kLkVSUl9CQURfUkVRVUVTVDpkLkVSUl9CQURfUkVTUE9OU0UsdC5jb25maWcsdC5yZXF1ZXN0LHQpKX1mdW5jdGlvbiBiZShBKXtsZXQgZT0vXihbLStcd117MSwyNX0pOig/OlwvXC8pPy8uZXhlYyhBKTtyZXR1cm4gZSYmZVsxXXx8IiJ9ZnVuY3Rpb24gS0koQSxlKXtBPUF8fDEwO2xldCB0PW5ldyBBcnJheShBKSxyPW5ldyBBcnJheShBKSxJPTAsaT0wLG87cmV0dXJuIGU9ZSE9PXZvaWQgMD9lOjFlMyxmdW5jdGlvbihRKXtsZXQgcz1EYXRlLm5vdygpLGE9cltpXTtvfHwobz1zKSx0W0ldPVEscltJXT1zO2xldCBDPWksbD0wO2Zvcig7QyE9PUk7KWwrPXRbQysrXSxDPUMlQTtpZihJPShJKzEpJUEsST09PWkmJihpPShpKzEpJUEpLHMtbzxlKXJldHVybjtsZXQgQj1hJiZzLWE7cmV0dXJuIEI/TWF0aC5yb3VuZChsKjFlMy9CKTp2b2lkIDB9fXZhciBHdD1LSTtmdW5jdGlvbiBXSShBLGUpe2xldCB0PTAscj0xZTMvZSxJLGksbz0ocyxhPURhdGUubm93KCkpPT57dD1hLEk9bnVsbCxpJiYoY2xlYXJUaW1lb3V0KGkpLGk9bnVsbCksQSguLi5zKX07cmV0dXJuWyguLi5zKT0+e2xldCBhPURhdGUubm93KCksQz1hLXQ7Qz49cj9vKHMsYSk6KEk9cyxpfHwoaT1zZXRUaW1lb3V0KCgpPT57aT1udWxsLG8oSSl9LHItQykpKX0sKCk9PkkmJm8oSSldfXZhciBidD1XSTt2YXIgRUE9KEEsZSx0PTMpPT57bGV0IHI9MCxJPUd0KDUwLDI1MCk7cmV0dXJuIGJ0KGk9PntpZighaXx8dHlwZW9mIGkubG9hZGVkIT0ibnVtYmVyIilyZXR1cm47bGV0IG89aS5sb2FkZWQsZz1pLmxlbmd0aENvbXB1dGFibGU/aS50b3RhbDp2b2lkIDAsUT1nIT1udWxsP01hdGgubWluKG8sZyk6byxzPU1hdGgubWF4KDAsUS1yKSxhPUkocyk7cj1NYXRoLm1heChyLFEpO2xldCBDPXtsb2FkZWQ6USx0b3RhbDpnLHByb2dyZXNzOmc/US9nOnZvaWQgMCxieXRlczpzLHJhdGU6YXx8dm9pZCAwLGVzdGltYXRlZDphJiZnPyhnLVEpL2E6dm9pZCAwLGV2ZW50OmksbGVuZ3RoQ29tcHV0YWJsZTpnIT1udWxsLFtlPyJkb3dubG9hZCI6InVwbG9hZCJdOiEwfTtBKEMpfSx0KX0sTGU9KEEsZSk9PntsZXQgdD1BIT1udWxsO3JldHVybltyPT5lWzBdKHtsZW5ndGhDb21wdXRhYmxlOnQsdG90YWw6QSxsb2FkZWQ6cn0pLGVbMV1dfSxKZT1BPT4oLi4uZSk9Pm4uYXNhcCgoKT0+QSguLi5lKSk7dmFyIEx0PW0uaGFzU3RhbmRhcmRCcm93c2VyRW52PygoQSxlKT0+dD0+KHQ9bmV3IFVSTCh0LG0ub3JpZ2luKSxBLnByb3RvY29sPT09dC5wcm90b2NvbCYmQS5ob3N0PT09dC5ob3N0JiYoZXx8QS5wb3J0PT09dC5wb3J0KSkpKG5ldyBVUkwobS5vcmlnaW4pLG0ubmF2aWdhdG9yJiYvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG0ubmF2aWdhdG9yLnVzZXJBZ2VudCkpOigpPT4hMDt2YXIgSnQ9bS5oYXNTdGFuZGFyZEJyb3dzZXJFbnY/e3dyaXRlKEEsZSx0LHIsSSxpLG8pe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuO2xldCBnPVtgJHtBfT0ke2VuY29kZVVSSUNvbXBvbmVudChlKX1gXTtuLmlzTnVtYmVyKHQpJiZnLnB1c2goYGV4cGlyZXM9JHtuZXcgRGF0ZSh0KS50b1VUQ1N0cmluZygpfWApLG4uaXNTdHJpbmcocikmJmcucHVzaChgcGF0aD0ke3J9YCksbi5pc1N0cmluZyhJKSYmZy5wdXNoKGBkb21haW49JHtJfWApLGk9PT0hMCYmZy5wdXNoKCJzZWN1cmUiKSxuLmlzU3RyaW5nKG8pJiZnLnB1c2goYFNhbWVTaXRlPSR7b31gKSxkb2N1bWVudC5jb29raWU9Zy5qb2luKCI7ICIpfSxyZWFkKEEpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7bGV0IGU9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCByPWVbdF0ucmVwbGFjZSgvXlxzKy8sIiIpLEk9ci5pbmRleE9mKCI9Iik7aWYoSSE9PS0xJiZyLnNsaWNlKDAsSSk9PT1BKXJldHVybiBkZWNvZGVVUklDb21wb25lbnQoci5zbGljZShJKzEpKX1yZXR1cm4gbnVsbH0scmVtb3ZlKEEpe3RoaXMud3JpdGUoQSwiIixEYXRlLm5vdygpLTg2NGU1LCIvIil9fTp7d3JpdGUoKXt9LHJlYWQoKXtyZXR1cm4gbnVsbH0scmVtb3ZlKCl7fX07ZnVuY3Rpb24gT2UoQSl7cmV0dXJuIHR5cGVvZiBBIT0ic3RyaW5nIj8hMTovXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KEEpfWZ1bmN0aW9uIEhlKEEsZSl7cmV0dXJuIGU/QS5yZXBsYWNlKC9cLz9cLyQvLCIiKSsiLyIrZS5yZXBsYWNlKC9eXC8rLywiIik6QX1mdW5jdGlvbiBVQShBLGUsdCl7bGV0IHI9IU9lKGUpO3JldHVybiBBJiYocnx8dD09PSExKT9IZShBLGUpOmV9dmFyIE90PUE9PkEgaW5zdGFuY2VvZiBSP3suLi5BfTpBO2Z1bmN0aW9uIHgoQSxlKXtlPWV8fHt9O2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImhhc093blByb3BlcnR5Iix7X19wcm90b19fOm51bGwsdmFsdWU6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIHIocyxhLEMsbCl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChzKSYmbi5pc1BsYWluT2JqZWN0KGEpP24ubWVyZ2UuY2FsbCh7Y2FzZWxlc3M6bH0scyxhKTpuLmlzUGxhaW5PYmplY3QoYSk/bi5tZXJnZSh7fSxhKTpuLmlzQXJyYXkoYSk/YS5zbGljZSgpOmF9ZnVuY3Rpb24gSShzLGEsQyxsKXtpZihuLmlzVW5kZWZpbmVkKGEpKXtpZighbi5pc1VuZGVmaW5lZChzKSlyZXR1cm4gcih2b2lkIDAscyxDLGwpfWVsc2UgcmV0dXJuIHIocyxhLEMsbCl9ZnVuY3Rpb24gaShzLGEpe2lmKCFuLmlzVW5kZWZpbmVkKGEpKXJldHVybiByKHZvaWQgMCxhKX1mdW5jdGlvbiBvKHMsYSl7aWYobi5pc1VuZGVmaW5lZChhKSl7aWYoIW4uaXNVbmRlZmluZWQocykpcmV0dXJuIHIodm9pZCAwLHMpfWVsc2UgcmV0dXJuIHIodm9pZCAwLGEpfWZ1bmN0aW9uIGcocyxhLEMpe2lmKG4uaGFzT3duUHJvcChlLEMpKXJldHVybiByKHMsYSk7aWYobi5oYXNPd25Qcm9wKEEsQykpcmV0dXJuIHIodm9pZCAwLHMpfWxldCBRPXt1cmw6aSxtZXRob2Q6aSxkYXRhOmksYmFzZVVSTDpvLHRyYW5zZm9ybVJlcXVlc3Q6byx0cmFuc2Zvcm1SZXNwb25zZTpvLHBhcmFtc1NlcmlhbGl6ZXI6byx0aW1lb3V0Om8sdGltZW91dE1lc3NhZ2U6byx3aXRoQ3JlZGVudGlhbHM6byx3aXRoWFNSRlRva2VuOm8sYWRhcHRlcjpvLHJlc3BvbnNlVHlwZTpvLHhzcmZDb29raWVOYW1lOm8seHNyZkhlYWRlck5hbWU6byxvblVwbG9hZFByb2dyZXNzOm8sb25Eb3dubG9hZFByb2dyZXNzOm8sZGVjb21wcmVzczpvLG1heENvbnRlbnRMZW5ndGg6byxtYXhCb2R5TGVuZ3RoOm8sYmVmb3JlUmVkaXJlY3Q6byx0cmFuc3BvcnQ6byxodHRwQWdlbnQ6byxodHRwc0FnZW50Om8sY2FuY2VsVG9rZW46byxzb2NrZXRQYXRoOm8sYWxsb3dlZFNvY2tldFBhdGhzOm8scmVzcG9uc2VFbmNvZGluZzpvLHZhbGlkYXRlU3RhdHVzOmcsaGVhZGVyczoocyxhLEMpPT5JKE90KHMpLE90KGEpLEMsITApfTtyZXR1cm4gbi5mb3JFYWNoKE9iamVjdC5rZXlzKHsuLi5BLC4uLmV9KSxmdW5jdGlvbihhKXtpZihhPT09Il9fcHJvdG9fXyJ8fGE9PT0iY29uc3RydWN0b3IifHxhPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBDPW4uaGFzT3duUHJvcChRLGEpP1FbYV06SSxsPW4uaGFzT3duUHJvcChBLGEpP0FbYV06dm9pZCAwLEI9bi5oYXNPd25Qcm9wKGUsYSk/ZVthXTp2b2lkIDAsZj1DKGwsQixhKTtuLmlzVW5kZWZpbmVkKGYpJiZDIT09Z3x8KHRbYV09Zil9KSx0fXZhciBqST1bImNvbnRlbnQtdHlwZSIsImNvbnRlbnQtbGVuZ3RoIl07ZnVuY3Rpb24gX0koQSxlLHQpe2lmKHQhPT0iY29udGVudC1vbmx5Iil7QS5zZXQoZSk7cmV0dXJufU9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtyLEldKT0+e2pJLmluY2x1ZGVzKHIudG9Mb3dlckNhc2UoKSkmJkEuc2V0KHIsSSl9KX12YXIgdkk9QT0+ZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2dpLChlLHQpPT5TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHQsMTYpKSksZWU9QT0+e2xldCBlPXgoe30sQSksdD1sPT5uLmhhc093blByb3AoZSxsKT9lW2xdOnZvaWQgMCxyPXQoImRhdGEiKSxJPXQoIndpdGhYU1JGVG9rZW4iKSxpPXQoInhzcmZIZWFkZXJOYW1lIiksbz10KCJ4c3JmQ29va2llTmFtZSIpLGc9dCgiaGVhZGVycyIpLFE9dCgiYXV0aCIpLHM9dCgiYmFzZVVSTCIpLGE9dCgiYWxsb3dBYnNvbHV0ZVVybHMiKSxDPXQoInVybCIpO2lmKGUuaGVhZGVycz1nPVIuZnJvbShnKSxlLnVybD1TQShVQShzLEMsYSksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxRJiZnLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgoUS51c2VybmFtZXx8IiIpKyI6IisoUS5wYXNzd29yZD92SShRLnBhc3N3b3JkKToiIikpKSxuLmlzRm9ybURhdGEocikmJihtLmhhc1N0YW5kYXJkQnJvd3NlckVudnx8bS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY/Zy5zZXRDb250ZW50VHlwZSh2b2lkIDApOm4uaXNGdW5jdGlvbihyLmdldEhlYWRlcnMpJiZfSShnLHIuZ2V0SGVhZGVycygpLHQoImZvcm1EYXRhSGVhZGVyUG9saWN5IikpKSxtLmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKG4uaXNGdW5jdGlvbihJKSYmKEk9SShlKSksST09PSEwfHxJPT1udWxsJiZMdChlLnVybCkpKXtsZXQgQj1pJiZvJiZKdC5yZWFkKG8pO0ImJmcuc2V0KGksQil9cmV0dXJuIGV9O3ZhciBaST10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLEh0PVpJJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxyKXtsZXQgST1lZShBKSxpPUkuZGF0YSxvPVIuZnJvbShJLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6ZyxvblVwbG9hZFByb2dyZXNzOlEsb25Eb3dubG9hZFByb2dyZXNzOnN9PUksYSxDLGwsQixmO2Z1bmN0aW9uIGMoKXtCJiZCKCksZiYmZigpLEkuY2FuY2VsVG9rZW4mJkkuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUoYSksSS5zaWduYWwmJkkuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixhKX1sZXQgRT1uZXcgWE1MSHR0cFJlcXVlc3Q7RS5vcGVuKEkubWV0aG9kLnRvVXBwZXJDYXNlKCksSS51cmwsITApLEUudGltZW91dD1JLnRpbWVvdXQ7ZnVuY3Rpb24gdSgpe2lmKCFFKXJldHVybjtsZXQgaD1SLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBFJiZFLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxNPXtkYXRhOiFnfHxnPT09InRleHQifHxnPT09Impzb24iP0UucmVzcG9uc2VUZXh0OkUucmVzcG9uc2Usc3RhdHVzOkUuc3RhdHVzLHN0YXR1c1RleHQ6RS5zdGF0dXNUZXh0LGhlYWRlcnM6aCxjb25maWc6QSxyZXF1ZXN0OkV9O2tBKGZ1bmN0aW9uKGRBKXt0KGRBKSxjKCl9LGZ1bmN0aW9uKGRBKXtyKGRBKSxjKCl9LE0pLEU9bnVsbH0ib25sb2FkZW5kImluIEU/RS5vbmxvYWRlbmQ9dTpFLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFFfHxFLnJlYWR5U3RhdGUhPT00fHxFLnN0YXR1cz09PTAmJiEoRS5yZXNwb25zZVVSTCYmRS5yZXNwb25zZVVSTC5zdGFydHNXaXRoKCJmaWxlOiIpKXx8c2V0VGltZW91dCh1KX0sRS5vbmFib3J0PWZ1bmN0aW9uKCl7RSYmKHIobmV3IGQoIlJlcXVlc3QgYWJvcnRlZCIsZC5FQ09OTkFCT1JURUQsQSxFKSksYygpLEU9bnVsbCl9LEUub25lcnJvcj1mdW5jdGlvbih5KXtsZXQgTT15JiZ5Lm1lc3NhZ2U/eS5tZXNzYWdlOiJOZXR3b3JrIEVycm9yIixBQT1uZXcgZChNLGQuRVJSX05FVFdPUkssQSxFKTtBQS5ldmVudD15fHxudWxsLHIoQUEpLGMoKSxFPW51bGx9LEUub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IHk9SS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrSS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLE09SS50cmFuc2l0aW9uYWx8fENBO0kudGltZW91dEVycm9yTWVzc2FnZSYmKHk9SS50aW1lb3V0RXJyb3JNZXNzYWdlKSxyKG5ldyBkKHksTS5jbGFyaWZ5VGltZW91dEVycm9yP2QuRVRJTUVET1VUOmQuRUNPTk5BQk9SVEVELEEsRSkpLGMoKSxFPW51bGx9LGk9PT12b2lkIDAmJm8uc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gRSYmbi5mb3JFYWNoKFZBKG8pLGZ1bmN0aW9uKHksTSl7RS5zZXRSZXF1ZXN0SGVhZGVyKE0seSl9KSxuLmlzVW5kZWZpbmVkKEkud2l0aENyZWRlbnRpYWxzKXx8KEUud2l0aENyZWRlbnRpYWxzPSEhSS53aXRoQ3JlZGVudGlhbHMpLGcmJmchPT0ianNvbiImJihFLnJlc3BvbnNlVHlwZT1JLnJlc3BvbnNlVHlwZSkscyYmKFtsLGZdPUVBKHMsITApLEUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGwpKSxRJiZFLnVwbG9hZCYmKFtDLEJdPUVBKFEpLEUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixDKSxFLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZW5kIixCKSksKEkuY2FuY2VsVG9rZW58fEkuc2lnbmFsKSYmKGE9aD0+e0UmJihyKCFofHxoLnR5cGU/bmV3IGoobnVsbCxBLEUpOmgpLEUuYWJvcnQoKSxjKCksRT1udWxsKX0sSS5jYW5jZWxUb2tlbiYmSS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYSksSS5zaWduYWwmJihJLnNpZ25hbC5hYm9ydGVkP2EoKTpJLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYSkpKTtsZXQgRD1iZShJLnVybCk7aWYoRCYmIW0ucHJvdG9jb2xzLmluY2x1ZGVzKEQpKXtyKG5ldyBkKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK0QrIjoiLGQuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59RS5zZW5kKGl8fG51bGwpfSl9O3ZhciBWST0oQSxlKT0+e2lmKEE9QT9BLmZpbHRlcihCb29sZWFuKTpbXSwhZSYmIUEubGVuZ3RoKXJldHVybjtsZXQgdD1uZXcgQWJvcnRDb250cm9sbGVyLHI9ITEsST1mdW5jdGlvbihRKXtpZighcil7cj0hMCxvKCk7bGV0IHM9USBpbnN0YW5jZW9mIEVycm9yP1E6dGhpcy5yZWFzb247dC5hYm9ydChzIGluc3RhbmNlb2YgZD9zOm5ldyBqKHMgaW5zdGFuY2VvZiBFcnJvcj9zLm1lc3NhZ2U6cykpfX0saT1lJiZzZXRUaW1lb3V0KCgpPT57aT1udWxsLEkobmV3IGQoYHRpbWVvdXQgb2YgJHtlfW1zIGV4Y2VlZGVkYCxkLkVUSU1FRE9VVCkpfSxlKSxvPSgpPT57QSYmKGkmJmNsZWFyVGltZW91dChpKSxpPW51bGwsQS5mb3JFYWNoKFE9PntRLnVuc3Vic2NyaWJlP1EudW5zdWJzY3JpYmUoSSk6US5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsSSl9KSxBPW51bGwpfTtBLmZvckVhY2goUT0+US5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsSSkpO2xldHtzaWduYWw6Z309dDtyZXR1cm4gZy51bnN1YnNjcmliZT0oKT0+bi5hc2FwKG8pLGd9LE10PVZJO3ZhciB6ST1mdW5jdGlvbiooQSxlKXtsZXQgdD1BLmJ5dGVMZW5ndGg7aWYoIWV8fHQ8ZSl7eWllbGQgQTtyZXR1cm59bGV0IHI9MCxJO2Zvcig7cjx0OylJPXIrZSx5aWVsZCBBLnNsaWNlKHIsSSkscj1JfSxYST1hc3luYyBmdW5jdGlvbiooQSxlKXtmb3IgYXdhaXQobGV0IHQgb2YgJEkoQSkpeWllbGQqekkodCxlKX0sJEk9YXN5bmMgZnVuY3Rpb24qKEEpe2lmKEFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKXt5aWVsZCpBO3JldHVybn1sZXQgZT1BLmdldFJlYWRlcigpO3RyeXtmb3IoOzspe2xldHtkb25lOnQsdmFsdWU6cn09YXdhaXQgZS5yZWFkKCk7aWYodClicmVhazt5aWVsZCByfX1maW5hbGx5e2F3YWl0IGUuY2FuY2VsKCl9fSxNZT0oQSxlLHQscik9PntsZXQgST1YSShBLGUpLGk9MCxvLGc9UT0+e298fChvPSEwLHImJnIoUSkpfTtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHthc3luYyBwdWxsKFEpe3RyeXtsZXR7ZG9uZTpzLHZhbHVlOmF9PWF3YWl0IEkubmV4dCgpO2lmKHMpe2coKSxRLmNsb3NlKCk7cmV0dXJufWxldCBDPWEuYnl0ZUxlbmd0aDtpZih0KXtsZXQgbD1pKz1DO3QobCl9US5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KGEpKX1jYXRjaChzKXt0aHJvdyBnKHMpLHN9fSxjYW5jZWwoUSl7cmV0dXJuIGcoUSksSS5yZXR1cm4oKX19LHtoaWdoV2F0ZXJNYXJrOjJ9KX07ZnVuY3Rpb24gWWUoQSl7aWYoIUF8fHR5cGVvZiBBIT0ic3RyaW5nInx8IUEuc3RhcnRzV2l0aCgiZGF0YToiKSlyZXR1cm4gMDtsZXQgZT1BLmluZGV4T2YoIiwiKTtpZihlPDApcmV0dXJuIDA7bGV0IHQ9QS5zbGljZSg1LGUpLHI9QS5zbGljZShlKzEpO2lmKC87YmFzZTY0L2kudGVzdCh0KSl7bGV0IG89ci5sZW5ndGgsZz1yLmxlbmd0aDtmb3IobGV0IEI9MDtCPGc7QisrKWlmKHIuY2hhckNvZGVBdChCKT09PTM3JiZCKzI8Zyl7bGV0IGY9ci5jaGFyQ29kZUF0KEIrMSksYz1yLmNoYXJDb2RlQXQoQisyKTsoZj49NDgmJmY8PTU3fHxmPj02NSYmZjw9NzB8fGY+PTk3JiZmPD0xMDIpJiYoYz49NDgmJmM8PTU3fHxjPj02NSYmYzw9NzB8fGM+PTk3JiZjPD0xMDIpJiYoby09MixCKz0yKX1sZXQgUT0wLHM9Zy0xLGE9Qj0+Qj49MiYmci5jaGFyQ29kZUF0KEItMik9PT0zNyYmci5jaGFyQ29kZUF0KEItMSk9PT01MSYmKHIuY2hhckNvZGVBdChCKT09PTY4fHxyLmNoYXJDb2RlQXQoQik9PT0xMDApO3M+PTAmJihyLmNoYXJDb2RlQXQocyk9PT02MT8oUSsrLHMtLSk6YShzKSYmKFErKyxzLT0zKSksUT09PTEmJnM+PTAmJihyLmNoYXJDb2RlQXQocyk9PT02MXx8YShzKSkmJlErKztsZXQgbD1NYXRoLmZsb29yKG8vNCkqMy0oUXx8MCk7cmV0dXJuIGw+MD9sOjB9aWYodHlwZW9mIEJ1ZmZlcjwidSImJnR5cGVvZiBCdWZmZXIuYnl0ZUxlbmd0aD09ImZ1bmN0aW9uIilyZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgociwidXRmOCIpO2xldCBpPTA7Zm9yKGxldCBvPTAsZz1yLmxlbmd0aDtvPGc7bysrKXtsZXQgUT1yLmNoYXJDb2RlQXQobyk7aWYoUTwxMjgpaSs9MTtlbHNlIGlmKFE8MjA0OClpKz0yO2Vsc2UgaWYoUT49NTUyOTYmJlE8PTU2MzE5JiZvKzE8Zyl7bGV0IHM9ci5jaGFyQ29kZUF0KG8rMSk7cz49NTYzMjAmJnM8PTU3MzQzPyhpKz00LG8rKyk6aSs9M31lbHNlIGkrPTN9cmV0dXJuIGl9dmFyIGxBPSIxLjE2LjEiO3ZhciBZdD02NCoxMDI0LHtpc0Z1bmN0aW9uOnRlfT1uLHF0PShBLC4uLmUpPT57dHJ5e3JldHVybiEhQSguLi5lKX1jYXRjaHtyZXR1cm4hMX19LEFpPUE9PntsZXQgZT1uLmdsb2JhbCE9PXZvaWQgMCYmbi5nbG9iYWwhPT1udWxsP24uZ2xvYmFsOmdsb2JhbFRoaXMse1JlYWRhYmxlU3RyZWFtOnQsVGV4dEVuY29kZXI6cn09ZTtBPW4ubWVyZ2UuY2FsbCh7c2tpcFVuZGVmaW5lZDohMH0se1JlcXVlc3Q6ZS5SZXF1ZXN0LFJlc3BvbnNlOmUuUmVzcG9uc2V9LEEpO2xldHtmZXRjaDpJLFJlcXVlc3Q6aSxSZXNwb25zZTpvfT1BLGc9ST90ZShJKTp0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiIsUT10ZShpKSxzPXRlKG8pO2lmKCFnKXJldHVybiExO2xldCBhPWcmJnRlKHQpLEM9ZyYmKHR5cGVvZiByPT0iZnVuY3Rpb24iPyh1PT5EPT51LmVuY29kZShEKSkobmV3IHIpOmFzeW5jIHU9Pm5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBpKHUpLmFycmF5QnVmZmVyKCkpKSxsPVEmJmEmJnF0KCgpPT57bGV0IHU9ITEsRD1uZXcgaShtLm9yaWdpbix7Ym9keTpuZXcgdCxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gdT0hMCwiaGFsZiJ9fSksaD1ELmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKTtyZXR1cm4gRC5ib2R5IT1udWxsJiZELmJvZHkuY2FuY2VsKCksdSYmIWh9KSxCPXMmJmEmJnF0KCgpPT5uLmlzUmVhZGFibGVTdHJlYW0obmV3IG8oIiIpLmJvZHkpKSxmPXtzdHJlYW06QiYmKHU9PnUuYm9keSl9O2cmJlsidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaCh1PT57IWZbdV0mJihmW3VdPShELGgpPT57bGV0IHk9RCYmRFt1XTtpZih5KXJldHVybiB5LmNhbGwoRCk7dGhyb3cgbmV3IGQoYFJlc3BvbnNlIHR5cGUgJyR7dX0nIGlzIG5vdCBzdXBwb3J0ZWRgLGQuRVJSX05PVF9TVVBQT1JULGgpfSl9KTtsZXQgYz1hc3luYyB1PT57aWYodT09bnVsbClyZXR1cm4gMDtpZihuLmlzQmxvYih1KSlyZXR1cm4gdS5zaXplO2lmKG4uaXNTcGVjQ29tcGxpYW50Rm9ybSh1KSlyZXR1cm4oYXdhaXQgbmV3IGkobS5vcmlnaW4se21ldGhvZDoiUE9TVCIsYm9keTp1fSkuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KHUpfHxuLmlzQXJyYXlCdWZmZXIodSkpcmV0dXJuIHUuYnl0ZUxlbmd0aDtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKHUpJiYodT11KyIiKSxuLmlzU3RyaW5nKHUpKXJldHVybihhd2FpdCBDKHUpKS5ieXRlTGVuZ3RofSxFPWFzeW5jKHUsRCk9PntsZXQgaD1uLnRvRmluaXRlTnVtYmVyKHUuZ2V0Q29udGVudExlbmd0aCgpKTtyZXR1cm4gaD8/YyhEKX07cmV0dXJuIGFzeW5jIHU9PntsZXR7dXJsOkQsbWV0aG9kOmgsZGF0YTp5LHNpZ25hbDpNLGNhbmNlbFRva2VuOkFBLHRpbWVvdXQ6ZEEsb25Eb3dubG9hZFByb2dyZXNzOnNlLG9uVXBsb2FkUHJvZ3Jlc3M6WGUscmVzcG9uc2VUeXBlOlosaGVhZGVyczplQSx3aXRoQ3JlZGVudGlhbHM6SEE9InNhbWUtb3JpZ2luIixmZXRjaE9wdGlvbnM6JGUsbWF4Q29udGVudExlbmd0aDpQLG1heEJvZHlMZW5ndGg6Q2V9PWVlKHUpLHBBPW4uaXNOdW1iZXIoUCkmJlA+LTEsRXI9bi5pc051bWJlcihDZSkmJkNlPi0xLEF0PUl8fGZldGNoO1o9Wj8oWisiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IFY9TXQoW00sQUEmJkFBLnRvQWJvcnRTaWduYWwoKV0sZEEpLFk9bnVsbCx0QT1WJiZWLnVuc3Vic2NyaWJlJiYoKCk9PntWLnVuc3Vic2NyaWJlKCl9KSxldDt0cnl7aWYocEEmJnR5cGVvZiBEPT0ic3RyaW5nIiYmRC5zdGFydHNXaXRoKCJkYXRhOiIpJiZZZShEKT5QKXRocm93IG5ldyBkKCJtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgIitQKyIgZXhjZWVkZWQiLGQuRVJSX0JBRF9SRVNQT05TRSx1LFkpO2lmKEVyJiZoIT09ImdldCImJmghPT0iaGVhZCIpe2xldCB3PWF3YWl0IEUoZUEseSk7aWYodHlwZW9mIHc9PSJudW1iZXIiJiZpc0Zpbml0ZSh3KSYmdz5DZSl0aHJvdyBuZXcgZCgiUmVxdWVzdCBib2R5IGxhcmdlciB0aGFuIG1heEJvZHlMZW5ndGggbGltaXQiLGQuRVJSX0JBRF9SRVFVRVNULHUsWSl9aWYoWGUmJmwmJmghPT0iZ2V0IiYmaCE9PSJoZWFkIiYmKGV0PWF3YWl0IEUoZUEseSkpIT09MCl7bGV0IHc9bmV3IGkoRCx7bWV0aG9kOiJQT1NUIixib2R5OnksZHVwbGV4OiJoYWxmIn0pLG9BO2lmKG4uaXNGb3JtRGF0YSh5KSYmKG9BPXcuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpKSYmZUEuc2V0Q29udGVudFR5cGUob0EpLHcuYm9keSl7bGV0W01BLFlBXT1MZShldCxFQShKZShYZSkpKTt5PU1lKHcuYm9keSxZdCxNQSxZQSl9fW4uaXNTdHJpbmcoSEEpfHwoSEE9SEE/ImluY2x1ZGUiOiJvbWl0Iik7bGV0IFU9USYmImNyZWRlbnRpYWxzImluIGkucHJvdG90eXBlO2lmKG4uaXNGb3JtRGF0YSh5KSl7bGV0IHc9ZUEuZ2V0Q29udGVudFR5cGUoKTt3JiYvXm11bHRpcGFydFwvZm9ybS1kYXRhL2kudGVzdCh3KSYmIS9ib3VuZGFyeT0vaS50ZXN0KHcpJiZlQS5kZWxldGUoImNvbnRlbnQtdHlwZSIpfWVBLnNldCgiVXNlci1BZ2VudCIsImF4aW9zLyIrbEEsITEpO2xldCB6PXsuLi4kZSxzaWduYWw6VixtZXRob2Q6aC50b1VwcGVyQ2FzZSgpLGhlYWRlcnM6VkEoZUEubm9ybWFsaXplKCkpLGJvZHk6eSxkdXBsZXg6ImhhbGYiLGNyZWRlbnRpYWxzOlU/SEE6dm9pZCAwfTtZPVEmJm5ldyBpKEQseik7bGV0IEs9YXdhaXQoUT9BdChZLCRlKTpBdChELHopKTtpZihwQSl7bGV0IHc9bi50b0Zpbml0ZU51bWJlcihLLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKTtpZih3IT1udWxsJiZ3PlApdGhyb3cgbmV3IGQoIm1heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAiK1ArIiBleGNlZWRlZCIsZC5FUlJfQkFEX1JFU1BPTlNFLHUsWSl9bGV0IEJlPUImJihaPT09InN0cmVhbSJ8fFo9PT0icmVzcG9uc2UiKTtpZihCJiZLLmJvZHkmJihzZXx8cEF8fEJlJiZ0QSkpe2xldCB3PXt9O1sic3RhdHVzIiwic3RhdHVzVGV4dCIsImhlYWRlcnMiXS5mb3JFYWNoKGhBPT57d1toQV09S1toQV19KTtsZXQgb0E9bi50b0Zpbml0ZU51bWJlcihLLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKSxbTUEsWUFdPXNlJiZMZShvQSxFQShKZShzZSksITApKXx8W10sdHQ9MCxscj1oQT0+e2lmKHBBJiYodHQ9aEEsdHQ+UCkpdGhyb3cgbmV3IGQoIm1heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAiK1ArIiBleGNlZWRlZCIsZC5FUlJfQkFEX1JFU1BPTlNFLHUsWSk7TUEmJk1BKGhBKX07Sz1uZXcgbyhNZShLLmJvZHksWXQsbHIsKCk9PntZQSYmWUEoKSx0QSYmdEEoKX0pLHcpfVo9Wnx8InRleHQiO2xldCBfPWF3YWl0IGZbbi5maW5kS2V5KGYsWil8fCJ0ZXh0Il0oSyx1KTtpZihwQSYmIUImJiFCZSl7bGV0IHc7aWYoXyE9bnVsbCYmKHR5cGVvZiBfLmJ5dGVMZW5ndGg9PSJudW1iZXIiP3c9Xy5ieXRlTGVuZ3RoOnR5cGVvZiBfLnNpemU9PSJudW1iZXIiP3c9Xy5zaXplOnR5cGVvZiBfPT0ic3RyaW5nIiYmKHc9dHlwZW9mIHI9PSJmdW5jdGlvbiI/bmV3IHIoKS5lbmNvZGUoXykuYnl0ZUxlbmd0aDpfLmxlbmd0aCkpLHR5cGVvZiB3PT0ibnVtYmVyIiYmdz5QKXRocm93IG5ldyBkKCJtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgIitQKyIgZXhjZWVkZWQiLGQuRVJSX0JBRF9SRVNQT05TRSx1LFkpfXJldHVybiFCZSYmdEEmJnRBKCksYXdhaXQgbmV3IFByb21pc2UoKHcsb0EpPT57a0EodyxvQSx7ZGF0YTpfLGhlYWRlcnM6Ui5mcm9tKEsuaGVhZGVycyksc3RhdHVzOksuc3RhdHVzLHN0YXR1c1RleHQ6Sy5zdGF0dXNUZXh0LGNvbmZpZzp1LHJlcXVlc3Q6WX0pfSl9Y2F0Y2goVSl7aWYodEEmJnRBKCksViYmVi5hYm9ydGVkJiZWLnJlYXNvbiBpbnN0YW5jZW9mIGQpe2xldCB6PVYucmVhc29uO3Rocm93IHouY29uZmlnPXUsWSYmKHoucmVxdWVzdD1ZKSxVIT09eiYmKHouY2F1c2U9VSksen10aHJvdyBVJiZVLm5hbWU9PT0iVHlwZUVycm9yIiYmL0xvYWQgZmFpbGVkfGZldGNoL2kudGVzdChVLm1lc3NhZ2UpP09iamVjdC5hc3NpZ24obmV3IGQoIk5ldHdvcmsgRXJyb3IiLGQuRVJSX05FVFdPUkssdSxZLFUmJlUucmVzcG9uc2UpLHtjYXVzZTpVLmNhdXNlfHxVfSk6ZC5mcm9tKFUsVSYmVS5jb2RlLHUsWSxVJiZVLnJlc3BvbnNlKX19fSxlaT1uZXcgTWFwLHFlPUE9PntsZXQgZT1BJiZBLmVudnx8e30se2ZldGNoOnQsUmVxdWVzdDpyLFJlc3BvbnNlOkl9PWUsaT1bcixJLHRdLG89aS5sZW5ndGgsZz1vLFEscyxhPWVpO2Zvcig7Zy0tOylRPWlbZ10scz1hLmdldChRKSxzPT09dm9pZCAwJiZhLnNldChRLHM9Zz9uZXcgTWFwOkFpKGUpKSxhPXM7cmV0dXJuIHN9LFFuPXFlKCk7dmFyIFRlPXtodHRwOlhBLHhocjpIdCxmZXRjaDp7Z2V0OnFlfX07bi5mb3JFYWNoKFRlLChBLGUpPT57aWYoQSl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJuYW1lIix7X19wcm90b19fOm51bGwsdmFsdWU6ZX0pfWNhdGNoe31PYmplY3QuZGVmaW5lUHJvcGVydHkoQSwiYWRhcHRlck5hbWUiLHtfX3Byb3RvX186bnVsbCx2YWx1ZTplfSl9fSk7dmFyIFR0PUE9PmAtICR7QX1gLHJpPUE9Pm4uaXNGdW5jdGlvbihBKXx8QT09PW51bGx8fEE9PT0hMTtmdW5jdGlvbiBJaShBLGUpe0E9bi5pc0FycmF5KEEpP0E6W0FdO2xldHtsZW5ndGg6dH09QSxyLEksaT17fTtmb3IobGV0IG89MDtvPHQ7bysrKXtyPUFbb107bGV0IGc7aWYoST1yLCFyaShyKSYmKEk9VGVbKGc9U3RyaW5nKHIpKS50b0xvd2VyQ2FzZSgpXSxJPT09dm9pZCAwKSl0aHJvdyBuZXcgZChgVW5rbm93biBhZGFwdGVyICcke2d9J2ApO2lmKEkmJihuLmlzRnVuY3Rpb24oSSl8fChJPUkuZ2V0KGUpKSkpYnJlYWs7aVtnfHwiIyIrb109SX1pZighSSl7bGV0IG89T2JqZWN0LmVudHJpZXMoaSkubWFwKChbUSxzXSk9PmBhZGFwdGVyICR7UX0gYCsocz09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGc9dD9vLmxlbmd0aD4xP2BzaW5jZSA6CmArby5tYXAoVHQpLmpvaW4oYApgKToiICIrVHQob1swXSk6ImFzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkIjt0aHJvdyBuZXcgZCgiVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCAiK2csIkVSUl9OT1RfU1VQUE9SVCIpfXJldHVybiBJfXZhciByZT17Z2V0QWRhcHRlcjpJaSxhZGFwdGVyczpUZX07ZnVuY3Rpb24geGUoQSl7aWYoQS5jYW5jZWxUb2tlbiYmQS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksQS5zaWduYWwmJkEuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IGoobnVsbCxBKX1mdW5jdGlvbiBJZShBKXtyZXR1cm4geGUoQSksQS5oZWFkZXJzPVIuZnJvbShBLmhlYWRlcnMpLEEuZGF0YT1GQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXF1ZXN0KSxbInBvc3QiLCJwdXQiLCJwYXRjaCJdLmluZGV4T2YoQS5tZXRob2QpIT09LTEmJkEuaGVhZGVycy5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwhMSkscmUuZ2V0QWRhcHRlcihBLmFkYXB0ZXJ8fFFBLmFkYXB0ZXIsQSkoQSkudGhlbihmdW5jdGlvbihyKXt4ZShBKSxBLnJlc3BvbnNlPXI7dHJ5e3IuZGF0YT1GQS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxyKX1maW5hbGx5e2RlbGV0ZSBBLnJlc3BvbnNlfXJldHVybiByLmhlYWRlcnM9Ui5mcm9tKHIuaGVhZGVycykscn0sZnVuY3Rpb24ocil7aWYoIU5BKHIpJiYoeGUoQSksciYmci5yZXNwb25zZSkpe0EucmVzcG9uc2U9ci5yZXNwb25zZTt0cnl7ci5yZXNwb25zZS5kYXRhPUZBLmNhbGwoQSxBLnRyYW5zZm9ybVJlc3BvbnNlLHIucmVzcG9uc2UpfWZpbmFsbHl7ZGVsZXRlIEEucmVzcG9uc2V9ci5yZXNwb25zZS5oZWFkZXJzPVIuZnJvbShyLnJlc3BvbnNlLmhlYWRlcnMpfXJldHVybiBQcm9taXNlLnJlamVjdChyKX0pfXZhciBpZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKEEsZSk9PntpZVtBXT1mdW5jdGlvbihyKXtyZXR1cm4gdHlwZW9mIHI9PT1BfHwiYSIrKGU8MT8ibiAiOiIgIikrQX19KTt2YXIgeHQ9e307aWUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBJKGksbyl7cmV0dXJuIltBeGlvcyB2IitsQSsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2krIiciK28rKHI/Ii4gIityOiIiKX1yZXR1cm4oaSxvLGcpPT57aWYoZT09PSExKXRocm93IG5ldyBkKEkobywiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSksZC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIHQmJiF4dFtvXSYmKHh0W29dPSEwLGNvbnNvbGUud2FybihJKG8sIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKGksbyxnKTohMH19O2llLnNwZWxsaW5nPWZ1bmN0aW9uKGUpe3JldHVybih0LHIpPT4oY29uc29sZS53YXJuKGAke3J9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7ZX1gKSwhMCl9O2Z1bmN0aW9uIGlpKEEsZSx0KXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IGQoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLGQuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCByPU9iamVjdC5rZXlzKEEpLEk9ci5sZW5ndGg7Zm9yKDtJLS0gPjA7KXtsZXQgaT1yW0ldLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSk/ZVtpXTp2b2lkIDA7aWYobyl7bGV0IGc9QVtpXSxRPWc9PT12b2lkIDB8fG8oZyxpLEEpO2lmKFEhPT0hMCl0aHJvdyBuZXcgZCgib3B0aW9uICIraSsiIG11c3QgYmUgIitRLGQuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBuZXcgZCgiVW5rbm93biBvcHRpb24gIitpLGQuRVJSX0JBRF9PUFRJT04pfX12YXIgR0E9e2Fzc2VydE9wdGlvbnM6aWksdmFsaWRhdG9yczppZX07dmFyIHE9R0EudmFsaWRhdG9ycyxjQT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmRlZmF1bHRzPWV8fHt9LHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBSZSxyZXNwb25zZTpuZXcgUmV9fWFzeW5jIHJlcXVlc3QoZSx0KXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoZSx0KX1jYXRjaChyKXtpZihyIGluc3RhbmNlb2YgRXJyb3Ipe2xldCBJPXt9O0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKEkpOkk9bmV3IEVycm9yO2xldCBpPSgoKT0+e2lmKCFJLnN0YWNrKXJldHVybiIiO2xldCBvPUkuc3RhY2suaW5kZXhPZihgCmApO3JldHVybiBvPT09LTE/IiI6SS5zdGFjay5zbGljZShvKzEpfSkoKTt0cnl7aWYoIXIuc3RhY2spci5zdGFjaz1pO2Vsc2UgaWYoaSl7bGV0IG89aS5pbmRleE9mKGAKYCksZz1vPT09LTE/LTE6aS5pbmRleE9mKGAKYCxvKzEpLFE9Zz09PS0xPyIiOmkuc2xpY2UoZysxKTtTdHJpbmcoci5zdGFjaykuZW5kc1dpdGgoUSl8fChyLnN0YWNrKz1gCmAraSl9fWNhdGNoe319dGhyb3cgcn19X3JlcXVlc3QoZSx0KXt0eXBlb2YgZT09InN0cmluZyI/KHQ9dHx8e30sdC51cmw9ZSk6dD1lfHx7fSx0PXgodGhpcy5kZWZhdWx0cyx0KTtsZXR7dHJhbnNpdGlvbmFsOnIscGFyYW1zU2VyaWFsaXplcjpJLGhlYWRlcnM6aX09dDtyIT09dm9pZCAwJiZHQS5hc3NlcnRPcHRpb25zKHIse3NpbGVudEpTT05QYXJzaW5nOnEudHJhbnNpdGlvbmFsKHEuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6cS50cmFuc2l0aW9uYWwocS5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOnEudHJhbnNpdGlvbmFsKHEuYm9vbGVhbiksbGVnYWN5SW50ZXJjZXB0b3JSZXFSZXNPcmRlcmluZzpxLnRyYW5zaXRpb25hbChxLmJvb2xlYW4pfSwhMSksSSE9bnVsbCYmKG4uaXNGdW5jdGlvbihJKT90LnBhcmFtc1NlcmlhbGl6ZXI9e3NlcmlhbGl6ZTpJfTpHQS5hc3NlcnRPcHRpb25zKEkse2VuY29kZTpxLmZ1bmN0aW9uLHNlcmlhbGl6ZTpxLmZ1bmN0aW9ufSwhMCkpLHQuYWxsb3dBYnNvbHV0ZVVybHMhPT12b2lkIDB8fCh0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzIT09dm9pZCAwP3QuYWxsb3dBYnNvbHV0ZVVybHM9dGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJsczp0LmFsbG93QWJzb2x1dGVVcmxzPSEwKSxHQS5hc3NlcnRPcHRpb25zKHQse2Jhc2VVcmw6cS5zcGVsbGluZygiYmFzZVVSTCIpLHdpdGhYc3JmVG9rZW46cS5zcGVsbGluZygid2l0aFhTUkZUb2tlbiIpfSwhMCksdC5tZXRob2Q9KHQubWV0aG9kfHx0aGlzLmRlZmF1bHRzLm1ldGhvZHx8ImdldCIpLnRvTG93ZXJDYXNlKCk7bGV0IG89aSYmbi5tZXJnZShpLmNvbW1vbixpW3QubWV0aG9kXSk7aSYmbi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsInF1ZXJ5IiwiY29tbW9uIl0sZj0+e2RlbGV0ZSBpW2ZdfSksdC5oZWFkZXJzPVIuY29uY2F0KG8saSk7bGV0IGc9W10sUT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oYyl7aWYodHlwZW9mIGMucnVuV2hlbj09ImZ1bmN0aW9uIiYmYy5ydW5XaGVuKHQpPT09ITEpcmV0dXJuO1E9USYmYy5zeW5jaHJvbm91cztsZXQgRT10LnRyYW5zaXRpb25hbHx8Q0E7RSYmRS5sZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nP2cudW5zaGlmdChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKTpnLnB1c2goYy5mdWxmaWxsZWQsYy5yZWplY3RlZCl9KTtsZXQgcz1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3MucHVzaChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKX0pO2xldCBhLEM9MCxsO2lmKCFRKXtsZXQgZj1bSWUuYmluZCh0aGlzKSx2b2lkIDBdO2ZvcihmLnVuc2hpZnQoLi4uZyksZi5wdXNoKC4uLnMpLGw9Zi5sZW5ndGgsYT1Qcm9taXNlLnJlc29sdmUodCk7QzxsOylhPWEudGhlbihmW0MrK10sZltDKytdKTtyZXR1cm4gYX1sPWcubGVuZ3RoO2xldCBCPXQ7Zm9yKDtDPGw7KXtsZXQgZj1nW0MrK10sYz1nW0MrK107dHJ5e0I9ZihCKX1jYXRjaChFKXtjLmNhbGwodGhpcyxFKTticmVha319dHJ5e2E9SWUuY2FsbCh0aGlzLEIpfWNhdGNoKGYpe3JldHVybiBQcm9taXNlLnJlamVjdChmKX1mb3IoQz0wLGw9cy5sZW5ndGg7QzxsOylhPWEudGhlbihzW0MrK10sc1tDKytdKTtyZXR1cm4gYX1nZXRVcmkoZSl7ZT14KHRoaXMuZGVmYXVsdHMsZSk7bGV0IHQ9VUEoZS5iYXNlVVJMLGUudXJsLGUuYWxsb3dBYnNvbHV0ZVVybHMpO3JldHVybiBTQSh0LGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcil9fTtuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe2NBLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLnJlcXVlc3QoeChyfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToocnx8e30pLmRhdGF9KSl9fSk7bi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIiwicXVlcnkiXSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybiBmdW5jdGlvbihpLG8sZyl7cmV0dXJuIHRoaXMucmVxdWVzdCh4KGd8fHt9LHttZXRob2Q6ZSxoZWFkZXJzOnI/eyJDb250ZW50LVR5cGUiOiJtdWx0aXBhcnQvZm9ybS1kYXRhIn06e30sdXJsOmksZGF0YTpvfSkpfX1jQS5wcm90b3R5cGVbZV09dCgpLGUhPT0icXVlcnkiJiYoY0EucHJvdG90eXBlW2UrIkZvcm0iXT10KCEwKSl9KTt2YXIgYkE9Y0E7dmFyIFBlPWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7aWYodHlwZW9mIGUhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO2xldCB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihpKXt0PWl9KTtsZXQgcj10aGlzO3RoaXMucHJvbWlzZS50aGVuKEk9PntpZighci5fbGlzdGVuZXJzKXJldHVybjtsZXQgaT1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcig7aS0tID4wOylyLl9saXN0ZW5lcnNbaV0oSSk7ci5fbGlzdGVuZXJzPW51bGx9KSx0aGlzLnByb21pc2UudGhlbj1JPT57bGV0IGksbz1uZXcgUHJvbWlzZShnPT57ci5zdWJzY3JpYmUoZyksaT1nfSkudGhlbihJKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKGkpfSxvfSxlKGZ1bmN0aW9uKGksbyxnKXtyLnJlYXNvbnx8KHIucmVhc29uPW5ldyBqKGksbyxnKSx0KHIucmVhc29uKSl9KX10aHJvd0lmUmVxdWVzdGVkKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259c3Vic2NyaWJlKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19dW5zdWJzY3JpYmUoZSl7aWYoIXRoaXMuX2xpc3RlbmVycylyZXR1cm47bGV0IHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9dG9BYm9ydFNpZ25hbCgpe2xldCBlPW5ldyBBYm9ydENvbnRyb2xsZXIsdD1yPT57ZS5hYm9ydChyKX07cmV0dXJuIHRoaXMuc3Vic2NyaWJlKHQpLGUuc2lnbmFsLnVuc3Vic2NyaWJlPSgpPT50aGlzLnVuc3Vic2NyaWJlKHQpLGUuc2lnbmFsfXN0YXRpYyBzb3VyY2UoKXtsZXQgZTtyZXR1cm57dG9rZW46bmV3IEEoZnVuY3Rpb24oSSl7ZT1JfSksY2FuY2VsOmV9fX0sUHQ9UGU7ZnVuY3Rpb24gS2UoQSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBBLmFwcGx5KG51bGwsdCl9fWZ1bmN0aW9uIFdlKEEpe3JldHVybiBuLmlzT2JqZWN0KEEpJiZBLmlzQXhpb3NFcnJvcj09PSEwfXZhciBqZT17Q29udGludWU6MTAwLFN3aXRjaGluZ1Byb3RvY29sczoxMDEsUHJvY2Vzc2luZzoxMDIsRWFybHlIaW50czoxMDMsT2s6MjAwLENyZWF0ZWQ6MjAxLEFjY2VwdGVkOjIwMixOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246MjAzLE5vQ29udGVudDoyMDQsUmVzZXRDb250ZW50OjIwNSxQYXJ0aWFsQ29udGVudDoyMDYsTXVsdGlTdGF0dXM6MjA3LEFscmVhZHlSZXBvcnRlZDoyMDgsSW1Vc2VkOjIyNixNdWx0aXBsZUNob2ljZXM6MzAwLE1vdmVkUGVybWFuZW50bHk6MzAxLEZvdW5kOjMwMixTZWVPdGhlcjozMDMsTm90TW9kaWZpZWQ6MzA0LFVzZVByb3h5OjMwNSxVbnVzZWQ6MzA2LFRlbXBvcmFyeVJlZGlyZWN0OjMwNyxQZXJtYW5lbnRSZWRpcmVjdDozMDgsQmFkUmVxdWVzdDo0MDAsVW5hdXRob3JpemVkOjQwMSxQYXltZW50UmVxdWlyZWQ6NDAyLEZvcmJpZGRlbjo0MDMsTm90Rm91bmQ6NDA0LE1ldGhvZE5vdEFsbG93ZWQ6NDA1LE5vdEFjY2VwdGFibGU6NDA2LFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDo0MDcsUmVxdWVzdFRpbWVvdXQ6NDA4LENvbmZsaWN0OjQwOSxHb25lOjQxMCxMZW5ndGhSZXF1aXJlZDo0MTEsUHJlY29uZGl0aW9uRmFpbGVkOjQxMixQYXlsb2FkVG9vTGFyZ2U6NDEzLFVyaVRvb0xvbmc6NDE0LFVuc3VwcG9ydGVkTWVkaWFUeXBlOjQxNSxSYW5nZU5vdFNhdGlzZmlhYmxlOjQxNixFeHBlY3RhdGlvbkZhaWxlZDo0MTcsSW1BVGVhcG90OjQxOCxNaXNkaXJlY3RlZFJlcXVlc3Q6NDIxLFVucHJvY2Vzc2FibGVFbnRpdHk6NDIyLExvY2tlZDo0MjMsRmFpbGVkRGVwZW5kZW5jeTo0MjQsVG9vRWFybHk6NDI1LFVwZ3JhZGVSZXF1aXJlZDo0MjYsUHJlY29uZGl0aW9uUmVxdWlyZWQ6NDI4LFRvb01hbnlSZXF1ZXN0czo0MjksUmVxdWVzdEhlYWRlckZpZWxkc1Rvb0xhcmdlOjQzMSxVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczo0NTEsSW50ZXJuYWxTZXJ2ZXJFcnJvcjo1MDAsTm90SW1wbGVtZW50ZWQ6NTAxLEJhZEdhdGV3YXk6NTAyLFNlcnZpY2VVbmF2YWlsYWJsZTo1MDMsR2F0ZXdheVRpbWVvdXQ6NTA0LEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOjUwNSxWYXJpYW50QWxzb05lZ290aWF0ZXM6NTA2LEluc3VmZmljaWVudFN0b3JhZ2U6NTA3LExvb3BEZXRlY3RlZDo1MDgsTm90RXh0ZW5kZWQ6NTEwLE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkOjUxMSxXZWJTZXJ2ZXJJc0Rvd246NTIxLENvbm5lY3Rpb25UaW1lZE91dDo1MjIsT3JpZ2luSXNVbnJlYWNoYWJsZTo1MjMsVGltZW91dE9jY3VycmVkOjUyNCxTc2xIYW5kc2hha2VGYWlsZWQ6NTI1LEludmFsaWRTc2xDZXJ0aWZpY2F0ZTo1MjZ9O09iamVjdC5lbnRyaWVzKGplKS5mb3JFYWNoKChbQSxlXSk9PntqZVtlXT1BfSk7dmFyIEt0PWplO2Z1bmN0aW9uIFd0KEEpe2xldCBlPW5ldyBiQShBKSx0PXlBKGJBLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBuLmV4dGVuZCh0LGJBLnByb3RvdHlwZSxlLHthbGxPd25LZXlzOiEwfSksbi5leHRlbmQodCxlLG51bGwse2FsbE93bktleXM6ITB9KSx0LmNyZWF0ZT1mdW5jdGlvbihJKXtyZXR1cm4gV3QoeChBLEkpKX0sdH12YXIgUz1XdChRQSk7Uy5BeGlvcz1iQTtTLkNhbmNlbGVkRXJyb3I9ajtTLkNhbmNlbFRva2VuPVB0O1MuaXNDYW5jZWw9TkE7Uy5WRVJTSU9OPWxBO1MudG9Gb3JtRGF0YT1YO1MuQXhpb3NFcnJvcj1kO1MuQ2FuY2VsPVMuQ2FuY2VsZWRFcnJvcjtTLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9O1Muc3ByZWFkPUtlO1MuaXNBeGlvc0Vycm9yPVdlO1MubWVyZ2VDb25maWc9eDtTLkF4aW9zSGVhZGVycz1SO1MuZm9ybVRvSlNPTj1BPT5BZShuLmlzSFRNTEZvcm0oQSk/bmV3IEZvcm1EYXRhKEEpOkEpO1MuZ2V0QWRhcHRlcj1yZS5nZXRBZGFwdGVyO1MuSHR0cFN0YXR1c0NvZGU9S3Q7Uy5kZWZhdWx0PVM7dmFyIGZBPVM7dmFye0F4aW9zOnNhLEF4aW9zRXJyb3I6Q2EsQ2FuY2VsZWRFcnJvcjpCYSxpc0NhbmNlbDpRYSxDYW5jZWxUb2tlbjpFYSxWRVJTSU9OOmxhLGFsbDpjYSxDYW5jZWw6ZmEsaXNBeGlvc0Vycm9yOnVhLHNwcmVhZDpkYSx0b0Zvcm1EYXRhOnBhLEF4aW9zSGVhZGVyczpoYSxIdHRwU3RhdHVzQ29kZTp5YSxmb3JtVG9KU09OOkRhLGdldEFkYXB0ZXI6d2EsbWVyZ2VDb25maWc6bWEsY3JlYXRlOlJhfT1mQTthc3luYyBmdW5jdGlvbiBvaShBLGUpe2xldCB0PUEscj1udWxsO2lmKHQ9PW51bGwpcj1uZXcgV29ya2VyKG5ldyBVUkwoIi4vd2ViLXdvcmtlcnMvaXRrLXdhc20tcGlwZWxpbmUud29ya2VyLmpzIixpbXBvcnQubWV0YS51cmwpLHt0eXBlOiJtb2R1bGUifSk7ZWxzZSBpZih0LnN0YXJ0c1dpdGgoImh0dHAiKSl7bGV0IEk9YXdhaXQgZkEuZ2V0KHQse3Jlc3BvbnNlVHlwZToiYmxvYiIscGFyYW1zOmV9KSxpPVVSTC5jcmVhdGVPYmplY3RVUkwoSS5kYXRhKTtyPW5ldyBXb3JrZXIoaSx7dHlwZToibW9kdWxlIn0pfWVsc2Ugcj1uZXcgV29ya2VyKHQse3R5cGU6Im1vZHVsZSJ9KTtyZXR1cm4gcn12YXIgTEE9b2k7ZnVuY3Rpb24ganQoQSl7bGV0IGU9ZmUoQSksdD1BO3JldHVybiB0LnRlcm1pbmF0ZWQ9ITEsdC53b3JrZXJQcm94eT1lLHQub3JpZ2luYWxUZXJtaW5hdGU9dC50ZXJtaW5hdGUsdC50ZXJtaW5hdGU9KCk9Pnt0LnRlcm1pbmF0ZWQ9ITAsdC53b3JrZXJQcm94eVtjZV0oKSx0Lm9yaWdpbmFsVGVybWluYXRlKCl9LHt3b3JrZXJQcm94eTplLHdvcmtlcjp0fX1hc3luYyBmdW5jdGlvbiBnaShBLGUsdCl7bGV0IHI7aWYoQSE9bnVsbCl7bGV0IGk9QTtyZXR1cm4gaS53b3JrZXJQcm94eSE9PXZvaWQgMD8ocj1pLndvcmtlclByb3h5LHt3b3JrZXJQcm94eTpyLHdvcmtlcjppfSk6anQoQSl9bGV0IEk9YXdhaXQgTEEoZSx0KTtyZXR1cm4ganQoSSl9dmFyIF90PWdpO3ZhciBKQSx2LHZlLF9lPXtlbnY6e2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6ZnVuY3Rpb24oQSl7dmU9bmV3IFVpbnQ4QXJyYXkodi5leHBvcnRzLm1lbW9yeS5idWZmZXIpfX19LG9lPWNsYXNze2luaXQoKXtyZXR1cm4gSkF8fCh0eXBlb2YgZmV0Y2g8InUiP0pBPWZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL3dhc207YmFzZTY0LCIrdnQpLnRoZW4oZT0+ZS5hcnJheUJ1ZmZlcigpKS50aGVuKGU9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsX2UpKS50aGVuKHRoaXMuX2luaXQpOkpBPVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEJ1ZmZlci5mcm9tKHZ0LCJiYXNlNjQiKSxfZSkudGhlbih0aGlzLl9pbml0KSxKQSl9X2luaXQoZSl7dj1lLmluc3RhbmNlLF9lLmVudi5lbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoKDApfWRlY29kZShlLHQ9MCl7aWYoIXYpdGhyb3cgbmV3IEVycm9yKCJaU1RERGVjb2RlcjogQXdhaXQgLmluaXQoKSBiZWZvcmUgZGVjb2RpbmcuIik7bGV0IHI9ZS5ieXRlTGVuZ3RoLEk9di5leHBvcnRzLm1hbGxvYyhyKTt2ZS5zZXQoZSxJKSx0PXR8fE51bWJlcih2LmV4cG9ydHMuWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZShJLHIpKTtsZXQgaT12LmV4cG9ydHMubWFsbG9jKHQpLG89di5leHBvcnRzLlpTVERfZGVjb21wcmVzcyhpLHQsSSxyKSxnPXZlLnNsaWNlKGksaStvKTtyZXR1cm4gdi5leHBvcnRzLmZyZWUoSSksdi5leHBvcnRzLmZyZWUoaSksZ319LHZ0PSJBR0Z6YlFFQUFBQUJiZzVnQTM5L2Z3Ri9ZQUYvQVg5Z0FuOS9BR0FCZndCZ0JYOS9mMzkvQVg5Z0EzOS9md0JnQkg5L2YzOEJmMkFBQVg5Z0FuOS9BWDlnQjM5L2YzOS9mMzhCZjJBQ2YzOEJmbUFJZjM5L2YzOS9mMzhCZjJBRmYzOS9mMzhBWUE1L2YzOS9mMzkvZjM5L2YzOS9md0YvQWljQkEyVnVkaDlsYlhOamNtbHdkR1Z1WDI1dmRHbG1lVjl0WlcxdmNubGZaM0p2ZDNSb0FBTURJeUlIQUFBQkFRTUhBd0VBQ1FRQUJRRUlDQUVGQmdRRUJBTUdBQUFLQUFVTERBMEdCQVVCY0FFQkFRVUhBUUdBQW9DQUFnWUlBWDhCUVlDakJBc0hyZ0VMQm0xbGJXOXllUUlBQm0xaGJHeHZZd0FGQkdaeVpXVUFCZ3hhVTFSRVgybHpSWEp5YjNJQUVobGFVMVJFWDJacGJtUkVaV052YlhCeVpYTnpaV1JUYVhwbEFCd1BXbE5VUkY5a1pXTnZiWEJ5WlhOekFDSVpYMTlwYm1ScGNtVmpkRjltZFc1amRHbHZibDkwWVdKc1pRRUFFRjlmWlhKeWJtOWZiRzlqWVhScGIyNEFBUWx6ZEdGamExTmhkbVVBQnd4emRHRmphMUpsYzNSdmNtVUFDQXB6ZEdGamEwRnNiRzlqQUFrS2kvSUJJZ1VBUVlRZkN6TUJBWDhnQWdSQUlBQWhBd05BSUFNZ0FTMEFBRG9BQUNBRFFRRnFJUU1nQVVFQmFpRUJJQUpCQVdzaUFnMEFDd3NnQUFzcEFRRi9JQUlFUUNBQUlRTURRQ0FESUFFNkFBQWdBMEVCYWlFRElBSkJBV3NpQWcwQUN3c2dBQXRzQVFKL1FZQWZLQUlBSWdFZ0FFRUhha0Y0Y1NJQ2FpRUFBa0FnQWtFQUlBQWdBVTBiRFFBZ0FEOEFRUkIwU3dSQUlBQS9BRUVRZEd0Qi8vOERha0VRZGtBQVFYOUdCSDlCQUFWQkFCQUFRUUVMUlEwQkMwR0FIeUFBTmdJQUlBRVBDMEdFSDBFd05nSUFRWDhMdVNjQkMzOGpBRUVRYXlJS0pBQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCOUFGTkJFQkJpQjhvQWdBaUJrRVFJQUJCQzJwQmVIRWdBRUVMU1JzaUJVRURkaUlBZGlJQlFRTnhCRUFDUUNBQlFYOXpRUUZ4SUFCcUlnSkJBM1FpQVVHd0gyb2lBQ0FCUWJnZmFpZ0NBQ0lCS0FJSUlnUkdCRUJCaUI4Z0JrRitJQUozY1RZQ0FBd0JDeUFFSUFBMkFnd2dBQ0FFTmdJSUN5QUJRUWhxSVFBZ0FTQUNRUU4wSWdKQkEzSTJBZ1FnQVNBQ2FpSUJJQUVvQWdSQkFYSTJBZ1FNRHdzZ0JVR1FIeWdDQUNJSFRRMEJJQUVFUUFKQVFRSWdBSFFpQWtFQUlBSnJjaUFCSUFCMGNXZ2lBVUVEZENJQVFiQWZhaUlDSUFCQnVCOXFLQUlBSWdBb0FnZ2lCRVlFUUVHSUh5QUdRWDRnQVhkeElnWTJBZ0FNQVFzZ0JDQUNOZ0lNSUFJZ0JEWUNDQXNnQUNBRlFRTnlOZ0lFSUFBZ0JXb2lDQ0FCUVFOMElnRWdCV3NpQkVFQmNqWUNCQ0FBSUFGcUlBUTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRRkJuQjhvQWdBaEFnSi9JQVpCQVNBSFFRTjJkQ0lEY1VVRVFFR0lIeUFESUFaeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQXlBQklBSTJBZ2dnQXlBQ05nSU1JQUlnQVRZQ0RDQUNJQU0yQWdnTElBQkJDR29oQUVHY0h5QUlOZ0lBUVpBZklBUTJBZ0FNRHd0QmpCOG9BZ0FpQzBVTkFTQUxhRUVDZEVHNElXb29BZ0FpQWlnQ0JFRjRjU0FGYXlFRElBSWhBUU5BQWtBZ0FTZ0NFQ0lBUlFSQUlBRW9BaFFpQUVVTkFRc2dBQ2dDQkVGNGNTQUZheUlCSUFNZ0FTQURTU0lCR3lFRElBQWdBaUFCR3lFQ0lBQWhBUXdCQ3dzZ0FpZ0NHQ0VKSUFJZ0FpZ0NEQ0lFUndSQVFaZ2ZLQUlBR2lBQ0tBSUlJZ0FnQkRZQ0RDQUVJQUEyQWdnTURnc2dBa0VVYWlJQktBSUFJZ0JGQkVBZ0FpZ0NFQ0lBUlEwRElBSkJFR29oQVFzRFFDQUJJUWdnQUNJRVFSUnFJZ0VvQWdBaUFBMEFJQVJCRUdvaEFTQUVLQUlRSWdBTkFBc2dDRUVBTmdJQURBMExRWDhoQlNBQVFiOS9TdzBBSUFCQkMyb2lBRUY0Y1NFRlFZd2ZLQUlBSWdoRkRRQkJBQ0FGYXlFREFrQUNRQUpBQW45QkFDQUZRWUFDU1EwQUdrRWZJQVZCLy8vL0Iwc05BQm9nQlVFbUlBQkJDSFpuSWdCcmRrRUJjU0FBUVFGMGEwRSthZ3NpQjBFQ2RFRzRJV29vQWdBaUFVVUVRRUVBSVFBTUFRdEJBQ0VBSUFWQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQ0EwQUNRQ0FCS0FJRVFYaHhJQVZySWdZZ0EwOE5BQ0FCSVFRZ0JpSUREUUJCQUNFRElBRWhBQXdEQ3lBQUlBRW9BaFFpQmlBR0lBRWdBa0VkZGtFRWNXb29BaEFpQVVZYklBQWdCaHNoQUNBQ1FRRjBJUUlnQVEwQUN3c2dBQ0FFY2tVRVFFRUFJUVJCQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FHaEJBblJCdUNGcUtBSUFJUUFMSUFCRkRRRUxBMEFnQUNnQ0JFRjRjU0FGYXlJQ0lBTkpJUUVnQWlBRElBRWJJUU1nQUNBRUlBRWJJUVFnQUNnQ0VDSUJCSDhnQVFVZ0FDZ0NGQXNpQUEwQUN3c2dCRVVOQUNBRFFaQWZLQUlBSUFWclR3MEFJQVFvQWhnaEJ5QUVJQVFvQWd3aUFrY0VRRUdZSHlnQ0FCb2dCQ2dDQ0NJQUlBSTJBZ3dnQWlBQU5nSUlEQXdMSUFSQkZHb2lBU2dDQUNJQVJRUkFJQVFvQWhBaUFFVU5BeUFFUVJCcUlRRUxBMEFnQVNFR0lBQWlBa0VVYWlJQktBSUFJZ0FOQUNBQ1FSQnFJUUVnQWlnQ0VDSUFEUUFMSUFaQkFEWUNBQXdMQ3lBRlFaQWZLQUlBSWdSTkJFQkJuQjhvQWdBaEFBSkFJQVFnQldzaUFVRVFUd1JBSUFBZ0JXb2lBaUFCUVFGeU5nSUVJQUFnQkdvZ0FUWUNBQ0FBSUFWQkEzSTJBZ1FNQVFzZ0FDQUVRUU55TmdJRUlBQWdCR29pQVNBQktBSUVRUUZ5TmdJRVFRQWhBa0VBSVFFTFFaQWZJQUUyQWdCQm5COGdBallDQUNBQVFRaHFJUUFNRFFzZ0JVR1VIeWdDQUNJQ1NRUkFRWlFmSUFJZ0JXc2lBVFlDQUVHZ0gwR2dIeWdDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxSVFBTURRdEJBQ0VBSUFWQkwyb2lBd0ovUWVBaUtBSUFCRUJCNkNJb0FnQU1BUXRCN0NKQ2Z6Y0NBRUhrSWtLQW9JQ0FnSUFFTndJQVFlQWlJQXBCREdwQmNIRkIyS3JWcWdWek5nSUFRZlFpUVFBMkFnQkJ4Q0pCQURZQ0FFR0FJQXNpQVdvaUJrRUFJQUZySWdoeElnRWdCVTBOREVIQUlpZ0NBQ0lFQkVCQnVDSW9BZ0FpQnlBQmFpSUpJQWROSUFRZ0NVbHlEUTBMQWtCQnhDSXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFR2dIeWdDQUNJRUJFQkJ5Q0loQUFOQUlBUWdBQ2dDQUNJSFR3UkFJQWNnQUNnQ0JHb2dCRXNOQXdzZ0FDZ0NDQ0lBRFFBTEMwRUFFQVFpQWtGL1JnMERJQUVoQmtIa0lpZ0NBQ0lBUVFGcklnUWdBbkVFUUNBQklBSnJJQUlnQkdwQkFDQUFhM0ZxSVFZTElBVWdCazhOQTBIQUlpZ0NBQ0lBQkVCQnVDSW9BZ0FpQkNBR2FpSUlJQVJOSUFBZ0NFbHlEUVFMSUFZUUJDSUFJQUpIRFFFTUJRc2dCaUFDYXlBSWNTSUdFQVFpQWlBQUtBSUFJQUFvQWdScVJnMEJJQUloQUFzZ0FFRi9SZzBCSUFWQk1Hb2dCazBFUUNBQUlRSU1CQXRCNkNJb0FnQWlBaUFESUFacmFrRUFJQUpyY1NJQ0VBUkJmMFlOQVNBQ0lBWnFJUVlnQUNFQ0RBTUxJQUpCZjBjTkFndEJ4Q0pCeENJb0FnQkJCSEkyQWdBTElBRVFCQ0lDUVg5R1FRQVFCQ0lBUVg5R2NpQUFJQUpOY2cwRklBQWdBbXNpQmlBRlFTaHFUUTBGQzBHNElrRzRJaWdDQUNBR2FpSUFOZ0lBUWJ3aUtBSUFJQUJKQkVCQnZDSWdBRFlDQUFzQ1FFR2dIeWdDQUNJREJFQkJ5Q0loQUFOQUlBSWdBQ2dDQUNJQklBQW9BZ1FpQkdwR0RRSWdBQ2dDQ0NJQURRQUxEQVFMUVpnZktBSUFJZ0JCQUNBQUlBSk5HMFVFUUVHWUh5QUNOZ0lBQzBFQUlRQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFhZ2ZRWDgyQWdCQnJCOUI0Q0lvQWdBMkFnQkIxQ0pCQURZQ0FBTkFJQUJCQTNRaUFVRzRIMm9nQVVHd0gyb2lCRFlDQUNBQlFid2ZhaUFFTmdJQUlBQkJBV29pQUVFZ1J3MEFDMEdVSHlBR1FTaHJJZ0JCZUNBQ2EwRUhjU0lCYXlJRU5nSUFRYUFmSUFFZ0Ftb2lBVFlDQUNBQklBUkJBWEkyQWdRZ0FDQUNha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQVFMSUFJZ0EwMGdBU0FEUzNJTkFpQUFLQUlNUVFoeERRSWdBQ0FFSUFacU5nSUVRYUFmSUFOQmVDQURhMEVIY1NJQWFpSUJOZ0lBUVpRZlFaUWZLQUlBSUFacUlnSWdBR3NpQURZQ0FDQUJJQUJCQVhJMkFnUWdBaUFEYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFNTFFRQWhCQXdLQzBFQUlRSU1DQXRCbUI4b0FnQWdBa3NFUUVHWUh5QUNOZ0lBQ3lBQ0lBWnFJUUZCeUNJaEFBSkFBa0FDUUFOQUlBRWdBQ2dDQUVjRVFDQUFLQUlJSWdBTkFRd0NDd3NnQUMwQURFRUljVVVOQVF0QnlDSWhBQU5BSUFNZ0FDZ0NBQ0lCVHdSQUlBRWdBQ2dDQkdvaUJDQURTdzBEQ3lBQUtBSUlJUUFNQUFzQUN5QUFJQUkyQWdBZ0FDQUFLQUlFSUFacU5nSUVJQUpCZUNBQ2EwRUhjV29pQnlBRlFRTnlOZ0lFSUFGQmVDQUJhMEVIY1dvaUJpQUZJQWRxSWdWcklRQWdBeUFHUmdSQVFhQWZJQVUyQWdCQmxCOUJsQjhvQWdBZ0FHb2lBRFlDQUNBRklBQkJBWEkyQWdRTUNBdEJuQjhvQWdBZ0JrWUVRRUdjSHlBRk5nSUFRWkFmUVpBZktBSUFJQUJxSWdBMkFnQWdCU0FBUVFGeU5nSUVJQUFnQldvZ0FEWUNBQXdJQ3lBR0tBSUVJZ05CQTNGQkFVY05CaUFEUVhoeElRa2dBMEgvQVUwRVFDQUdLQUlNSWdFZ0JpZ0NDQ0lDUmdSQVFZZ2ZRWWdmS0FJQVFYNGdBMEVEZG5keE5nSUFEQWNMSUFJZ0FUWUNEQ0FCSUFJMkFnZ01CZ3NnQmlnQ0dDRUlJQVlnQmlnQ0RDSUNSd1JBSUFZb0FnZ2lBU0FDTmdJTUlBSWdBVFlDQ0F3RkN5QUdRUlJxSWdFb0FnQWlBMFVFUUNBR0tBSVFJZ05GRFFRZ0JrRVFhaUVCQ3dOQUlBRWhCQ0FESWdKQkZHb2lBU2dDQUNJRERRQWdBa0VRYWlFQklBSW9BaEFpQXcwQUN5QUVRUUEyQWdBTUJBdEJsQjhnQmtFb2F5SUFRWGdnQW10QkIzRWlBV3NpQ0RZQ0FFR2dIeUFCSUFKcUlnRTJBZ0FnQVNBSVFRRnlOZ0lFSUFBZ0FtcEJLRFlDQkVHa0gwSHdJaWdDQURZQ0FDQURJQVJCSnlBRWEwRUhjV3BCTDJzaUFDQUFJQU5CRUdwSkd5SUJRUnMyQWdRZ0FVSFFJaWtDQURjQ0VDQUJRY2dpS1FJQU53SUlRZEFpSUFGQkNHbzJBZ0JCekNJZ0JqWUNBRUhJSWlBQ05nSUFRZFFpUVFBMkFnQWdBVUVZYWlFQUEwQWdBRUVITmdJRUlBQkJDR29nQUVFRWFpRUFJQVJKRFFBTElBRWdBMFlOQUNBQklBRW9BZ1JCZm5FMkFnUWdBeUFCSUFOcklnSkJBWEkyQWdRZ0FTQUNOZ0lBSUFKQi93Rk5CRUFnQWtGNGNVR3dIMm9oQUFKL1FZZ2ZLQUlBSWdGQkFTQUNRUU4yZENJQ2NVVUVRRUdJSHlBQklBSnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEFTQUFJQU0yQWdnZ0FTQUROZ0lNSUFNZ0FEWUNEQ0FESUFFMkFnZ01BUXRCSHlFQUlBSkIvLy8vQjAwRVFDQUNRU1lnQWtFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUlRQUxJQU1nQURZQ0hDQURRZ0EzQWhBZ0FFRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlCRUVCSUFCMElnWnhSUVJBUVl3ZklBUWdCbkkyQWdBZ0FTQUROZ0lBREFFTElBSkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJBTkFJQVFpQVNnQ0JFRjRjU0FDUmcwQ0lBQkJIWFloQkNBQVFRRjBJUUFnQVNBRVFRUnhhaUlHS0FJUUlnUU5BQXNnQmlBRE5nSVFDeUFESUFFMkFoZ2dBeUFETmdJTUlBTWdBellDQ0F3QkN5QUJLQUlJSWdBZ0F6WUNEQ0FCSUFNMkFnZ2dBMEVBTmdJWUlBTWdBVFlDRENBRElBQTJBZ2dMUVpRZktBSUFJZ0FnQlUwTkFFR1VIeUFBSUFWcklnRTJBZ0JCb0I5Qm9COG9BZ0FpQUNBRmFpSUNOZ0lBSUFJZ0FVRUJjallDQkNBQUlBVkJBM0kyQWdRZ0FFRUlhaUVBREFnTFFZUWZRVEEyQWdCQkFDRUFEQWNMUVFBaEFnc2dDRVVOQUFKQUlBWW9BaHdpQVVFQ2RFRzRJV29pQkNnQ0FDQUdSZ1JBSUFRZ0FqWUNBQ0FDRFFGQmpCOUJqQjhvQWdCQmZpQUJkM0UyQWdBTUFnc2dDRUVRUVJRZ0NDZ0NFQ0FHUmh0cUlBSTJBZ0FnQWtVTkFRc2dBaUFJTmdJWUlBWW9BaEFpQVFSQUlBSWdBVFlDRUNBQklBSTJBaGdMSUFZb0FoUWlBVVVOQUNBQ0lBRTJBaFFnQVNBQ05nSVlDeUFBSUFscUlRQWdCaUFKYWlJR0tBSUVJUU1MSUFZZ0EwRitjVFlDQkNBRklBQkJBWEkyQWdRZ0FDQUZhaUFBTmdJQUlBQkIvd0ZOQkVBZ0FFRjRjVUd3SDJvaEFRSi9RWWdmS0FJQUlnSkJBU0FBUVFOMmRDSUFjVVVFUUVHSUh5QUFJQUp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFVMkFnZ2dBQ0FGTmdJTUlBVWdBVFlDRENBRklBQTJBZ2dNQVF0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFVZ0F6WUNIQ0FGUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQWtFQklBTjBJZ1J4UlFSQVFZd2ZJQUlnQkhJMkFnQWdBU0FGTmdJQURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBZ05BSUFJaUFTZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFpQURRUUYwSVFNZ0FTQUNRUVJ4YWlJRUtBSVFJZ0lOQUFzZ0JDQUZOZ0lRQ3lBRklBRTJBaGdnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFCS0FJSUlnQWdCVFlDRENBQklBVTJBZ2dnQlVFQU5nSVlJQVVnQVRZQ0RDQUZJQUEyQWdnTElBZEJDR29oQUF3Q0N3SkFJQWRGRFFBQ1FDQUVLQUljSWdCQkFuUkJ1Q0ZxSWdFb0FnQWdCRVlFUUNBQklBSTJBZ0FnQWcwQlFZd2ZJQWhCZmlBQWQzRWlDRFlDQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQVJHRzJvZ0FqWUNBQ0FDUlEwQkN5QUNJQWMyQWhnZ0JDZ0NFQ0lBQkVBZ0FpQUFOZ0lRSUFBZ0FqWUNHQXNnQkNnQ0ZDSUFSUTBBSUFJZ0FEWUNGQ0FBSUFJMkFoZ0xBa0FnQTBFUFRRUkFJQVFnQXlBRmFpSUFRUU55TmdJRUlBQWdCR29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQVFnQlVFRGNqWUNCQ0FFSUFWcUlnSWdBMEVCY2pZQ0JDQUNJQU5xSUFNMkFnQWdBMEgvQVUwRVFDQURRWGh4UWJBZmFpRUFBbjlCaUI4b0FnQWlBVUVCSUFOQkEzWjBJZ054UlFSQVFZZ2ZJQUVnQTNJMkFnQWdBQXdCQ3lBQUtBSUlDeUVCSUFBZ0FqWUNDQ0FCSUFJMkFnd2dBaUFBTmdJTUlBSWdBVFlDQ0F3QkMwRWZJUUFnQTBILy8vOEhUUVJBSUFOQkppQURRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0FpQUFOZ0ljSUFKQ0FEY0NFQ0FBUVFKMFFiZ2hhaUVCQWtBQ1FDQUlRUUVnQUhRaUJuRkZCRUJCakI4Z0JpQUljallDQUNBQklBSTJBZ0FNQVFzZ0EwRVpJQUJCQVhaclFRQWdBRUVmUnh0MElRQWdBU2dDQUNFRkEwQWdCU0lCS0FJRVFYaHhJQU5HRFFJZ0FFRWRkaUVHSUFCQkFYUWhBQ0FCSUFaQkJIRnFJZ1lvQWhBaUJRMEFDeUFHSUFJMkFoQUxJQUlnQVRZQ0dDQUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBRW9BZ2dpQUNBQ05nSU1JQUVnQWpZQ0NDQUNRUUEyQWhnZ0FpQUJOZ0lNSUFJZ0FEWUNDQXNnQkVFSWFpRUFEQUVMQWtBZ0NVVU5BQUpBSUFJb0Fod2lBRUVDZEVHNElXb2lBU2dDQUNBQ1JnUkFJQUVnQkRZQ0FDQUVEUUZCakI4Z0MwRitJQUIzY1RZQ0FBd0NDeUFKUVJCQkZDQUpLQUlRSUFKR0cyb2dCRFlDQUNBRVJRMEJDeUFFSUFrMkFoZ2dBaWdDRUNJQUJFQWdCQ0FBTmdJUUlBQWdCRFlDR0FzZ0FpZ0NGQ0lBUlEwQUlBUWdBRFlDRkNBQUlBUTJBaGdMQWtBZ0EwRVBUUVJBSUFJZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQW1vaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFJZ0JVRURjallDQkNBQ0lBVnFJZ1FnQTBFQmNqWUNCQ0FESUFScUlBTTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRQkJuQjhvQWdBaEFRSi9RUUVnQjBFRGRuUWlCU0FHY1VVRVFFR0lIeUFGSUFaeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQmlBQUlBRTJBZ2dnQmlBQk5nSU1JQUVnQURZQ0RDQUJJQVkyQWdnTFFad2ZJQVEyQWdCQmtCOGdBellDQUFzZ0FrRUlhaUVBQ3lBS1FSQnFKQUFnQUF2U0N3RUhmd0pBSUFCRkRRQWdBRUVJYXlJQ0lBQkJCR3NvQWdBaUFVRjRjU0lBYWlFRkFrQWdBVUVCY1EwQUlBRkJBM0ZGRFFFZ0FpQUNLQUlBSWdGcklnSkJtQjhvQWdCSkRRRWdBQ0FCYWlFQUFrQUNRRUdjSHlnQ0FDQUNSd1JBSUFGQi93Rk5CRUFnQVVFRGRpRUVJQUlvQWd3aUFTQUNLQUlJSWdOR0JFQkJpQjlCaUI4b0FnQkJmaUFFZDNFMkFnQU1CUXNnQXlBQk5nSU1JQUVnQXpZQ0NBd0VDeUFDS0FJWUlRWWdBaUFDS0FJTUlnRkhCRUFnQWlnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBSkJGR29pQkNnQ0FDSURSUVJBSUFJb0FoQWlBMFVOQWlBQ1FSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZLQUlFSWdGQkEzRkJBMGNOQWtHUUh5QUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0JTQUFOZ0lBRHd0QkFDRUJDeUFHUlEwQUFrQWdBaWdDSENJRFFRSjBRYmdoYWlJRUtBSUFJQUpHQkVBZ0JDQUJOZ0lBSUFFTkFVR01IMEdNSHlnQ0FFRitJQU4zY1RZQ0FBd0NDeUFHUVJCQkZDQUdLQUlRSUFKR0cyb2dBVFlDQUNBQlJRMEJDeUFCSUFZMkFoZ2dBaWdDRUNJREJFQWdBU0FETmdJUUlBTWdBVFlDR0FzZ0FpZ0NGQ0lEUlEwQUlBRWdBellDRkNBRElBRTJBaGdMSUFJZ0JVOE5BQ0FGS0FJRUlnRkJBWEZGRFFBQ1FBSkFBa0FDUUNBQlFRSnhSUVJBUWFBZktBSUFJQVZHQkVCQm9COGdBallDQUVHVUgwR1VIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1Fad2ZLQUlBUncwR1FaQWZRUUEyQWdCQm5COUJBRFlDQUE4TFFad2ZLQUlBSUFWR0JFQkJuQjhnQWpZQ0FFR1FIMEdRSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQVBDeUFCUVhoeElBQnFJUUFnQVVIL0FVMEVRQ0FCUVFOMklRUWdCU2dDRENJQklBVW9BZ2dpQTBZRVFFR0lIMEdJSHlnQ0FFRitJQVIzY1RZQ0FBd0ZDeUFESUFFMkFnd2dBU0FETmdJSURBUUxJQVVvQWhnaEJpQUZJQVVvQWd3aUFVY0VRRUdZSHlnQ0FCb2dCU2dDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFWQkZHb2lCQ2dDQUNJRFJRUkFJQVVvQWhBaUEwVU5BaUFGUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRklBRkJmbkUyQWdRZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FBd0RDMEVBSVFFTElBWkZEUUFDUUNBRktBSWNJZ05CQW5SQnVDRnFJZ1FvQWdBZ0JVWUVRQ0FFSUFFMkFnQWdBUTBCUVl3ZlFZd2ZLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBRktBSVFJZ01FUUNBQklBTTJBaEFnQXlBQk5nSVlDeUFGS0FJVUlnTkZEUUFnQVNBRE5nSVVJQU1nQVRZQ0dBc2dBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQ0FDUVp3ZktBSUFSdzBBUVpBZklBQTJBZ0FQQ3lBQVFmOEJUUVJBSUFCQmVIRkJzQjlxSVFFQ2YwR0lIeWdDQUNJRFFRRWdBRUVEZG5RaUFIRkZCRUJCaUI4Z0FDQURjallDQUNBQkRBRUxJQUVvQWdnTElRQWdBU0FDTmdJSUlBQWdBallDRENBQ0lBRTJBZ3dnQWlBQU5nSUlEd3RCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQUlnQXpZQ0hDQUNRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0FDUUVHTUh5Z0NBQ0lFUVFFZ0EzUWlCM0ZGQkVCQmpCOGdCQ0FIY2pZQ0FDQUJJQUkyQWdBZ0FpQUJOZ0lZREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFRTkFJQUVpQkNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQVNBRFFRRjBJUU1nQkNBQlFRUnhhaUlIUVJCcUtBSUFJZ0VOQUFzZ0J5QUNOZ0lRSUFJZ0JEWUNHQXNnQWlBQ05nSU1JQUlnQWpZQ0NBd0JDeUFFS0FJSUlnQWdBallDRENBRUlBSTJBZ2dnQWtFQU5nSVlJQUlnQkRZQ0RDQUNJQUEyQWdnTFFhZ2ZRYWdmS0FJQVFRRnJJZ0JCZnlBQUd6WUNBQXNMQkFBakFBc0dBQ0FBSkFBTEVBQWpBQ0FBYTBGd2NTSUFKQUFnQUF0S0FRRi9JQUFnQVVrRVFDQUFJQUVnQWhBQ0R3c2dBZ1JBSUFBZ0Ftb2hBeUFCSUFKcUlRRURRQ0FEUVFGcklnTWdBVUVCYXlJQkxRQUFPZ0FBSUFKQkFXc2lBZzBBQ3dzZ0FBdjlEZ0lSZndGK0l3QkJNR3NpQnlRQVFiaC9JUWdDUUNBRlJRMEFJQVFzQUFBaUNVSC9BWEVoQ3dKQUlBbEJBRWdFUUNBTFFmNEFhMEVCZGlJR0lBVlBEUUpCYkNFSUlBdEIvd0JySWd0Qi93RkxEUUlnQkVFQmFpRUlRUUFoQlFOQUlBVWdDMDhFUUNBTElRZ2dCaUVMREFNRklBQWdCV29nQ0NBRlFRRjJhaUlFTFFBQVFRUjJPZ0FBSUFBZ0JVRUJjbW9nQkMwQUFFRVBjVG9BQUNBRlFRSnFJUVVNQVFzQUN3QUxJQVVnQzAwTkFTQUhRZjhCTmdJRUlBWWdCMEVFYWlBSFFRaHFJQVJCQVdvaURpQUxFQXdpQkVHSWYwc0VRQ0FFSVFnTUFndEJWQ0VJSUFjb0FnZ2lFRUVHU3cwQklBY29BZ1FpRVVFQmRDSUpRUUpxclVJQklCQ3RoaUlZUVFFZ0VIUWlEVUVCYWlJRnJVSUNobng4UWd0OFF2ei8vLy8vLy8vLy93Q0RRdVFDVmcwQlFWSWhDQ0FSUWY4QlN3MEJJQTFCZjNOQkFuUkI1QUpxclNBUlFRRnFJaFZCQVhTdElCaDhRZ2g4VkEwQklBc2dCR3NoRmlBRUlBNXFJUmNnQmtHQUJHb2lFaUFGUVFKMGFpSVJJQWxxUVFKcUlRNGdCa0dFQkdvaEUwR0FnQUlnRUhSQkVIWWhDVUVBSVFWQkFTRVBJQTFCQVdzaUZDRUtBMEFnQlNBVlJrVUVRQUpBSUFZZ0JVRUJkQ0lJYWk4QkFDSUVRZi8vQTBZRVFDQVRJQXBCQW5ScUlBVTZBQUlnQ2tFQmF5RUtRUUVoQkF3QkN5QVBRUUFnQ1NBRXdVb2JJUThMSUFnZ0VXb2dCRHNCQUNBRlFRRnFJUVVNQVFzTElBWWdEenNCZ2dRZ0JpQVFPd0dBQkFKQUlBb2dGRVlFUUNBTlFRTjJJUWhDQUNFWVFRQWhEd05BSUF3Z0ZVWUVRQ0FJSUExQkFYWnFRUU5xSWdsQkFYUWhDRUVBSVFSQkFDRUtBMEJCQUNFRklBb2dEVThOQkFOQUlBVkJBa1pGQkVBZ0V5QUZJQWxzSUFScUlCUnhRUUowYWlBT0lBVWdDbXBxTFFBQU9nQUNJQVZCQVdvaEJRd0JDd3NnQ2tFQ2FpRUtJQVFnQ0dvZ0ZIRWhCQXdBQ3dBRklBWWdERUVCZEdvdUFRQWhDU0FPSUE5cUlnUWdHRGNBQUVFSUlRVURRQ0FGSUFsT1JRUkFJQVFnQldvZ0dEY0FBQ0FGUVFocUlRVU1BUXNMSUJoQ2dZS0VpSkNnd0lBQmZDRVlJQXhCQVdvaERDQUpJQTlxSVE4TUFRc0FDd0FMSUExQkEzWWdEVUVCZG1wQkEyb2hDRUVBSVFVRFFDQU1JQlZHUlFSQVFRQWhDU0FHSUF4QkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FKUmtVRVFDQVRJQVZCQW5ScUlBdzZBQUlEUUNBRklBaHFJQlJ4SWdVZ0Nrc05BQXNnQ1VFQmFpRUpEQUVMQ3lBTVFRRnFJUXdNQVFzTFFYOGhDQ0FGRFFJTElCQkJBV29oQ0VFQUlRVURRQ0FGSUExR1JRUkFJQkVnRXlBRlFRSjBhaUlPTFFBQ1FRRjBhaUlFSUFRdkFRQWlDVUVCYWpzQkFDQU9JQWdnQ1dkQllITnFJZ1E2QUFNZ0RpQUpJQVIwSUExck93RUFJQVZCQVdvaEJRd0JDd3NDUUFKQUlBWXZBWUlFQkVBZ0IwRWNhaUlFSUJjZ0ZoQU5JZ2hCaUg5TERRSWdCMEVVYWlBRUlCSVFEaUFIUVF4cUlBUWdFaEFPUVFBaEJRTkFJQWRCSEdvaUJCQVBJQVZCK3dGTGNnMENJQUFnQldvaUJpQUhRUlJxSUFRUUVEb0FBQ0FHSUFkQkRHb2dCQkFRT2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVU1Bd1VnQUNBRWFpQUhRUlJxSUFkQkhHb2lCQkFRT2dBQUlBWWdCMEVNYWlBRUVCQTZBQU1nQlVFRWFpRUZEQUVMQUFzQUN5QUhRUnhxSWdRZ0Z5QVdFQTBpQ0VHSWYwc05BU0FIUVJScUlBUWdFaEFPSUFkQkRHb2dCQ0FTRUE1QkFDRUZBMEFnQjBFY2FpSUVFQThnQlVIN0FVdHlSUVJBSUFBZ0JXb2lCaUFIUVJScUlBUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVGSUFBZ0JHb2dCMEVVYWlBSFFSeHFJZ1FRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FESUFWQkJHb2hCUXdDQ3dzTEFuOERRRUc2ZnlFSUlBVkIvUUZMRFFNZ0FDQUZhaUlHSUFkQkZHb2dCMEVjYWlJSkVCRTZBQUFnQmtFQmFpRUVJQWtRRDBFRFJnUkFJQWRCREdvaENFRUNEQUlMSUFWQi9BRkxEUU1nQmlBSFFReHFJQWRCSEdvaUJCQVJPZ0FCSUFWQkFtb2hCU0FFRUE5QkEwY05BQXNnQUNBRmFpRUVJQWRCRkdvaENFRURDeUFFSUFnZ0IwRWNhaEFST2dBQUlBWnFJQUJySVFnTUFRc0Nmd05BUWJwL0lRZ2dCVUg5QVVzTkFpQUFJQVZxSWdZZ0IwRVVhaUFIUVJ4cUlna1FFRG9BQUNBR1FRRnFJUVFnQ1JBUFFRTkdCRUFnQjBFTWFpRUlRUUlNQWdzZ0JVSDhBVXNOQWlBR0lBZEJER29nQjBFY2FpSUVFQkE2QUFFZ0JVRUNhaUVGSUFRUUQwRURSdzBBQ3lBQUlBVnFJUVFnQjBFVWFpRUlRUU1MSUFRZ0NDQUhRUnhxRUJBNkFBQWdCbW9nQUdzaENBc2dDRUdJZjBzTkFRc2dDQ0VFUVFBaEJTQUJRUUJCTkJBRElRbEJBQ0VLQTBBZ0JDQUZSd1JBSUFBZ0JXb2lCaTBBQUNJQlFRdExCRUJCYkNFSURBTUZJQWtnQVVFQ2RHb2lBU0FCS0FJQVFRRnFOZ0lBSUFWQkFXb2hCVUVCSUFZdEFBQjBRUUYxSUFwcUlRb01BZ3NBQ3d0QmJDRUlJQXBGRFFBZ0NtY2lCVUVmY3lJQlFRdExEUUFnQTBFZ0lBVnJOZ0lBUVFGQkFpQUJkQ0FLYXlJRFowRWZjeUlCZENBRFJ3MEFJQUFnQkdvZ0FVRUJhaUlBT2dBQUlBa2dBRUVDZEdvaUFDQUFLQUlBUVFGcU5nSUFJQWtvQWdRaUFFRUNTU0FBUVFGeGNnMEFJQUlnQkVFQmFqWUNBQ0FMUVFGcUlRZ0xJQWRCTUdva0FDQUlDNkFGQVF4L0l3QkJFR3NpRENRQUFuOGdCRUVIVFFSQUlBeENBRGNEQ0NBTVFRaHFJZ1VnQXlBRUVBSWFRV3dnQUNBQklBSWdCVUVJRUF3aUFDQUFJQVJMR3lBQUlBQkJpWDlKR3d3QkN5QUFRUUFnQVNnQ0FFRUJhaUlOUVFGMEVBTWhEMEZVSUFNb0FBQWlCa0VQY1NJQVFRcExEUUFhSUFJZ0FFRUZhallDQUNBRElBUnFJZ0pCQkdzaEJ5QUNRUWRySVFzZ0FFRUdhaUVPUVFRaEFpQUdRUVIySVFWQklDQUFkQ0lJUVFGeUlRbEJBQ0VBUVFFaEJpQURJUVFEUUFKQUlBWkJBWEZGQkVBRFFDQUZRWDl6UVlDQWdJQjRjbWdpQmtFWVNVVUVRQ0FBUVNScUlRQWdCQ0FMVFFSL0lBUkJBMm9GSUFRZ0MydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xJQUlnQmtFZWNTSUtha0VDYWlFQ0lBWkJBWFpCQTJ3Z0FHb2dCU0FLZGtFRGNXb2lBQ0FOVHcwQkFuOGdCQ0FMU3lBQ1FRTjJJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBUWdCMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVUxJQVVnQ0VFQmEzRWlCaUFJUVFGMFFRRnJJZ29nQ1dzaUVFa0VmeUFPUVFGckJTQUZJQXB4SWdVZ0VFRUFJQVVnQ0U0YmF5RUdJQTRMSVFVZ0R5QUFRUUYwYWlBR1FRRnJJZ283QVFBZ0FFRUJhaUVBSUFJZ0JXb2hBaUFJUVFFZ0Jtc2dDaUFHUVFCS0d5QUphaUlKU2dSQUlBbEJBa2dOQVVFZ0lBbG5JZ1ZySVE1QkFTQUZRUjl6ZENFSUN5QUFJQTFQRFFBZ0NrRUFSeUVHQW44Z0JDQUxTeUFDUVFOMUlBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFJZ0JDQUhhMEVEZEdwQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xRV3dnQ1VFQlJ3MEFHa0ZRSUFBZ0RVc05BQnBCYkNBQ1FTQktEUUFhSUFFZ0FFRUJhellDQUNBRUlBSkJCMnBCQTNWcUlBTnJDeUFNUVJCcUpBQUw4Z0VCQVg4Z0FrVUVRQ0FBUWdBM0FnQWdBRUVBTmdJUUlBQkNBRGNDQ0VHNGZ3OExJQUFnQVRZQ0RDQUFJQUZCQkdvMkFoQWdBa0VFVHdSQUlBQWdBU0FDYWlJQlFRUnJJZ00yQWdnZ0FDQURLQUFBTmdJQUlBRkJBV3N0QUFBaUFRUkFJQUFnQVdkQkYyczJBZ1FnQWc4TElBQkJBRFlDQkVGL0R3c2dBQ0FCTmdJSUlBQWdBUzBBQUNJRE5nSUFBa0FDUUFKQUlBSkJBbXNPQWdFQUFnc2dBQ0FCTFFBQ1FSQjBJQU55SWdNMkFnQUxJQUFnQVMwQUFVRUlkQ0FEYWpZQ0FBc2dBU0FDYWtFQmF5MEFBQ0lCUlFSQUlBQkJBRFlDQkVGc0R3c2dBQ0FCWnlBQ1FRTjBhMEVKYWpZQ0JDQUNDMFFCQW44Z0FTQUNMd0VBSWdNZ0FTZ0NCR29pQkRZQ0JDQUFJQU5CQW5SQm9CMXFLQUlBSUFFb0FnQkJBQ0FFYTNaeE5nSUFJQUVRRHhvZ0FDQUNRUVJxTmdJRUM1OEJBUVIvUVFNaEFTQUFLQUlFSWdKQklFMEVRQ0FBS0FJSUlnRWdBQ2dDRUU4RVFDQUFJQUpCQjNFMkFnUWdBQ0FCSUFKQkEzWnJJZ0kyQWdnZ0FDQUNLQUFBTmdJQVFRQVBDeUFBS0FJTUlnTWdBVVlFUUVFQlFRSWdBa0VnU1JzUEN5QUFJQUVnQVNBRGF5QUNRUU4ySWdRZ0FTQUVheUFEU1NJQkd5SURheUlFTmdJSUlBQWdBaUFEUVFOMGF6WUNCQ0FBSUFRb0FBQTJBZ0FMSUFFTFNBRUVmeUFBS0FJRUlBQW9BZ0JCQW5ScUlnSXRBQUlnQWk4QkFDRUVJQUVnQVNnQ0JDSUZJQUl0QUFNaUFtbzJBZ1FnQUNBRUlBRW9BZ0FnQlhSQkFDQUNhM1pxTmdJQUMxSUJCSDhnQUNnQ0JDQUFLQUlBUVFKMGFpSUNMUUFDSUFJdkFRQWhCQ0FCSUFJdEFBTWlBaUFCS0FJRWFpSUZOZ0lFSUFBZ0JDQUNRUUowUWFBZGFpZ0NBQ0FCS0FJQVFRQWdCV3QyY1dvMkFnQUxDQUFnQUVHSWYwc0xHZ0FnQUFSQUlBRUVRQ0FDSUFBZ0FSRUNBQThMSUFBUUJnc0xwZ2dDRFg4QmZpTUFRUkJySWdra0FDQUpRUUEyQWd3Z0NVRUFOZ0lJQW44Q1FDQURRZWdKYWlBRElBbEJDR29nQ1VFTWFpQUJJQUlnQTBHQUFXb1FDeUlQUVloL1N3MEFRVlFnQ1NnQ0RDSUVJQUFvQWdBaUFVSC9BWEZCQVdwTERRRWFJQUJCQkdvaEN5QUFJQUZCLzRHQWVIRWdCRUVRZEVHQWdQd0hjWEkyQWdCQmZ5QUVJQVJCQUVnYlFRRnFJUUJCQUNFQklBa29BZ2doQlVFQUlRSURRQ0FBSUFKR0JFQWdCVUVEYXlFQlFRQWhBQU5BQWtCQkFDRUNJQUFnQVU0RVFBTkFJQUFnQlU0TkFpQURJQUFnQTJwQjZBbHFMUUFBUVFKMGFrRkFheUlCSUFFb0FnQWlBVUVCYWpZQ0FDQUJJQU5xSUFBNkFPZ0hJQUJCQVdvaEFBd0FDd0FGQTBBZ0FrRUVSa1VFUUNBRElBTWdBQ0FDYWlJSGFrSG9DV290QUFCQkFuUnFRVUJySWdnZ0NDZ0NBQ0lJUVFGcU5nSUFJQU1nQ0dvZ0J6b0E2QWNnQWtFQmFpRUNEQUVMQ3lBQVFRUnFJUUFNQWdzQUN3c2dCRUVCYWlFT0lBTW9BZ0FoQjBFQUlRQkJBU0VJQTBBZ0NDQU9SZzBESUE0Z0NHc2hCQ0FESUFoQkFuUnFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQkJBU0FJZEVFQmRTSU5RUUZyRGdnQUFRUUNCQVFFQXdRTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBQUlRRURRQ0FDSUFaR0RRVWdBeUFDSUFkcWFpMEE2QWNoQ2lBTElBRkJBWFJxSWd3Z0JEb0FBU0FNSUFvNkFBQWdBa0VCYWlFQ0lBRkJBV29oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaENpQUFJUUVEUUNBQ0lBcEdEUVFnQ3lBQlFRRjBhaUlHSUFNZ0FpQUhhbW90QU9nSElndzZBQUlnQmlBRU9nQUJJQVlnRERvQUFDQUdJQVE2QUFNZ0FrRUJhaUVDSUFGQkFtb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBRVFRaDBRWUQrQTNFaEJDQUFJUUVEUUNBQ0lBWkdEUU1nQ3lBQlFRRjBhaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitOd0FBSUFKQkFXb2hBaUFCUVFScUlRRU1BQXNBQzBFQUlRSWdCVUVBSUFWQkFFb2JJUVlnQkVFSWRFR0EvZ054SVFRZ0FDRUJBMEFnQWlBR1JnMENJQXNnQVVFQmRHb2lDaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJaEUzQUFnZ0NpQVJOd0FBSUFKQkFXb2hBaUFCUVFocUlRRU1BQXNBQzBFQUlRRWdCVUVBSUFWQkFFb2JJUW9nQkVFSWRFR0EvZ054SVF3Z0FDRUVBMEFnQVNBS1JnMEJJQXNnQkVFQmRHb2hFQ0FNSUFNZ0FTQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJUkZCQUNFQ0EwQWdBaUFOVGtVRVFDQVFJQUpCQVhScUlnWWdFVGNBR0NBR0lCRTNBQkFnQmlBUk53QUlJQVlnRVRjQUFDQUNRUkJxSVFJTUFRc0xJQUZCQVdvaEFTQUVJQTFxSVFRTUFBc0FDeUFJUVFGcUlRZ2dCU0FIYWlFSElBVWdEV3dnQUdvaEFBd0FDd0FGSUFNZ0FrRUNkR29pQjBGQWF5QUJOZ0lBSUFKQkFXb2hBaUFIS0FJQUlBRnFJUUVNQVFzQUN3QUxJQThMSUFsQkVHb2tBQXZ5QWdFR2Z5TUFRU0JySWdVa0FDQUVLQUlBSVFZZ0JVRU1haUFDSUFNUURTSURRWWgvVFFSQUlBUkJCR29oQWlBQUlBRnFJZ2xCQTJzaEJFRUFJQVpCRUhaclFSOXhJUU1EUUNBRlFReHFFQThnQUNBRVQzSkZCRUFnQWlBRktBSU1JZ1lnQlNnQ0VDSUhkQ0FEZGtFQmRHb2lDQzBBQVNFS0lBQWdDQzBBQURvQUFDQUNJQVlnQnlBS2FpSUdkQ0FEZGtFQmRHb2lCeTBBQUNFSUlBVWdCaUFITFFBQmFqWUNFQ0FBSUFnNkFBRWdBRUVDYWlFQURBRUxDd05BSUFWQkRHb1FEeUVISUFVb0Fnd2hCaUFGS0FJUUlRUWdBQ0FKVHlBSGNrVUVRQ0FDSUFZZ0JIUWdBM1pCQVhScUlnWXRBQUFoQnlBRklBUWdCaTBBQVdvMkFoQWdBQ0FIT2dBQUlBQkJBV29oQUF3QkN3c0RRQ0FBSUFsUFJRUkFJQUlnQmlBRWRDQURka0VCZEdvaUJ5MEFBU0VJSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQkNBSWFpRUVEQUVMQzBGc1FXd2dBU0FGS0FJVUlBVW9BaGhIR3lBRVFTQkhHeUVEQ3lBRlFTQnFKQUFnQXd2UEZBRWpmeU1BUWRBQWF5SUZKQUJCYkNFSkFrQWdBMEVLU1EwQUFrQWdBeUFDTHdBRUlnY2dBaThBQUNJSUlBSXZBQUlpRFdwcVFRWnFJZ3hKRFFBZ0JDOEJBaUVHSUFWQlBHb2dBa0VHYWlJQ0lBZ1FEU0lKUVloL1N3MEJJQVZCS0dvZ0FpQUlhaUlDSUEwUURTSUpRWWgvU3cwQklBVkJGR29nQWlBTmFpSUNJQWNRRFNJSlFZaC9TdzBCSUFVZ0FpQUhhaUFESUF4ckVBMGlDVUdJZjBzTkFTQUVRUVJxSVFvZ0FDQUJhaUlmUVFOcklTQkJBQ0FHYTBFZmNTRUxJQVVvQWdnaEVTQUZLQUljSVJJZ0JTZ0NNQ0VUSUFVb0FrUWhGQ0FGS0FJRUlRa2dCU2dDR0NFTklBVW9BaXdoRENBRktBSkFJUVlnQlNnQ0VDRWhJQVVvQWlRaElpQUZLQUk0SVNNZ0JTZ0NUQ0VrSUFVb0FnQWhGU0FGS0FJVUlSWWdCU2dDS0NFWElBVW9BandoR0VFQklROGdBQ0FCUVFOcVFRSjJJZ1JxSWdNZ0JHb2lBaUFFYWlJWklRUWdBaUVJSUFNaEJ3TkFJQTlCQVhGRklBUWdJRTl5UlFSQUlBQWdDaUFZSUFaMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhHaUFPTFFBRElSQWdCeUFLSUJjZ0RIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0RpMEFBaUViSUE0dEFBTWhEeUFJSUFvZ0ZpQU5kQ0FMZGtFQ2RHb2lEaThCQURzQUFDQU9MUUFDSVJ3Z0RpMEFBeUVkSUFRZ0NpQVZJQWwwSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEhpQU9MUUFESVE0Z0FDQVFhaUlsSUFvZ0dDQUdJQnBxSWdaMElBdDJRUUowYWlJUUx3RUFPd0FBSUJBdEFBSWdFQzBBQXlFbUlBY2dEMm9pSnlBS0lCY2dEQ0FiYWlJYWRDQUxka0VDZEdvaUJ5OEJBRHNBQUNBSExRQUNJUXdnQnkwQUF5RVFJQWdnSFdvaUd5QUtJQllnRFNBY2FpSVBkQ0FMZGtFQ2RHb2lDQzhCQURzQUFDQUlMUUFDSVEwZ0NDMEFBeUVjSUFRZ0Rtb2lIU0FLSUJVZ0NTQWVhaUlPZENBTGRrRUNkR29pQ1M4QkFEc0FBQ0FHYWlFQVFRTWhCd0ovSUJRZ0pFa0VRQ0FBSVFaQkF3d0JDeUFBUVFkeElRWWdGQ0FBUVFOMmF5SVVLQUFBSVJoQkFBc2dDUzBBQXlFZUlBa3RBQUloQ0NBTUlCcHFJUUFnRXlBalNRUi9JQUFGSUJNZ0FFRURkbXNpRXlnQUFDRVhRUUFoQnlBQVFRZHhDeUVNSUEwZ0Qyb2hBQ0FIY2lFSlFRTWhEd0ovSUJJZ0lra0VRQ0FBSVExQkF3d0JDeUFBUVFkeElRMGdFaUFBUVFOMmF5SVNLQUFBSVJaQkFBc2dDQ0FPYWlFQUlBbHlJQkVnSVVrRWZ5QUFCU0FSSUFCQkEzWnJJaEVvQUFBaEZVRUFJUThnQUVFSGNRc2hDU0FsSUNacUlRQWdFQ0FuYWlFSElCc2dIR29oQ0NBZElCNXFJUVFnRDNKRklROE1BUXNMSUFVZ0REWUNMQ0FGSUFZMkFrQWdCU0FOTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBSWdCMGtnQUNBRFMzSU5BRUZzSVFrZ0NDQVpTdzBCSUFOQkEyc2hDUU5BSUFWQlBHb1FEMFVnQUNBSlNYRUVRQ0FBSUFvZ0JTZ0NQQ0lOSUFVb0FrQWlESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdBQ0FPTFFBRGFpSUdJQW9nRFNBTUlBNHRBQUpxSWdCMElBdDJRUUowYWlJTUx3RUFPd0FBSUFVZ0FDQU1MUUFDYWpZQ1FDQUdJQXd0QUFOcUlRQU1BUVVnQTBFQ2F5RU1BMEFnQlVFOGFoQVBJUVlnQlNnQ1BDRU5JQVVvQWtBaENTQUFJQXhMSUFaeVJRUkFJQUFnQ2lBTklBbDBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdDU0FHTFFBQ2FqWUNRQ0FBSUFZdEFBTnFJUUFNQVFzTEEwQWdBQ0FNUzBVRVFDQUFJQW9nRFNBSmRDQUxka0VDZEdvaUJpOEJBRHNBQUNBQUlBWXRBQU5xSVFBZ0NTQUdMUUFDYWlFSkRBRUxDd0pBSUFBZ0EwOE5BQ0FBSUFvZ0RTQUpkQ0FMZGlJQVFRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FKSUFNdEFBSnFJUWtNQVFzZ0NVRWZTdzBBUVNBZ0NTQUtJQUJCQW5ScUxRQUNhaUlBSUFCQklFOGJJUWtMSUFKQkEyc2hEQU5BSUFWQktHb1FEMFVnQnlBTVNYRUVRQ0FISUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lBSFFnQzNaQkFuUnFJZzB2QVFBN0FBQWdCeUFOTFFBRGFpSURJQW9nQmlBQUlBMHRBQUpxSWdCMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FDQUdMUUFDYWpZQ0xDQURJQVl0QUFOcUlRY01BUVVnQWtFQ2F5RUdBMEFnQlVFb2FoQVBJUU1nQlNnQ0tDRU1JQVVvQWl3aEFDQUdJQWRKSUFOeVJRUkFJQWNnQ2lBTUlBQjBJQXQyUVFKMGFpSURMd0VBT3dBQUlBVWdBQ0FETFFBQ2FqWUNMQ0FISUFNdEFBTnFJUWNNQVFzTEEwQWdCaUFIU1VVRVFDQUhJQW9nRENBQWRDQUxka0VDZEdvaUF5OEJBRHNBQUNBSElBTXRBQU5xSVFjZ0FDQURMUUFDYWlFQURBRUxDd0pBSUFJZ0IwME5BQ0FISUFvZ0RDQUFkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FBSUFNdEFBSnFJUUFNQVFzZ0FFRWZTdzBBUVNBZ0FDQUtJQUpCQW5ScUxRQUNhaUlBSUFCQklFOGJJUUFMSUJsQkEyc2hEQU5BSUFWQkZHb1FEMFVnQ0NBTVNYRUVRQ0FJSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lBblFnQzNaQkFuUnFJZzB2QVFBN0FBQWdDQ0FOTFFBRGFpSURJQW9nQmlBQ0lBMHRBQUpxSWdKMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FpQUdMUUFDYWpZQ0dDQURJQVl0QUFOcUlRZ01BUVVnR1VFQ2F5RURBMEFnQlVFVWFoQVBJUUlnQlNnQ0ZDRUdJQVVvQWhnaEJ5QURJQWhKSUFKeVJRUkFJQWdnQ2lBR0lBZDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBVWdCeUFDTFFBQ2FqWUNHQ0FJSUFJdEFBTnFJUWdNQVFzTEEwQWdBeUFJU1VVRVFDQUlJQW9nQmlBSGRDQUxka0VDZEdvaUFpOEJBRHNBQUNBSUlBSXRBQU5xSVFnZ0J5QUNMUUFDYWlFSERBRUxDd0pBSUFnZ0dVOE5BQ0FJSUFvZ0JpQUhkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FISUFNdEFBSnFJUWNNQVFzZ0IwRWZTdzBBUVNBZ0J5QUtJQUpCQW5ScUxRQUNhaUlDSUFKQklFOGJJUWNMQTBBZ0JSQVBSU0FFSUNCSmNRUkFJQVFnQ2lBRktBSUFJZ1lnQlNnQ0JDSUNkQ0FMZGtFQ2RHb2lEQzhCQURzQUFDQUVJQXd0QUFOcUlnTWdDaUFHSUFJZ0RDMEFBbW9pQW5RZ0MzWkJBblJxSWdRdkFRQTdBQUFnQlNBQ0lBUXRBQUpxTmdJRUlBTWdCQzBBQTJvaEJBd0JCU0FmUVFKcklRTURRQ0FGRUE4aEFpQUZLQUlBSVFZZ0JTZ0NCQ0VJSUFNZ0JFa2dBbkpGQkVBZ0JDQUtJQVlnQ0hRZ0MzWkJBblJxSWdJdkFRQTdBQUFnQlNBSUlBSXRBQUpxTmdJRUlBUWdBaTBBQTJvaEJBd0JDd3NEUUNBRElBUkpSUVJBSUFRZ0NpQUdJQWgwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVFnQWkwQUEyb2hCQ0FJSUFJdEFBSnFJUWdNQVFzTEFrQWdCQ0FmVHcwQUlBUWdDaUFHSUFoMElBdDJJZ0pCQW5ScUlnTXRBQUE2QUFBZ0F5MEFBMEVCUmdSQUlBZ2dBeTBBQW1vaENBd0JDeUFJUVI5TERRQkJJQ0FJSUFvZ0FrRUNkR290QUFKcUlnSWdBa0VnVHhzaENBdEJiRUZzUVd4QmJFRnNRV3hCYkVGc0lBRWdDRUVnUnhzZ0JTZ0NDQ0FGS0FJTVJ4c2dCMEVnUnhzZ0JTZ0NIQ0FGS0FJZ1J4c2dBRUVnUnhzZ0JTZ0NNQ0FGS0FJMFJ4c2dDVUVnUnhzZ0JTZ0NSQ0FGS0FKSVJ4c2hDUXdKQ3dBTEFBc0FDd0FMQUFzQUN3QUxBQXRCYkNFSkN5QUZRZEFBYWlRQUlBa0w3QkFCSG44akFFSFFBR3NpQlNRQVFXd2hDUUpBSUFOQkNra05BQUpBSUFNZ0FpOEFCQ0lHSUFJdkFBQWlCeUFDTHdBQ0lnaHFha0VHYWlJT1NRMEFJQVF2QVFJaER5QUZRVHhxSUFKQkJtb2lBaUFIRUEwaUNVR0lmMHNOQVNBRlFTaHFJQUlnQjJvaUFpQUlFQTBpQ1VHSWYwc05BU0FGUVJScUlBSWdDR29pQWlBR0VBMGlDVUdJZjBzTkFTQUZJQUlnQm1vZ0F5QU9heEFOSWdsQmlIOUxEUUVnQkVFRWFpRUtJQUFnQVdvaUhFRURheUVkUVFBZ0QydEJIM0VoQ3lBRktBSUlJUkVnQlNnQ0hDRVNJQVVvQWpBaEV5QUZLQUpFSVJRZ0JTZ0NCQ0VKSUFVb0FoZ2hCaUFGS0FJc0lRY2dCU2dDUUNFSUlBVW9BaEFoSGlBRktBSWtJUjhnQlNnQ09DRWdJQVVvQWt3aElTQUZLQUlBSVJVZ0JTZ0NGQ0VXSUFVb0FpZ2hGeUFGS0FJOElSaEJBU0VOSUFBZ0FVRURha0VDZGlJQ2FpSU9JQUpxSWc4Z0Ftb2lHU0VFSUE4aEFpQU9JUU1EUUNBTlJTQUVJQjFQY2tVRVFDQUtJQmdnQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUFnQ2lBWElBZDBJQXQyUVFGMGFpSU1MUUFCSVJBZ0F5QU1MUUFBT2dBQUlBb2dGaUFHZENBTGRrRUJkR29pREMwQUFTRWFJQUlnREMwQUFEb0FBQ0FLSUJVZ0NYUWdDM1pCQVhScUlnd3RBQUVoR3lBRUlBd3RBQUE2QUFBZ0NpQVlJQWdnRFdvaUNIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFFZ0NpQVhJQWNnRUdvaUIzUWdDM1pCQVhScUlnd3RBQUVoRUNBRElBd3RBQUE2QUFFZ0NpQVdJQVlnR21vaURIUWdDM1pCQVhScUlnWXRBQUVoR2lBQ0lBWXRBQUE2QUFFZ0NpQVZJQWtnRzJvaUczUWdDM1pCQVhScUlna3RBQUVoSWlBRUlBa3RBQUE2QUFFZ0NDQU5haUVHUVFNaENRSi9JQlFnSVVrRVFFRURJUTBnQmd3QkN5QVVJQVpCQTNackloUW9BQUFoR0VFQUlRMGdCa0VIY1FzaENDQUhJQkJxSVFZZ0V5QWdTUVIvSUFZRklCTWdCa0VEZG1zaUV5Z0FBQ0VYUVFBaENTQUdRUWR4Q3lFSElBd2dHbW9oRENBSklBMXlJUkJCQXlFTkFuOGdFaUFmU1FSQUlBd2hCa0VEREFFTElBeEJCM0VoQmlBU0lBeEJBM1pySWhJb0FBQWhGa0VBQ3lBYklDSnFJUXdnRUhJaEVDQVJJQjVKQkg4Z0RBVWdFU0FNUVFOMmF5SVJLQUFBSVJWQkFDRU5JQXhCQjNFTElRa2dCRUVDYWlFRUlBSkJBbW9oQWlBRFFRSnFJUU1nQUVFQ2FpRUFJQTBnRUhKRklRME1BUXNMSUFVZ0J6WUNMQ0FGSUFnMkFrQWdCU0FHTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBQWdEa3NnQXlBUFMzSU5BRUZzSVFrZ0FpQVpTdzBCSUE1QkEyc2hDUU5BSUFWQlBHb1FEeUFBSUFsUGNrVUVRQ0FLSUFVb0Fqd2lCaUFGS0FKQUlnZDBJQXQyUVFGMGFpSUlMUUFCSVF3Z0FDQUlMUUFBT2dBQUlBb2dCaUFISUF4cUlnWjBJQXQyUVFGMGFpSUhMUUFBSVFnZ0JTQUdJQWN0QUFGcU5nSkFJQUFnQ0RvQUFTQUFRUUpxSVFBTUFRc0xBMEFnQlVFOGFoQVBJUWNnQlNnQ1BDRUdJQVVvQWtBaENTQUFJQTVQSUFkeVJRUkFJQW9nQmlBSmRDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0NTQUdMUUFCYWpZQ1FDQUFJQWM2QUFBZ0FFRUJhaUVBREFFTEN3TkFJQUFnRGs5RkJFQWdDaUFHSUFsMElBdDJRUUYwYWlJSExRQUJJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdDV29oQ1F3QkN3c2dEMEVEYXlFQUEwQWdCVUVvYWhBUElBQWdBMDF5UlFSQUlBb2dCU2dDS0NJR0lBVW9BaXdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFESUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWl3Z0F5QUlPZ0FCSUFOQkFtb2hBd3dCQ3dzRFFDQUZRU2hxRUE4aEJ5QUZLQUlvSVFZZ0JTZ0NMQ0VBSUFNZ0QwOGdCM0pGQkVBZ0NpQUdJQUIwSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FBSUFZdEFBRnFOZ0lzSUFNZ0J6b0FBQ0FEUVFGcUlRTU1BUXNMQTBBZ0F5QVBUMFVFUUNBS0lBWWdBSFFnQzNaQkFYUnFJZ2N0QUFFaENDQURJQWN0QUFBNkFBQWdBMEVCYWlFRElBQWdDR29oQUF3QkN3c2dHVUVEYXlFREEwQWdCVUVVYWhBUElBSWdBMDl5UlFSQUlBb2dCU2dDRkNJR0lBVW9BaGdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFDSUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWhnZ0FpQUlPZ0FCSUFKQkFtb2hBZ3dCQ3dzRFFDQUZRUlJxRUE4aEJ5QUZLQUlVSVFZZ0JTZ0NHQ0VESUFJZ0dVOGdCM0pGQkVBZ0NpQUdJQU4wSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FESUFZdEFBRnFOZ0lZSUFJZ0J6b0FBQ0FDUVFGcUlRSU1BUXNMQTBBZ0FpQVpUMFVFUUNBS0lBWWdBM1FnQzNaQkFYUnFJZ2N0QUFFaENDQUNJQWN0QUFBNkFBQWdBa0VCYWlFQ0lBTWdDR29oQXd3QkN3c0RRQ0FGRUE4Z0JDQWRUM0pGQkVBZ0NpQUZLQUlBSWdJZ0JTZ0NCQ0lHZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FLSUFJZ0JpQUlhaUlDZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQWlBR0xRQUJhallDQkNBRUlBYzZBQUVnQkVFQ2FpRUVEQUVMQ3dOQUlBVVFEeUVISUFVb0FnQWhCaUFGS0FJRUlRSWdCQ0FjVHlBSGNrVUVRQ0FLSUFZZ0FuUWdDM1pCQVhScUlnWXRBQUFoQnlBRklBSWdCaTBBQVdvMkFnUWdCQ0FIT2dBQUlBUkJBV29oQkF3QkN3c0RRQ0FFSUJ4UFJRUkFJQW9nQmlBQ2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBRVFRRnFJUVFnQWlBSWFpRUNEQUVMQzBGc1FXeEJiRUZzUVd4QmJFRnNRV3dnQVNBQ1FTQkhHeUFGS0FJSUlBVW9BZ3hIR3lBRFFTQkhHeUFGS0FJY0lBVW9BaUJIR3lBQVFTQkhHeUFGS0FJd0lBVW9BalJIR3lBSlFTQkhHeUFGS0FKRUlBVW9Ba2hIR3lFSkRBRUxRV3doQ1FzZ0JVSFFBR29rQUNBSkMxZ0JBMzhDUUNBQUtBS1E2d0VpQVVVTkFDQUJLQUlBSUFGQnROVUJhaWdDQUNJQ0lBRkJ1TlVCYWlnQ0FDSURFQk1nQWdSQUlBTWdBU0FDRVFJQURBRUxJQUVRQmdzZ0FFRUFOZ0tnNndFZ0FFSUFOd09RNndFTDZRTUNCSDhDZmlBQVFRQkJLQkFESVFRZ0FrRUJRUVVnQXhzaUFFa0VRQ0FBRHdzZ0FVVUVRRUYvRHd0QkFTRUdBa0FDUUNBRFFRRkdEUUFnQXlFR0lBRW9BQUFpQlVHbzZyNXBSZzBBUVhZaEF5QUZRWEJ4UWREVXRNSUJSdzBCUVFnaEF5QUNRUWhKRFFFZ0FUVUFCQ0VJSUFSQkFUWUNGQ0FFSUFnM0F3QkJBQThMSUFFZ0FpQUdFQm9pQXlBQ1N3MEFJQVFnQXpZQ0dFRnlJUU1nQUNBQmFpSUZRUUZyTFFBQUlnSkJDSEVOQUNBQ1FTQnhJZ1pGQkVCQmNDRURJQVV0QUFBaUJVR25BVXNOQVNBRlFRZHhyVUlCSUFWQkEzWkJDbXF0aGlJSVFnT0lmaUFJZkNFSklBQkJBV29oQUFzZ0FrRUdkaUVGSUFKQkFuWkJBQ0VEQWtBQ1FBSkFBa0FnQWtFRGNVRUJhdzREQUFFQ0F3c2dBQ0FCYWkwQUFDRURJQUJCQVdvaEFBd0NDeUFBSUFGcUx3QUFJUU1nQUVFQ2FpRUFEQUVMSUFBZ0FXb29BQUFoQXlBQVFRUnFJUUFMUVFGeElRSUNmZ0pBQWtBQ1FBSkFJQVZCQVdzT0F3RUNBd0FMUW44Z0JrVU5BeG9nQUNBQmFqRUFBQXdEQ3lBQUlBRnFNd0FBUW9BQ2ZBd0NDeUFBSUFGcU5RQUFEQUVMSUFBZ0FXb3BBQUFMSVFnZ0JDQUNOZ0lnSUFRZ0F6WUNIQ0FFSUFnM0F3QkJBQ0VESUFSQkFEWUNGQ0FFSUFnZ0NTQUdHeUlJTndNSUlBUkNnSUFJSUFnZ0NFS0FnQWhhR3o0Q0VBc2dBd3RmQVFGL1FiaC9JUU1nQVVFQlFRVWdBaHNpQWs4RWZ5QUFJQUpxUVFGckxRQUFJZ0JCQTNGQkFuUkJvQjVxS0FJQUlBSnFJQUJCQkhaQkRIRkJzQjVxS0FJQWFpQUFRU0J4SWdGRmFpQUJRUVYySUFCQndBQkpjV29GUWJoL0N3c01BQ0FBSUFFZ0FrRUFFQmtMbHdNQ0JYOENmaU1BUVVCcUlnUWtBQUpBQTBBZ0FVRUZUd1JBQWtBZ0FDZ0FBRUZ3Y1VIUTFMVENBVVlFUUVKK0lRY2dBVUVJU1EwRUlBQW9BQVFpQWtGM1N3MEVJQUpCQ0dvaUF5QUJTdzBFSUFKQmdYOUpEUUVNQkFzZ0JFRVlhaUFBSUFFUUd5RUNRbjRnQkNrREdFSUFJQVFvQWl4QkFVY2JJQUliSWdkQ2ZWWU5BeUFISUFoOElnZ2dCMVJDZmlFSERRTUNRQUpBSUFGQkNFa05BQ0FBS0FBQVFYQnhRZERVdE1JQlJ3MEFJQUFvQUFRaUFrRjNTdzBGUWJoL0lBSkJDR29pQWlBQklBSkpHeUVEREFFTElBUkJHR29nQUNBQkVCc2lBa0dJZjBzRVFDQUNJUU1NQVF0QnVIOGhBeUFDRFFBZ0FTQUVLQUl3SWdKcklRVWdBQ0FDYWlFR0EwQWdCaUFGSUFSQkRHb1FIU0lEUVloL1N3MEJJQU5CQTJvaUFpQUZTd1JBUWJoL0lRTU1BZ3NnQlNBQ2F5RUZJQUlnQm1vaEJpQUVLQUlRUlEwQUN5QUVLQUk0Qkg5QnVIOGhBeUFGUVFSSkRRRWdCa0VFYWdVZ0Jnc2dBR3NoQXdzZ0EwR0lmMHNOQXdzZ0FTQURheUVCSUFBZ0Eyb2hBQXdCQ3d0Q2ZpQUlJQUViSVFjTElBUkJRR3NrQUNBSEMyUUJBWDlCdUg4aEF3SkFJQUZCQTBrTkFDQUFMUUFDSVFFZ0FpQUFMd0FBSWdCQkFYRTJBZ1FnQWlBQVFRRjJRUU54SWdNMkFnQWdBaUFBSUFGQkVIUnlRUU4ySWdBMkFnZ0NRQUpBSUFOQkFXc09Bd0lCQUFFTFFXd1BDeUFBSVFNTElBTUxSQUVDZnlBQklBSW9BZ1FpQXlBQktBSUVhaUlFTmdJRUlBQWdBMEVDZEVHZ0hXb29BZ0FnQVNnQ0FFRUFJQVJyZG5FMkFnQWdBUkFQR2lBQUlBSkJDR28yQWdRTHpnRUJCbjlCdW44aENnSkFJQUlvQWdRaUNDQUNLQUlBSWdscUlnMGdBU0FBYTBzTkFFRnNJUW9nQ1NBRUlBTW9BZ0FpQzJ0TERRQWdBQ0FKYWlJRUlBSW9BZ2dpREdzaEFpQUFJQUZCSUdzaUFDQUxJQWxCQUJBZ0lBTWdDU0FMYWpZQ0FBSkFBa0FnQkNBRmF5QU1Ud1JBSUFJaEJRd0JDeUFNSUFRZ0JtdExEUUlnQnlBSElBSWdCV3NpQW1vaUFTQUlhazhFUUNBRUlBRWdDQkFLR2d3Q0N5QUNJQWhxSVFnZ0JDQUJRUUFnQW1zUUNpQUNheUVFQ3lBRUlBQWdCU0FJUVFFUUlBc2dEU0VLQ3lBS0M4Y0VBUUovSUFBZ0Eyb2hCZ0pBSUFOQkIwd0VRQU5BSUFBZ0JrOE5BaUFBSUFJdEFBQTZBQUFnQUVFQmFpRUFJQUpCQVdvaEFnd0FDd0FMSUFSQkFVWUVRQUpBSUFBZ0Ftc2lCVUVIVFFSQUlBQWdBaTBBQURvQUFDQUFJQUl0QUFFNkFBRWdBQ0FDTFFBQ09nQUNJQUFnQWkwQUF6b0FBeUFBSUFJZ0JVRUNkQ0lGUWNBZWFpZ0NBR29pQWlnQUFEWUFCQ0FDSUFWQjRCNXFLQUlBYXlFQ0RBRUxJQUFnQWlrQUFEY0FBQXNnQWtFSWFpRUNJQUJCQ0dvaEFBc2dBU0FHVHdSQUlBQWdBMm9oQVNBRVFRRkhJQUFnQW10QkQwcHlSUVJBQTBBZ0FDQUNLUUFBTndBQUlBSkJDR29oQWlBQVFRaHFJZ0FnQVVrTkFBd0RDd0FMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0EwRVJTUTBCSUFCQkVHb2hBQU5BSUFBZ0Fpa0FFRGNBQUNBQUlBSXBBQmczQUFnZ0FDQUNLUUFnTndBUUlBQWdBaWtBS0RjQUdDQUNRU0JxSVFJZ0FFRWdhaUlBSUFGSkRRQUxEQUVMQWtBZ0FDQUJTd1JBSUFBaEFRd0JDeUFCSUFCcklRVUNRQ0FFUVFGSElBQWdBbXRCRDBweVJRUkFJQUloQXdOQUlBQWdBeWtBQURjQUFDQURRUWhxSVFNZ0FFRUlhaUlBSUFGSkRRQUxEQUVMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0JVRVJTQTBBSUFCQkVHb2hBQ0FDSVFNRFFDQUFJQU1wQUJBM0FBQWdBQ0FES1FBWU53QUlJQUFnQXlrQUlEY0FFQ0FBSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUJCSUdvaUFDQUJTUTBBQ3dzZ0FpQUZhaUVDQ3dOQUlBRWdCazhOQVNBQklBSXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2hBZ3dBQ3dBTEM2NEhBZ1YvQVg0akFFR0FBV3NpRVNRQUlCRWdBellDZkVGL0lROENRQUpBQWtBQ1FBSkFJQUlPQkFFQUF3SUVDeUFHUlFSQVFiaC9JUThNQkF0QmJDRVBJQVV0QUFBaUFpQURTdzBESUFnZ0FrRUNkQ0lDYWlnQ0FDRURJQUlnQjJvb0FnQWhBaUFBUVFBNkFBc2dBRUlBTndJQUlBQWdBallDRENBQUlBTTZBQW9nQUVFQU93RUlJQUVnQURZQ0FFRUJJUThNQXdzZ0FTQUpOZ0lBUVFBaER3d0NDeUFLUlFSQVFXd2hEd3dDQzBFQUlROGdDMFVnREVFWlNISU5BVUVJSUFSMFFRaHFJUUJCQUNFREEwQWdBQ0FEVFEwQ0lBTkJRR3NoQXd3QUN3QUxRV3doRHlBUklCRkIvQUJxSUJGQitBQnFJQVVnQmhBTUlnTkJpSDlMRFFBZ0VTZ0NlQ0lDSUFSTERRQWdFU2dDZkVFQmFpRUpJQUJCQ0dvaEMwR0FnQUlnQW5SQkVIVWhCVUVCSVJCQkFTQUNkQ0lQUVFGcklnb2hFZ05BSUFrZ0RrY0VRQUpBSUJFZ0RrRUJkQ0lFYWk4QkFDSU1RZi8vQTBZRVFDQUxJQkpCQTNScUlBNDJBZ1FnRWtFQmF5RVNRUUVoREF3QkN5QVFRUUFnQlNBTXdVb2JJUkFMSUFRZ0RXb2dERHNCQUNBT1FRRnFJUTRNQVFzTElBQWdBallDQkNBQUlCQTJBZ0FDUUNBS0lCSkdCRUFnRFVIcUFHb2hCa0VBSVJCQkFDRU1BMEFnQ1NBUVJnUkFJQTlCQTNZZ0QwRUJkbXBCQTJvaUJVRUJkQ0VFUVFBaERFRUFJUklEUUVFQUlRNGdEeUFTVFEwRUEwQWdEa0VDUndSQUlBc2dCU0FPYkNBTWFpQUtjVUVEZEdvZ0JpQU9JQkpxYWkwQUFEWUNCQ0FPUVFGcUlRNE1BUXNMSUJKQkFtb2hFaUFFSUF4cUlBcHhJUXdNQUFzQUJTQVJJQkJCQVhScUxnRUFJUVVnQmlBTWFpSUVJQk0zQUFCQkNDRU9BMEFnQlNBT1NnUkFJQVFnRG1vZ0V6Y0FBQ0FPUVFocUlRNE1BUXNMSUJOQ2dZS0VpSkNnd0lBQmZDRVRJQkJCQVdvaEVDQUZJQXhxSVF3TUFRc0FDd0FMSUE5QkEzWWdEMEVCZG1wQkEyb2hCVUVBSVJCQkFDRU9BMEFnQ1NBUVJnMEJRUUFoRENBUklCQkJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBTVJ3UkFJQXNnRGtFRGRHb2dFRFlDQkFOQUlBVWdEbW9nQ25FaURpQVNTdzBBQ3lBTVFRRnFJUXdNQVFzTElCQkJBV29oRUF3QUN3QUxJQUpCQVdvaEJVRUFJUXdEUUNBTUlBOUhCRUFnRFNBTElBeEJBM1JxSWdrb0FnUWlCRUVCZEdvaUFpQUNMd0VBSWdaQkFXbzdBUUFnQ1NBRklBWm5RV0J6YWlJQ09nQURJQWtnQmlBQ2RDQVBhenNCQUNBSklBZ2dCRUVDZENJQ2FpZ0NBRG9BQWlBSklBSWdCMm9vQWdBMkFnUWdERUVCYWlFTURBRUxDeUFCSUFBMkFnQWdBeUVQQ3lBUlFZQUJhaVFBSUE4TDdWb0NPMzhHZmlNQVFlQUJheUlFSkFBQ1FFR3c3QWtRQlNJRlJRUkFRVUFoQnd3QkN5QUZRZ0EzQXZUcUFTQUZRUUEyQXNUckFTQUZRUUEyQXJUckFTQUZRZ0EzQXB6ckFTQUZRUUEyQXJqcEFTQUZRUUEyQXF6c0NTQUZRZ0EzQXRUckFTQUZRZ0EzQXF6ckFTQUZRZ0EzQTRqckFTQUZRZ0EzQXVUcUFTQUZRZ0EzQXVUckFTQUZRWUdBZ01BQU5nSzg2d0VnQlVJQU53S2s2d0VnQlVIODZnRnFRUUEyQWdBZ0JVR1E2d0ZxUWdBM0F3QWdCUkFZSUFWQnJOVUJhaUVVSUFWQitPc0JhaUVjSUFWQnNPb0JhaUVpSUFWQm9EQnFJU29nQlVHWUlHb2hLeUFGUWFqUUFHb2hIaUFGUVJCcUlTd2dCVUVJYWlFb0lBVkJCR29oTFNBRlFjRHBBV29oS1NBRlFZanJBV29nQkVHVUFXb2hMeUFFUVl3QmFpRXdJQVJCaEFGcUlURWdCRUhjQUdvaE1pQUVRZFFBYWlFeklBUkJ6QUJxSVRRZ0FDRWRBa0FDUUFKQUFrQUNRQU5BUVFGQkJTQUZLQUxrNmdFYklRWUNRQU5BSUFNZ0Jra05BU0FDS0FBQVFYQnhRZERVdE1JQlJnUkFRYmgvSVFjZ0EwRUlTUTBJSUFJb0FBUWlEa0YzU3dSQVFYSWhCd3dKQ3lBRElBNUJDR29pQ1VrTkNDQU9RWUIvU3dSQUlBa2hCd3dKQ3lBRElBbHJJUU1nQWlBSmFpRUNEQUVMQ3lBRlFnQTNBcXpwQVNBRlFnQTNBK2pwQVNBRlFRQTJBcGpyQVNBRlFnQTNBNERxQVNBRlFnTTNBL2pwQVNBRlFiVHBBV3BDQURjQ0FDQUZRZkRwQVdwQ0FEY0RBQ0FGUWFqUUFHb2lDVUdNZ0lEZ0FEWUNBQ0FGUWF6UUFXcEI0QklwQWdBM0FnQWdCVUcwMEFGcVFlZ1NLQUlBTmdJQUlBVWdCVUVRYWpZQ0FDQUZJQVZCb0RCcU5nSUVJQVVnQlVHWUlHbzJBZ2dnQlNBSk5nSU1JQVZCQVVFRklBVW9BdVRxQVJzMkFyenBBUUpBSUFGRkRRQWdCU2dDck9rQklna2dIVVlOQUNBRklBazJBcmpwQVNBRklCMDJBcXpwQVNBRktBS3c2UUVoRGlBRklCMDJBckRwQVNBRklCMGdEaUFKYTJvMkFyVHBBUXRCdUg4aENTQURRUVZCQ1NBRktBTGs2Z0VpQmh0SkRRVWdBa0VCUVFVZ0Joc2dCaEFhSWc1QmlIOUxCRUFnRGlFSkRBVUxJQU1nRGtFRGFra05CU0FwSUFJZ0RpQUdFQmtpQmtHSWYwc0VRQ0FHSVFrTUJRc2dCZzBGQWtBQ1FDQUZLQUtvNndGQkFVY05BQ0FGS0FLazZ3RWlDVVVOQUNBRktBS1U2d0ZGRFFBZ0NTZ0NCRUVCYXlJSElBVW9BdHpwQVNJS3JVS0hsYSt2bUxiZW01NS9ma0xKejlteThlVzY2aWVGUWhlSlFzL1cwNzdTeDZ2WlFuNUMrZlBkOFpuMm1hc1dmQ0kvUWlHSUlEK0ZRcy9XMDc3U3g2dlpRbjRpUDBJZGlDQS9oVUw1ODkzeG1mYVpxeForSWo5Q0lJZ2dQNFduY1NFR0lBa29BZ0FoRlFOQVFRQWhDQUpBSUJVZ0JrRUNkR29vQWdBaUNVVU5BQ0FKS0FJSVFRaEpEUUFnQ1NnQ0JDSVNLQUFBUWJmSXd1RitSdzBBSUJJb0FBUWhDQXNnQ0NBS1J3UkFJQVlnQjNGQkFXb2hCaUFJRFFFTEN5QUpSUTBBSUFVUUdDQUZRWDgyQXFEckFTQUZJQWsyQXBUckFTQUZJQVVvQXR6cEFTSUlOZ0tZNndFTUFRc2dCU2dDM09rQklRZ0xBa0FnQ0VVTkFDQUZLQUtZNndFZ0NFWU5BRUZnSVFrTUJnc0NRQ0FGS0FMZzZRRUVRQ0FGSUFVb0F1anFBU0lKUlRZQzdPb0JJQWtOQVNBRlF2bnEwTkRueWFIazRRQTNBNmpxQVNBRlFnQTNBNkRxQVNBRlFzL1cwNzdTeDZ2WlFqY0RtT29CSUFWQzF1dUM3dXI5aWZYZ0FEY0RrT29CSUFWQ0FEY0RpT29CSUNKQkFFRW9FQU1hREFFTElBVkJBRFlDN09vQkN5QUJJQjFxSVNVZ0JTQUZLUVBvNlFFZ0RxMThOd1BvNlFFZ0F5QU9heUVESUFJZ0Rtb2hBaUFkSVE0RFFDQUNJQU1nQkVFc2FoQWRJaFZCaUg5TEJFQWdGU0VKREFZTElBTkJBMnNpTlNBVlNRMEVJQUpCQTJvaEcwRnNJUWtDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVLQUlzRGdNQ0FRQVZDeUFWUWYvL0Iwc05FeUFWUVFOSkRSSWdCU2tEeU9rQklUOENRQUpBSUJzdEFBQWlDVUVEY1NJYVFRRnJEZ01HQVFBSEN5QUZLQUtBNmdFTkFFRmlJUWtNRlFzZ0ZVRUZTUTBTSUJzb0FBQWhBd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRWlDVUVDYXc0Q0FRSUFDeUFKUVFCSElRY2dBMEVFZGtIL0IzRWhDMEVESVFZZ0EwRU9ka0gvQjNFTUFndEJCQ0VHSUFOQkJIWkIvLzhBY1NFTFFRRWhCeUFEUVJKMkRBRUxJQU5CQkhaQi8vOFBjU0lMUVlDQUNFc05FMEVCSVFkQkJTRUdJQUl0QUFkQkNuUWdBMEVXZG5JTElnZ2dCbW9pQ1NBVlN3MFNBa0FnQzBHQkJra05BQ0FGS0FLYzZ3RkZEUUJCQUNFREEwQWdBMEdEZ0FGTERRRWdBMEZBYXlFRERBQUxBQXNnQmlBYmFpRVBJQnBCQTBjTkJpQUZLQUlNSWdJdEFBRkJDSFFoQXlBSERRY2dBMFVOQ0NBRVFmQUFhaUFQSUFnUURTSURRWWgvU3cwSklBSkJCR29oQmlBTElCeHFJaEpCQTJzaENrRUFJQUl2QVFKclFSOXhJUWNnSENFREEwQWdCRUh3QUdvUUQwVWdBeUFLU1hFRVFDQURJQVlnQkNnQ2NDSUlJQVFvQW5RaUQzUWdCM1pCQW5ScUlnSXZBUUE3QUFBZ0F5QUNMUUFEYWlJRElBWWdDQ0FQSUFJdEFBSnFJZ2gwSUFkMlFRSjBhaUlDTHdFQU93QUFJQVFnQ0NBQ0xRQUNhallDZENBRElBSXRBQU5xSVFNTUFRVWdFa0VDYXlFSUEwQWdCRUh3QUdvUUR5RVBJQVFvQW5BaENpQUVLQUowSVFJZ0F5QUlTeUFQY2tVRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUNpOEJBRHNBQUNBRUlBSWdDaTBBQW1vMkFuUWdBeUFLTFFBRGFpRUREQUVMQ3dOQUlBTWdDRTBFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pRHk4QkFEc0FBQ0FESUE4dEFBTnFJUU1nQWlBUExRQUNhaUVDREFFTEN3SkFJQU1nRWs4TkFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUF5MEFBRG9BQUNBRExRQURRUUZHQkVBZ0FpQURMUUFDYWlFQ0RBRUxJQUpCSDBzTkFFRWdJQUlnQXkwQUFtb2lBaUFDUVNCUEd5RUNDMEZzUVd3Z0N5QUVLQUo0SUFRb0FueEhHeUFDUVNCSEd5RUREQXNMQUFzQUN5QUVLQUkwSWdJZ0pTQU9hMHNOQ2lBT1JRUkFRUUFoQ1NBQ0RRSU1EZ3NnRGlBYkxRQUFJQUlRQXhvZ0FpRUpEQXdMSUJVZ0pTQU9hMHNOQ1NBT0RRRkJBQ0VKSUJWRkRRd0xRYlovSVFrTUVRc2dEaUFiSUJVUUFob2dGU0VKREFvTElCd2dHd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRkJBV3NPQXdFQUFnQUxJQWxCQTNZaEEwRUJEQUlMSUJzdkFBQkJCSFloQTBFQ0RBRUxJQlZCQkVrTkRpQUNMd0FESUFJdEFBVkJFSFJ5SWdKQmo0Q0FBVXNORGlBQ1FRUjJJUU5CQXdzaUFtb3RBQUFnQTBFZ2FoQURJUWtnQlNBRE5nS0E2d0VnQlNBSk5nTHc2Z0VnQWtFQmFpRUpEQVVMSUJVQ2Z3SkFBa0FDUUNBSlFRSjJRUU54UVFGckRnTUJBQUlBQ3lBSlFRTjJJUU5CQVF3Q0N5QWJMd0FBUVFSMklRTkJBZ3dCQ3lBQ0x3QURJQUl0QUFWQkVIUnlRUVIySVFOQkF3c2lBaUFEYWlJSlFTQnFTUVJBSUFrZ0ZVc05EU0FjSUFJZ0cyb2dBeEFDSVFJZ0JTQUROZ0tBNndFZ0JTQUNOZ0x3NmdFZ0FpQURhaUlDUWdBM0FCZ2dBa0lBTndBUUlBSkNBRGNBQ0NBQ1FnQTNBQUFNQlFzZ0JTQUROZ0tBNndFZ0JTQUNJQnRxTmdMdzZnRU1CQXNnQjBVRVFDQWVJQThnQ0NBVUVCUWlBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRlNFRERBTUxJQXRGSUFoRmNnMExJQXRCQ0hZaUF5QUlJQXRKQkg4Z0NFRUVkQ0FMYmdWQkR3dEJHR3dpQWtHTUNHb29BZ0JzSUFKQmlBaHFLQUlBYWlJR1FRTjJJQVpxSUFKQmdBaHFLQUlBSUFKQmhBaHFLQUlBSUFOc2Fra0VRQ01BUVJCckloQWtBQ0FlS0FJQUlRTWdGRUh3QkdwQkFFSHNBQkFESVFaQlZDRUNBa0FnQTBIL0FYRWlERUVNU3cwQUFrQWdGRUhjQ1dvZ0JpQVFRUWhxSUJCQkRHb2dEeUFJSUJSQjNBdHFJaGNRQ3lJU1FZaC9TdzBBSUJBb0Fnd2lCaUFNU3cwQklCUkJxQVZxSVEwZ0ZFR2tCV29oTmlBZVFRUnFJUkVnQTBHQWdJQjRjU0UzSUFaQkFXb2lFeUVDSUFZaEF3TkFJQUlpQjBFQmF5RUNJQU1pQ2tFQmF5RURJQlFnQ2tFQ2RHb29BdkFFUlEwQUMwRUJJQWNnQjBFQlRSc2hGa0VBSVFkQkFTRUNBMEFnQWlBV1J3UkFJQlFnQWtFQ2RDSURhaWdDOEFRaEdDQURJQTFxSUFjMkFnQWdBa0VCYWlFQ0lBY2dHR29oQnd3QkN3c2dEU0FITmdJQVFRQWhBaUFRS0FJSUlRTURRQ0FDSUFOSEJFQWdEU0FDSUJScVFkd0phaTBBQUNJWVFRSjBhaUlaSUJrb0FnQWlHVUVCYWpZQ0FDQVVJQmxCQVhScUloa2dHRG9BM1FVZ0dTQUNPZ0RjQlNBQ1FRRnFJUUlNQVFzTFFRQWhBeUFOUVFBMkFnQWdEQ0FHUVg5emFpRUdRUUVoQWdOQUlBSWdGa2NFUUNBVUlBSkJBblJxSWcwZ0F6WUNBQ0FOS0FMd0JDQUNJQVpxZENBRGFpRURJQUpCQVdvaEFnd0JDd3NnRENBVElBcHJJZ1pyUVFGcUlRb2dCaUVEQTBBZ0F5QUtTUVJBSUJRZ0EwRTBiR29oRFVFQklRSURRQ0FDSUJaSEJFQWdEU0FDUVFKMEloaHFJQlFnR0dvb0FnQWdBM1kyQWdBZ0FrRUJhaUVDREFFTEN5QURRUUZxSVFNTUFRc0xJQmNnRkVFMEVBSWhPQ0FVUVpBTWFpRTVJQk1nREdzaE9pQVVRZHdGYWlFWFFRQWhDZ05BQWtBQ1FDQUhJQXBIQkVCQkFTQU1JQk1nRnlBS1FRRjBhaUlDTFFBQklnMXJJZ05ySWhoMElSa2dBaTBBQUNFV0lEZ2dEVUVDZEdvaUh5Z0NBQ0VDSUFZZ0dFMEVRQ0EyUVFFZ0F5QTZhaUlOSUExQkFVd2JJaUJCQW5RaUpHb29BZ0FoRFNBNUlCUWdBMEUwYkdwQk5CQUNJU0VnRFVFQmRDRW1JQkVnQWtFQ2RHb2hJeUFnUVFGTkRRSWdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVnSUNFZ0pHb29BZ0FoSkVFQUlRSURRQ0FDSUNSR0RRTWdJeUFDUVFKMGFpQWdOZ0VBSUFKQkFXb2hBZ3dBQ3dBTElBSWdBaUFaYWlJTklBSWdEVXNiSVEwZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRURBMEFnQWlBTlJnMERJQkVnQWtFQ2RHb2dBellCQUNBQ1FRRnFJUUlNQUFzQUN5QWVJQXhCRUhRZ04zSWdESEpCZ0FKeU5nSUFEQU1MSUFjZ0RXc2hKQ0FYSUNacUlTWkJBQ0VOQTBBZ0RTQWtSZzBCUVFFZ0dDQVRJQ1lnRFVFQmRHb2lKeTBBQVNJQ2F5STdhM1FpUENBaElBSkJBblJxSWlBb0FnQWlBbW9oUFNBRElEdHFRUkIwUVlDQS9BZHhJQ2N0QUFCQkNIUnlJQlp5UVlDQWdCQnlJU2NEUUNBaklBSkJBblJxSUNjMkFRQWdBa0VCYWlJQ0lEMUpEUUFMSUNBZ0lDZ0NBQ0E4YWpZQ0FDQU5RUUZxSVEwTUFBc0FDeUFmSUI4b0FnQWdHV28yQWdBZ0NrRUJhaUVLREFBTEFBc2dFaUVDQ3lBUVFSQnFKQUFnQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZpRUREQU1MSUI0Z0R5QUlJQlFRRkNJQ1FZaC9TeUFDSUFoUGNnMExJQndnQ3lBQ0lBOXFJQWdnQW1zZ0hoQVhJUU1NQWdzZ0F3UkFJQndnQ3lBUElBZ2dBaEFXSVFNTUFnc2dIQ0FMSUE4Z0NDQUNFQmNoQXd3QkN5QWNJQXNnRHlBSUlBSVFGU0VEQ3lBRFFZaC9TdzBJSUFVZ0N6WUNnT3NCSUFVZ0hEWUM4T29CSUFWQkFUWUNnT29CSUJwQkFrWUVRQ0FGSUI0MkFnd0xJQXNnSEdvaUFrSUFOd0FBSUFKQ0FEY0FHQ0FDUWdBM0FCQWdBa0lBTndBSUlBbEJpSDlMRFFvTElBa2dGVVlOQ0NBVklBbHJJUVlnQlNnQ25Pc0JJUW9DUUNBSklCdHFJZ010QUFBaUQwVUVRRUVCSVFKQkFDRVBRYmgvSVFrZ0JrRUJSZzBCREFzTEFuOGdBMEVCYWlBUHdDSUNRUUJPRFFBYUlBSkJmMFlFUUNBR1FRTklEUXNnQXk4QUFVR0EvZ0ZxSVE4Z0EwRURhZ3dCQ3lBR1FRSklEUW9nQXkwQUFTQVBRUWgwY2tHQWdBSnJJUThnQTBFQ2Fnc2hFa0c0ZnlFSklCSkJBV29pQWlBVklCdHFJZ2RMRFFvZ0xDQUZJQkl0QUFBaUVrRUdka0VqUVFrZ0FpQUhJQUpyUWNBUVFkQVJRZkFTSUFVb0FvVHFBU0FLSUE4Z0ZCQWhJZ2xCaUg5TERRZ2dLeUFvSUJKQkJIWkJBM0ZCSDBFSUlBSWdDV29pQWlBSElBSnJRWUFMUVlBTVFZQVhJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQ0VHSWYwc05DRUZzSVFrZ0tpQXRJQkpCQW5aQkEzRkJORUVKSUFJZ0NHb2lBaUFISUFKclFZQU5RZUFPUVpBWklBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlCMEdJZjBzTkNpQUNJQWRxSUFOcklnSWhDU0FDUVloL1N3MEtDeUFPSUE5QkFFeHlEUUVMUWJwL0lRa01DQXNnSlNBT2F5RUpJQVlnQW1zaEJpQUNJQU5xSVFjQ1FBSkFBa0FnQ2tVRVFDQVBRUWxJSUFVcEE4anBBVUtCZ0lBSVZISU5BaUFvS0FJQUlnSkJDR29oRWlBQ0tBSUVJUXBCQUNFRFFRQWhBZ05BSUFNZ0NuWkZCRUFnQWlBU0lBTkJBM1JxTFFBQ1FSWkxhaUVDSUFOQkFXb2hBd3dCQ3dzZ0JVRUFOZ0tjNndFZ0FrRUlJQXByZEVFVVR3MEJEQU1MSUFWQkFEWUNuT3NCQ3lBRUlBVW9BdkRxQVNJRE5nTGNBU0FKSUE1cUlSWWdBeUFGS0FLQTZ3RnFJUmNDUUNBUFJRUkFJQTRoQnd3QkN5QUZLQUs0NlFFaEdpQUZLQUswNlFFaEdDQUZLQUt3NlFFaEVpQUZRUUUyQW9UcUFVRUFJUU1EUUNBRFFRTkhCRUFnQkNBRFFRSjBJZ0pxSUFJZ0JXcEJyTkFCYWlnQ0FEWUNaQ0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRVGhxSWdJZ0J5QUdFQTFCaUg5TERRTkJDQ0FQSUE5QkNFNGJJUjhnTkNBQ0lBVW9BZ0FRSGlBeklBSWdCU2dDQ0JBZUlESWdBaUFGS0FJRUVCNGdEaUFTYXlFWlFRQWhDQU5BSUFSQk9Hb1FEMEVEUmlBSUlCOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnZEJFSFlpRVVIL0FYRWhDeUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWd4QkVIWWlJVUgvQVhFaEVDQUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFZZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDa0gvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJS2F5SU5JQUlnQWlBTlN4c2lFeUFLYWpZQ1BDQUdJQVFvQWpnZ0NuUkJBQ0FUYTNZZ0FpQVRheUlUZEdvaENpQUVRVGhxRUE4YUlBSWdEVTBOQVNBRUlBUW9BandpQWlBVGFqWUNQQ0FFS0FJNElBSjBRUUFnRTJ0MklBcHFJUW9NQVFzZ0JDQUNJQVFvQWp3aURXbzJBandnQkNnQ09DQU5kRUVBSUFwcmRpQUdhaUVLSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUFvMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQURCRUFnQkNnQ1pDRUtEQU1MSUFRb0FtZ2hDZ3dCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFZZ0EwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnWkZJQVpxSVFvZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQW8yQW1RTHB5RUNJRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUJCcU5nSThJQVFvQWpnZ0JuUkJBQ0FoYTNZZ0Ftb2hBZ3NnQ3lBUWFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lBdHFOZ0k4SUFRb0FqZ2dCblJCQUNBUmEzWWdBMm9oQXdzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQmtFQUlBZEJHSFlpQ3lBRUtBSThhaUlRYTNZZ0MwRUNkRUdnSFdvb0FnQnhJQWRCLy84RGNXbzJBa3dnQkNBUUlBeEJHSFlpQjJvaUN6WUNQQ0FFSUFkQkFuUkJvQjFxS0FJQUlBWkJBQ0FMYTNaeElBeEIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdaQkdIWWlCeUFFS0FJOGFpSUxOZ0k4SUFRZ0IwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBdHJkbkVnQmtILy93TnhhallDVkNBRVFmQUFhaUFJUVF4c2FpSUdJQW8yQWdnZ0JpQUNOZ0lFSUFZZ0F6WUNBQ0FJUVFGcUlRZ2dBeUFaYWlBQ2FpRVpEQUVMQ3lBSUlCOUlEUU1nRmtFZ2F5RWhJQTRoQndOQUlBUkJPR29RRDBFRFJpQUlJQTlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ1pCRUhZaUkwSC9BWEVoQ2lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklnMUJFSFlpSUVIL0FYRWhFeUFFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRTWdRVUlnaUNCQVFpQ0lweUVMQWtBZ1FrSVFpS2NpREVIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSU1heUlSSUFJZ0FpQVJTeHNpRUNBTWFqWUNQQ0FESUFRb0FqZ2dESFJCQUNBUWEzWWdBaUFRYXlJTWRHb2hFQ0FFUVRocUVBOGFJQUlnRVUwTkFTQUVJQVFvQWp3aUFpQU1hallDUENBRUtBSTRJQUowUVFBZ0RHdDJJQkJxSVJBTUFRc2dCQ0FDSUFRb0Fqd2lFR28yQWp3Z0JDZ0NPQ0FRZEVFQUlBeHJkaUFEYWlFUUlBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlCQTJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FMQkVBZ0JDZ0NaQ0VRREFNTElBUW9BbWdoRUF3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBTWdDMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ05GSUFOcUlSQWdBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUJBMkFtUUxweUVNSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lCTnFOZ0k4SUFRb0FqZ2dBblJCQUNBZ2EzWWdER29oREFzZ0NpQVRha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQXBxTmdJOElBUW9BamdnQW5SQkFDQWphM1lnQzJvaEN3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUFrRUFJQVpCR0hZaUF5QUVLQUk4YWlJS2EzWWdBMEVDZEVHZ0hXb29BZ0J4SUFaQi8vOERjV28yQWt3Z0JDQUtJQTFCR0hZaUEyb2lCallDUENBRUlBTkJBblJCb0IxcUtBSUFJQUpCQUNBR2EzWnhJQTFCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnSkJHSFlpQXlBRUtBSThhaUlHTmdJOElBUWdBMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQVpyZG5FZ0FrSC8vd054YWpZQ1ZBSkFBa0FDUUNBRUtBTGNBU0lESUFSQjhBQnFJQWhCQjNGQkRHeHFJaE1vQWdBaUVXb2lJeUFYU3cwQUlBY2dFeWdDQkNJTklCRnFJZ3BxSUNGTERRQWdDa0VnYWlBV0lBZHJUUTBCQ3lBRUlCTW9BZ2cyQWhnZ0JDQVRLUUlBTndNUUlBY2dGaUFFUVJCcUlBUkIzQUZxSUJjZ0VpQVlJQm9RSHlFS0RBRUxJQWNnRVdvaEFpQVRLQUlJSVFZZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNBSkFJQkZCRVVrTkFDQUhJQU1wQUJBM0FCQWdCeUFES1FBWU53QVlJQkZCRUd0QkVVZ05BQ0FEUVJCcUlRTWdCMEVnYWlFUkEwQWdFU0FES1FBUU53QUFJQkVnQXlrQUdEY0FDQ0FSSUFNcEFDQTNBQkFnRVNBREtRQW9Od0FZSUFOQklHb2hBeUFSUVNCcUloRWdBa2tOQUFzTElBSWdCbXNoQXlBRUlDTTJBdHdCSUFJZ0Vtc2dCa2tFUUNBR0lBSWdHR3RMRFFjZ0dpQWFJQU1nRW1zaUEyb2lFU0FOYWs4RVFDQUNJQkVnRFJBS0dnd0NDeUFESUExcUlRMGdBaUFSUVFBZ0Eyc1FDaUFEYXlFQ0lCSWhBd3NnQmtFUVR3UkFJQUlnQXlrQUFEY0FBQ0FDSUFNcEFBZzNBQWdnRFVFUlNBMEJJQUlnRFdvaEJpQUNRUkJxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQUdTUTBBQ3d3QkN3SkFJQVpCQjAwRVFDQUNJQU10QUFBNkFBQWdBaUFETFFBQk9nQUJJQUlnQXkwQUFqb0FBaUFDSUFNdEFBTTZBQU1nQWlBRElBWkJBblFpQmtIQUhtb29BZ0JxSWdNb0FBQTJBQVFnQXlBR1FlQWVhaWdDQUdzaEF3d0JDeUFDSUFNcEFBQTNBQUFMSUExQkNVa05BQ0FDSUExcUlSRWdBa0VJYWlJR0lBTkJDR29pQTJ0QkQwd0VRQU5BSUFZZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQmtFSWFpSUdJQkZKRFFBTUFnc0FDeUFHSUFNcEFBQTNBQUFnQmlBREtRQUlOd0FJSUExQkdVZ05BQ0FDUVJocUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFSU1EwQUN3c2dDa0dJZjBzRVFDQUtJUWtNQmdVZ0V5QVFOZ0lJSUJNZ0REWUNCQ0FUSUFzMkFnQWdDRUVCYWlFSUlBY2dDbW9oQnlBTElCbHFJQXhxSVJrTUFnc0FDd3NnQ0NBUFNBMERJQWdnSDJzaEJnTkFBa0FnQmlBUFRnUkFRUUFoQXdOQUlBTkJBMFlOQWlBRklBTkJBblFpQW1wQnJOQUJhaUFDSUFScUtBSmtOZ0lBSUFOQkFXb2hBd3dBQ3dBTEFrQUNRQUpBSUFRb0F0d0JJZ01nQkVId0FHb2dCa0VIY1VFTWJHb2lDQ2dDQUNJTWFpSVFJQmRMRFFBZ0J5QUlLQUlFSWdzZ0RHb2lDbW9nSVVzTkFDQUtRU0JxSUJZZ0IydE5EUUVMSUFRZ0NDZ0NDRFlDS0NBRUlBZ3BBZ0EzQXlBZ0J5QVdJQVJCSUdvZ0JFSGNBV29nRnlBU0lCZ2dHaEFmSVFvTUFRc2dCeUFNYWlFQ0lBZ29BZ2doQ0NBSElBTXBBQUEzQUFBZ0J5QURLUUFJTndBSUFrQWdERUVSU1EwQUlBY2dBeWtBRURjQUVDQUhJQU1wQUJnM0FCZ2dERUVRYTBFUlNBMEFJQU5CRUdvaEF5QUhRU0JxSVF3RFFDQU1JQU1wQUJBM0FBQWdEQ0FES1FBWU53QUlJQXdnQXlrQUlEY0FFQ0FNSUFNcEFDZzNBQmdnQTBFZ2FpRURJQXhCSUdvaURDQUNTUTBBQ3dzZ0FpQUlheUVESUFRZ0VEWUMzQUVnQWlBU2F5QUlTUVJBSUFnZ0FpQVlhMHNOQnlBYUlCb2dBeUFTYXlJRGFpSU1JQXRxVHdSQUlBSWdEQ0FMRUFvYURBSUxJQU1nQzJvaEN5QUNJQXhCQUNBRGF4QUtJQU5ySVFJZ0VpRURDeUFJUVJCUEJFQWdBaUFES1FBQU53QUFJQUlnQXlrQUNEY0FDQ0FMUVJGSURRRWdBaUFMYWlFSUlBSkJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBSWdBeTBBQURvQUFDQUNJQU10QUFFNkFBRWdBaUFETFFBQ09nQUNJQUlnQXkwQUF6b0FBeUFDSUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQUlnQXlrQUFEY0FBQXNnQzBFSlNRMEFJQUlnQzJvaERDQUNRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dERWtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQzBFWlNBMEFJQUpCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXhKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdHQlNBR1FRRnFJUVlnQnlBS2FpRUhEQUlMQUFzTElBUW9BdHdCSVFNTFFicC9JUWtnRnlBRGF5SUNJQllnQjJ0TERRSWdCd1IvSUFjZ0F5QUNFQUlnQW1vRlFRQUxJQTVySVFrTUFnc2dCVUVBTmdLYzZ3RUxJQVFnQlNnQzhPb0JJZ00yQXR3QklBa2dEbW9oRENBRElBVW9Bb0RyQVdvaEVBSkFJQTlGQkVBZ0RpRUdEQUVMSUFVb0FyanBBU0VOSUFVb0FyVHBBU0VUSUFVb0FyRHBBU0VTSUFWQkFUWUNoT29CUVFBaEF3TkFJQU5CQTBjRVFDQUVJQU5CQW5RaUFtb2dBaUFGYWtHczBBRnFLQUlBTmdLY0FTQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFmQUFhaUlDSUFjZ0JoQU5RWWgvU3cwQklERWdBaUFGS0FJQUVCNGdNQ0FDSUFVb0FnZ1FIaUF2SUFJZ0JTZ0NCQkFlSUF4QklHc2hHQ0FPSVFZRFFDQUVLQUtJQVNBRUtBS0VBVUVEZEdvcEFnQWlRS2NpQ2tFUWRpSVpRZjhCY1NFTElBUW9BcGdCSUFRb0FwUUJRUU4wYWlrQ0FDSkJweUlXUVJCMkloOUIvd0Z4SVJvZ0JDZ0NrQUVnQkNnQ2pBRkJBM1JxS1FJQUlrSkNJSWluSVFjZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDRUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDZENJSWF5SVJJQUlnQWlBUlN4c2lGeUFJYWpZQ2RDQUhJQVFvQW5BZ0NIUkJBQ0FYYTNZZ0FpQVhheUlYZEdvaENDQUVRZkFBYWhBUEdpQUNJQkZORFFFZ0JDQUVLQUowSWdJZ0YybzJBblFnQkNnQ2NDQUNkRUVBSUJkcmRpQUlhaUVJREFFTElBUWdBaUFFS0FKMEloRnFOZ0owSUFRb0FuQWdFWFJCQUNBSWEzWWdCMm9oQ0NBRVFmQUFhaEFQR2dzZ0JDa0NuQUVoUkNBRUlBZzJBcHdCSUFRZ1JEY0NvQUVNQVFzQ1FDQUNSUVJBSUFNRVFDQUVLQUtjQVNFSURBTUxJQVFvQXFBQklRZ01BUXNnQkNBRUtBSjBJZ0pCQVdvMkFuUUNmeUFISUFORmFpQUVLQUp3SUFKMFFSOTJhaUlDUVFOR0JFQWdCQ2dDbkFGQkFXc01BUXNnQWtFQ2RDQUVhaWdDbkFFTElnZEZJQWRxSVFnZ0FrRUJSd1JBSUFRZ0JDZ0NvQUUyQXFRQkN3c2dCQ0FFS0FLY0FUWUNvQUVnQkNBSU5nS2NBUXVuSVFJZ1FVS0FnUHdIZzFCRkJFQWdCQ0FFS0FKMElnY2dHbW8yQW5RZ0JDZ0NjQ0FIZEVFQUlCOXJkaUFDYWlFQ0N5QUxJQnBxUVJSUEJFQWdCRUh3QUdvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NkQ0lISUF0cU5nSjBJQVFvQW5BZ0IzUkJBQ0FaYTNZZ0Eyb2hBd3NnQkVId0FHb1FEeG9nQkNBRUtBSndJZ2RCQUNBS1FSaDJJZ3NnQkNnQ2RHb2lHbXQySUF0QkFuUkJvQjFxS0FJQWNTQUtRZi8vQTNGcU5nS0VBU0FFSUJvZ0ZrRVlkaUlLYWlJTE5nSjBJQVFnQ2tFQ2RFR2dIV29vQWdBZ0IwRUFJQXRyZG5FZ0ZrSC8vd054YWpZQ2xBRWdCRUh3QUdvUUR4b2dCQ0JDcHlJSFFSaDJJZ29nQkNnQ2RHb2lDellDZENBRUlBcEJBblJCb0IxcUtBSUFJQVFvQW5CQkFDQUxhM1p4SUFkQi8vOERjV28yQW93QklBUWdBellDT0NBRUlBSTJBandnQkNBSU5nSkFBa0FDUUFKQUlBUW9BdHdCSWdzZ0Eyb2lGaUFRU3cwQUlBWWdBaUFEYWlJS2FpQVlTdzBBSUFwQklHb2dEQ0FHYTAwTkFRc2dCQ0FFUVVCcktBSUFOZ0lJSUFRZ0JDa0RPRGNEQUNBR0lBd2dCQ0FFUWR3QmFpQVFJQklnRXlBTkVCOGhDZ3dCQ3lBRElBWnFJUWNnQmlBTEtRQUFOd0FBSUFZZ0N5a0FDRGNBQ0FKQUlBTkJFVWtOQUNBR0lBc3BBQkEzQUJBZ0JpQUxLUUFZTndBWUlBTkJFR3RCRVVnTkFDQUxRUkJxSVFNZ0JrRWdhaUVMQTBBZ0N5QURLUUFRTndBQUlBc2dBeWtBR0RjQUNDQUxJQU1wQUNBM0FCQWdDeUFES1FBb053QVlJQU5CSUdvaEF5QUxRU0JxSWdzZ0Iwa05BQXNMSUFjZ0NHc2hBeUFFSUJZMkF0d0JJQWNnRW1zZ0NFa0VRQ0FJSUFjZ0UydExEUVFnRFNBTklBTWdFbXNpQTJvaUN5QUNhazhFUUNBSElBc2dBaEFLR2d3Q0N5QUhJQXRCQUNBRGF4QUtJQVFnQWlBRGFpSUNOZ0k4SUFOcklRY2dFaUVEQ3lBSVFSQlBCRUFnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0NBQ1FSRklEUUVnQWlBSGFpRUlJQWRCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQWNnQXkwQUFEb0FBQ0FISUFNdEFBRTZBQUVnQnlBRExRQUNPZ0FDSUFjZ0F5MEFBem9BQXlBSElBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFjZ0F5a0FBRGNBQUFzZ0FrRUpTUTBBSUFJZ0Iyb2hDeUFIUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnQzBrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0FrRVpTQTBBSUFkQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF0SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3REN5QUdJQXBxSVFZZ0JFSHdBR29RRHlFRElBOUJBV3NpRHcwQUMwRUFJUUlnQTBFQ1NRMEJBMEFnQWtFRFJ3UkFJQVVnQWtFQ2RDSURha0dzMEFGcUlBTWdCR29vQXB3Qk5nSUFJQUpCQVdvaEFnd0JDd3NnQkNnQzNBRWhBd3RCdW44aENTQVFJQU5ySWdJZ0RDQUdhMHNOQUNBR0JIOGdCaUFESUFJUUFpQUNhZ1ZCQUFzZ0Rtc2hDUXNnQ1VHSWYwc05CZ3NDUUNBRktBTHM2Z0ZGRFFBZ0JTQUZLUU9JNmdFZ0NhMThOd09JNmdFQ1FDQUZLQUxRNmdFaUFpQUphaUlJUVI5TkJFQWdEa1VOQVNBQ0lDSnFJQTRnQ1JBQ0dpQUZLQUxRNmdFZ0NXb2hDQXdCQ3lBT0lRTWdBZ1JBSUFJZ0ltb2dBMEVnSUFKckVBSWFJQVVvQXREcUFTRUNJQVZCQURZQzBPb0JJQVVnQlNrRGtPb0JJQVVwQUxEcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RrT29CSUFVZ0JTa0RtT29CSUFVcEFManFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEbU9vQklBVWdCU2tEb09vQklBVXBBTURxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG9Pb0JJQVVnQlNrRHFPb0JJQVVwQU1qcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RxT29CSUFNZ0FtdEJJR29oQXdzZ0NTQU9haUlDSUFOQklHcFBCRUFnQWtFZ2F5RUdJQVVwQTZqcUFTRS9JQVVwQTZEcUFTRkFJQVVwQTVqcUFTRkJJQVVwQTVEcUFTRkNBMEFnQXlrQUdFTFAxdE8rMHNlcjJVSitJRDk4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVDhnQXlrQUVFTFAxdE8rMHNlcjJVSitJRUI4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUFnQXlrQUNFTFAxdE8rMHNlcjJVSitJRUY4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUVnQXlrQUFFTFAxdE8rMHNlcjJVSitJRUo4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUlnQTBFZ2FpSURJQVpORFFBTElBVWdQemNEcU9vQklBVWdRRGNEb09vQklBVWdRVGNEbU9vQklBVWdRamNEa09vQkN5QUNJQU5ORFFFZ0lpQURJQUlnQTJzaUNCQUNHZ3NnQlNBSU5nTFE2Z0VMSURVZ0ZXc2hBeUFWSUJ0cUlRSWdDU0FPYWlFT0lBUW9BakJGRFFBTElDa3BBd0FpUDBKL1VTQS9JQTRnSFd1c1VYSkZCRUJCYkNFSkRBWUxJQVVvQXVEcEFRUkFRV29oQ1NBRFFRUkpEUVlnQlNnQzZPb0JSUVJBSUNJZ0JTZ0MwT29CYWlFS0FuNGdCU2tEaU9vQklqOUNJRm9FUUNBRktRT1k2Z0VpUUVJSGlTQUZLUU9RNmdFaVFVSUJpWHdnQlNrRG9Pb0JJa0pDRElsOElBVXBBNmpxQVNKRFFoS0pmQ0JCUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlJRUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9mb1ZDaDVXdnI1aTIzcHVlZjM1Q25hTzE2b094allyNkFIMGdRa0xQMXRPKzBzZXIyVUorUWgrSlFvZVZyNitZdHQ2Ym5uOStoVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTQkRRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOURBRUxJQVVwQTZEcUFVTEZ6OW15OGVXNjZpZDhDeUEvZkNFL0lDSWhCZ05BSUFvZ0JrRUlhaUlIVHdSQUlBWXBBQUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9maUEvaFVJYmlVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNFL0lBY2hCZ3dCQ3dzQ1FDQUtJQVpCQkdvaUNFa0VRQ0FHSVFnTUFRc2dCalVBQUVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUlYaVVMUDF0Tyswc2VyMlVKK1F2bnozZkdaOXBtckZud2hQd3NEUUNBSUlBcEpCRUFnQ0RFQUFFTEZ6OW15OGVXNjZpZCtJRCtGUWd1SlFvZVZyNitZdHQ2Ym5uOStJVDhnQ0VFQmFpRUlEQUVMQ3lBQ0tBQUFJRDlDSVlnZ1A0VkN6OWJUdnRMSHE5bENmaUkvUWgySUlEK0ZRdm56M2ZHWjlwbXJGbjRpUDBJZ2lDQS9oYWRIRFFjTElBTkJCR3NoQXlBQ1FRUnFJUUlMSUE0Z0hXc2lDVUdKZjA4TkJDQUJJQWxySVFFZ0NTQWRhaUVkUVFFaFBnd0JDd3RCdUg4aEJ5QUREUVFnSFNBQWF5RUhEQVFMUVd3aENRd0JDMEc0ZnlFSkMwRzRmeUVISUFsQmRrWWdQbkVOQVFzZ0NTRUhDeWdDQUEwQUlBVkIvT29CYWlnQ0FDRUJJQVZCK09vQmFpZ0NBQ0VBSUFVUUdDQUZLQUt3NndFZ0FDQUJFQk1nQlVFQU5nS3c2d0VnQlNnQ3BPc0JJZ0lFUUFKQUFrQUNRQUpBSUFJb0FnQWlBd1JBSUFCRkRRSWdBU0FESUFBUkFnQU1BUXNnQUVVTkFnc2dBU0FDSUFBUkFnQU1BZ3NnQXhBR0N5QUNFQVlMSUFWQkFEWUNwT3NCQ3lBQUJFQWdBU0FGSUFBUkFnQU1BUXNnQlJBR0N5QUVRZUFCYWlRQUlBY0xDNmdWQ1FCQmlBZ0xEUUVBQUFBQkFBQUFBZ0FBQUFJQVFhQUlDN01HQVFBQUFBRUFBQUFDQUFBQUFnQUFBQ1lBQUFDQ0FBQUFJUVVBQUVvQUFBQm5DQUFBSmdBQUFNQUJBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFLUUFBQUN3Q0FBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUx3QUFBTW9DQUFDQUFBQUFpZ1VBQUVvQUFBQ0VDUUFBTlFBQUFITURBQUNBQUFBQW5RVUFBRW9BQUFDZ0NRQUFQUUFBQUlFREFBQ0FBQUFBNndVQUFFc0FBQUErQ2dBQVJBQUFBSjREQUFDQUFBQUFUUVlBQUVzQUFBQ3FDZ0FBU3dBQUFMTURBQUNBQUFBQXdRWUFBRTBBQUFBZkRRQUFUUUFBQUZNRUFBQ0FBQUFBSXdnQUFGRUFBQUNtRHdBQVZBQUFBSmtFQUFDQUFBQUFTd2tBQUZjQUFBQ3hFZ0FBV0FBQUFOb0VBQUNBQUFBQWJ3a0FBRjBBQUFBakZBQUFWQUFBQUVVRkFBQ0FBQUFBVkFvQUFHb0FBQUNNRkFBQWFnQUFBSzhGQUFDQUFBQUFkZ2tBQUh3QUFBQk9FQUFBZkFBQUFOSUNBQUNBQUFBQVl3Y0FBSkVBQUFDUUJ3QUFrZ0FBQUFBQUFBQUJBQUFBQVFBQUFBVUFBQUFOQUFBQUhRQUFBRDBBQUFCOUFBQUEvUUFBQVAwQkFBRDlBd0FBL1FjQUFQMFBBQUQ5SHdBQS9UOEFBUDEvQUFEOS93QUEvZjhCQVAzL0F3RDkvd2NBL2Y4UEFQMy9Id0Q5L3o4QS9mOS9BUDMvL3dEOS8vOEIvZi8vQS8zLy93ZjkvLzhQL2YvL0gvMy8vei85Ly85L0FBQUFBQUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFSQUFBQUVnQUFBQk1BQUFBVUFBQUFGUUFBQUJZQUFBQVhBQUFBR0FBQUFCa0FBQUFhQUFBQUd3QUFBQndBQUFBZEFBQUFIZ0FBQUI4QUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQkVBQUFBU0FBQUFFd0FBQUJRQUFBQVZBQUFBRmdBQUFCY0FBQUFZQUFBQUdRQUFBQm9BQUFBYkFBQUFIQUFBQUIwQUFBQWVBQUFBSHdBQUFDQUFBQUFoQUFBQUlnQUFBQ01BQUFBbEFBQUFKd0FBQUNrQUFBQXJBQUFBTHdBQUFETUFBQUE3QUFBQVF3QUFBRk1BQUFCakFBQUFnd0FBQUFNQkFBQURBZ0FBQXdRQUFBTUlBQUFERUFBQUF5QUFBQU5BQUFBRGdBQUFBd0FCQUVIZ0R3dFJBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFVQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QUFBQXdBQUFBTkFBQUFEZ0FBQUE4QUFBQVFBRUhFRUF1TEFRRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVNBQUFBRkFBQUFCWUFBQUFZQUFBQUhBQUFBQ0FBQUFBb0FBQUFNQUFBQUVBQUFBQ0FBQUFBQUFFQUFBQUNBQUFBQkFBQUFBZ0FBQUFRQUFBQUlBQUFBRUFBQUFDQUFBQUFBQUVBUVpBU0MrWUVBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQUJBQUFBQkFBQUFBZ0FBQUFBQUFBQUFRQUJBUVlBQUFBQUFBQUVBQUFBQUJBQUFBUUFBQUFBSUFBQUJRRUFBQUFBQUFBRkF3QUFBQUFBQUFVRUFBQUFBQUFBQlFZQUFBQUFBQUFGQndBQUFBQUFBQVVKQUFBQUFBQUFCUW9BQUFBQUFBQUZEQUFBQUFBQUFBWU9BQUFBQUFBQkJSQUFBQUFBQUFFRkZBQUFBQUFBQVFVV0FBQUFBQUFDQlJ3QUFBQUFBQU1GSUFBQUFBQUFCQVV3QUFBQUlBQUdCVUFBQUFBQUFBY0ZnQUFBQUFBQUNBWUFBUUFBQUFBS0JnQUVBQUFBQUF3R0FCQUFBQ0FBQUFRQUFBQUFBQUFBQkFFQUFBQUFBQUFGQWdBQUFDQUFBQVVFQUFBQUFBQUFCUVVBQUFBZ0FBQUZCd0FBQUFBQUFBVUlBQUFBSUFBQUJRb0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFJQUFCQlJBQUFBQUFBQUVGRWdBQUFDQUFBUVVXQUFBQUFBQUNCUmdBQUFBZ0FBTUZJQUFBQUFBQUF3VW9BQUFBQUFBR0JFQUFBQUFRQUFZRVFBQUFBQ0FBQndXQUFBQUFBQUFKQmdBQ0FBQUFBQXNHQUFnQUFEQUFBQVFBQUFBQUVBQUFCQUVBQUFBZ0FBQUZBZ0FBQUNBQUFBVURBQUFBSUFBQUJRVUFBQUFnQUFBRkJnQUFBQ0FBQUFVSUFBQUFJQUFBQlFrQUFBQWdBQUFGQ3dBQUFDQUFBQVVNQUFBQUFBQUFCZzhBQUFBZ0FBRUZFZ0FBQUNBQUFRVVVBQUFBSUFBQ0JSZ0FBQUFnQUFJRkhBQUFBQ0FBQXdVb0FBQUFJQUFFQlRBQUFBQUFBQkFHQUFBQkFBQUFEd1lBZ0FBQUFBQU9CZ0JBQUFBQUFBMEdBQ0FBUVlBWEM0Y0NBUUFCQVFVQUFBQUFBQUFGQUFBQUFBQUFCZ1E5QUFBQUFBQUpCZjBCQUFBQUFBOEYvWDhBQUFBQUZRWDkveDhBQUFBREJRVUFBQUFBQUFjRWZRQUFBQUFBREFYOUR3QUFBQUFTQmYzL0F3QUFBQmNGL2Y5L0FBQUFCUVVkQUFBQUFBQUlCUDBBQUFBQUFBNEYvVDhBQUFBQUZBWDkvdzhBQUFBQ0JRRUFBQUFRQUFjRWZRQUFBQUFBQ3dYOUJ3QUFBQUFSQmYzL0FRQUFBQllGL2Y4L0FBQUFCQVVOQUFBQUVBQUlCUDBBQUFBQUFBMEYvUjhBQUFBQUV3WDkvd2NBQUFBQkJRRUFBQUFRQUFZRVBRQUFBQUFBQ2dYOUF3QUFBQUFRQmYzL0FBQUFBQndGL2YvL0R3QUFHd1g5Ly84SEFBQWFCZjMvL3dNQUFCa0YvZi8vQVFBQUdBWDkvLzhBUVpBWkM0WUVBUUFCQVFZQUFBQUFBQUFHQXdBQUFBQUFBQVFFQUFBQUlBQUFCUVVBQUFBQUFBQUZCZ0FBQUFBQUFBVUlBQUFBQUFBQUJRa0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFBQUFBQmhBQUFBQUFBQUFHRXdBQUFBQUFBQVlXQUFBQUFBQUFCaGtBQUFBQUFBQUdIQUFBQUFBQUFBWWZBQUFBQUFBQUJpSUFBQUFBQUFFR0pRQUFBQUFBQVFZcEFBQUFBQUFDQmk4QUFBQUFBQU1HT3dBQUFBQUFCQVpUQUFBQUFBQUhCb01BQUFBQUFBa0dBd0lBQUJBQUFBUUVBQUFBQUFBQUJBVUFBQUFnQUFBRkJnQUFBQUFBQUFVSEFBQUFJQUFBQlFrQUFBQUFBQUFGQ2dBQUFBQUFBQVlNQUFBQUFBQUFCZzhBQUFBQUFBQUdFZ0FBQUFBQUFBWVZBQUFBQUFBQUJoZ0FBQUFBQUFBR0d3QUFBQUFBQUFZZUFBQUFBQUFBQmlFQUFBQUFBQUVHSXdBQUFBQUFBUVluQUFBQUFBQUNCaXNBQUFBQUFBTUdNd0FBQUFBQUJBWkRBQUFBQUFBRkJtTUFBQUFBQUFnR0F3RUFBQ0FBQUFRRUFBQUFNQUFBQkFRQUFBQVFBQUFFQlFBQUFDQUFBQVVIQUFBQUlBQUFCUWdBQUFBZ0FBQUZDZ0FBQUNBQUFBVUxBQUFBQUFBQUJnNEFBQUFBQUFBR0VRQUFBQUFBQUFZVUFBQUFBQUFBQmhjQUFBQUFBQUFHR2dBQUFBQUFBQVlkQUFBQUFBQUFCaUFBQUFBQUFCQUdBd0FCQUFBQUR3WURnQUFBQUFBT0JnTkFBQUFBQUEwR0F5QUFBQUFBREFZREVBQUFBQUFMQmdNSUFBQUFBQW9HQXdRQVFhUWRDOWtCQVFBQUFBTUFBQUFIQUFBQUR3QUFBQjhBQUFBL0FBQUFmd0FBQVA4QUFBRC9BUUFBL3dNQUFQOEhBQUQvRHdBQS94OEFBUDgvQUFEL2Z3QUEvLzhBQVAvL0FRRC8vd01BLy84SEFQLy9Ed0QvL3g4QS8vOC9BUC8vZndELy8vOEEvLy8vQWYvLy93UC8vLzhILy8vL0QvLy8veC8vLy84Ly8vLy9md0FBQUFBQkFBQUFBZ0FBQUFRQUFBQUFBQUFBQWdBQUFBUUFBQUFJQUFBQUFBQUFBQUVBQUFBQ0FBQUFBUUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQWdBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dCQmdCOExBNEFSQVE9PSI7dmFyIFp0PW5ldyBvZSxWdD0hMTthc3luYyBmdW5jdGlvbiBuaShBLGUsdCl7bGV0IHI9InVua25vd24iO3R5cGVvZiBBIT0ic3RyaW5nIj9yPUEuaHJlZjpBLnN0YXJ0c1dpdGgoImh0dHAiKT9yPUE6cj10eXBlb2YgZTwidSI/YCR7ZX0vJHtBfWA6QSxyLmVuZHNXaXRoKCIuanMiKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0zKSksci5lbmRzV2l0aCgiLndhc20iKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC01KSksci5lbmRzV2l0aCgiLndhc20uenN0IikmJihyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtOSkpO2xldCBJPWAke3J9Lndhc21gLGk9YXdhaXQgZkEuZ2V0KGAke0l9LnpzdGAse3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLHBhcmFtczp0fSk7VnR8fChhd2FpdCBadC5pbml0KCksVnQ9ITApO2xldCBnPVp0LmRlY29kZShuZXcgVWludDhBcnJheShpLmRhdGEpKS5idWZmZXI7cmV0dXJuKGF3YWl0IGltcG9ydChgJHtyfS5qc2ApKS5kZWZhdWx0KHt3YXNtQmluYXJ5Omd9KX12YXIgenQ9bmk7dmFyIFh0PWFzeW5jKCk9PldlYkFzc2VtYmx5LnZhbGlkYXRlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDUsMSw5NiwwLDEsMTIzLDMsMiwxLDAsMTAsMTAsMSw4LDAsNjUsMCwyNTMsMTUsMjUzLDk4LDExXSkpO3ZhciBlcj10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcj09ImZ1bmN0aW9uIiwkdD1uZXcgVGV4dEVuY29kZXIsQXI9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpO2Z1bmN0aW9uIGFpKEEsZSl7bGV0IHQ9e2ZsYWdzOiJyIixlbmNvZGluZzoiYmluYXJ5In0scj1BLmZzX29wZW4oZSx0LmZsYWdzKSxpPUEuZnNfc3RhdChlKS5zaXplLG89bnVsbDtlcj9vPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihpKTpvPW5ldyBBcnJheUJ1ZmZlcihpKTtsZXQgZz1uZXcgVWludDhBcnJheShvKTtyZXR1cm4gQS5mc19yZWFkKHIsZywwLGksMCksQS5mc19jbG9zZShyKSxnfWZ1bmN0aW9uIHRyKEEsZSx0KXtsZXQgcj1udWxsO2VyP3I9bmV3IFNoYXJlZEFycmF5QnVmZmVyKHQpOnI9bmV3IEFycmF5QnVmZmVyKHQpO2xldCBJPW5ldyBVaW50OEFycmF5KHIpLGk9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLGUsdCk7cmV0dXJuIEkuc2V0KGkpLEl9ZnVuY3Rpb24gRihBLGUsdCxyKXtsZXQgST0wO3JldHVybiBlIT09bnVsbCYmKEk9QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfYXJyYXlfYWxsb2MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxyLGUuYnVmZmVyLmJ5dGVMZW5ndGhdKT4+PjAsQS5IRUFQVTguc2V0KG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSxJKSksSX1mdW5jdGlvbiAkKEEsZSx0KXtsZXQgcj1KU09OLnN0cmluZ2lmeShlKSxJPUEubGVuZ3RoQnl0ZXNVVEY4KHIpKzEsaT1BLmNjYWxsKCJpdGtfd2FzbV9pbnB1dF9qc29uX2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHQsSV0pPj4+MDtBLnN0cmluZ1RvVVRGOChyLGksSSl9ZnVuY3Rpb24gayhBLGUsdCxyKXtsZXQgST1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKT4+PjAsaT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLHRdKSxvPXRyKEEsSSxpKTtyZXR1cm4gVyhyLG8uYnVmZmVyKX1mdW5jdGlvbiBPQShBLGUpe2xldCB0PUEuY2NhbGwoIml0a193YXNtX291dHB1dF9qc29uX2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIl0sWzAsZV0pPj4+MCxyPUEuVVRGOFRvU3RyaW5nKHQpO3JldHVybiBKU09OLnBhcnNlKHIpfWZ1bmN0aW9uIHNpKEEsZSx0LHIpe3IhPW51bGwmJnIubGVuZ3RoPjAmJnIuZm9yRWFjaChmdW5jdGlvbihzLGEpe3N3aXRjaChzLnR5cGUpe2Nhc2UgcC5UZXh0U3RyZWFtOntsZXQgQz0kdC5lbmNvZGUocy5kYXRhLmRhdGEpLGw9RihBLEMsYSwwKSxCPXtzaXplOkMuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YH07JChBLEIsYSk7YnJlYWt9Y2FzZSBwLkpzb25Db21wYXRpYmxlOntsZXQgQz0kdC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocy5kYXRhKSksbD1GKEEsQyxhLDApLEI9e3NpemU6Qy5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gfTskKEEsQixhKTticmVha31jYXNlIHAuQmluYXJ5U3RyZWFtOntsZXQgQz1zLmRhdGEuZGF0YSxsPUYoQSxDLGEsMCksQj17c2l6ZTpDLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWB9OyQoQSxCLGEpO2JyZWFrfWNhc2UgcC5UZXh0RmlsZTp7QS5mc193cml0ZUZpbGUocy5kYXRhLnBhdGgscy5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgcC5CaW5hcnlGaWxlOntBLmZzX3dyaXRlRmlsZShzLmRhdGEucGF0aCxzLmRhdGEuZGF0YSk7YnJlYWt9Y2FzZSBwLkltYWdlOntsZXQgQz1zLmRhdGEsbD1GKEEsQy5kYXRhLGEsMCksQj1GKEEsQy5kaXJlY3Rpb24sYSwxKSxmPXR5cGVvZiBDLm1ldGFkYXRhPy5lbnRyaWVzPCJ1Ij9BcnJheS5mcm9tKEMubWV0YWRhdGEuZW50cmllcygpKTpbXSxjPXtpbWFnZVR5cGU6Qy5pbWFnZVR5cGUsbmFtZTpDLm5hbWUsb3JpZ2luOkMub3JpZ2luLHNwYWNpbmc6Qy5zcGFjaW5nLGRpcmVjdGlvbjpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YCxzaXplOkMuc2l6ZSxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7bH1gLG1ldGFkYXRhOmZ9OyQoQSxjLGEpO2JyZWFrfWNhc2UgcC5NZXNoOntsZXQgQz1zLmRhdGEsbD1GKEEsQy5wb2ludHMsYSwwKSxCPUYoQSxDLmNlbGxzLGEsMSksZj1GKEEsQy5wb2ludERhdGEsYSwyKSxjPUYoQSxDLmNlbGxEYXRhLGEsMyksRT17bWVzaFR5cGU6Qy5tZXNoVHlwZSxuYW1lOkMubmFtZSxudW1iZXJPZlBvaW50czpDLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCxudW1iZXJPZkNlbGxzOkMubnVtYmVyT2ZDZWxscyxjZWxsczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0J9YCxjZWxsQnVmZmVyU2l6ZTpDLmNlbGxCdWZmZXJTaXplLG51bWJlck9mUG9pbnRQaXhlbHM6Qy5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxudW1iZXJPZkNlbGxQaXhlbHM6Qy5udW1iZXJPZkNlbGxQaXhlbHMsY2VsbERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWB9OyQoQSxFLGEpO2JyZWFrfWNhc2UgcC5Qb2ludFNldDp7bGV0IEM9cy5kYXRhLGw9RihBLEMucG9pbnRzLGEsMCksQj1GKEEsQy5wb2ludERhdGEsYSwxKSxmPXtwb2ludFNldFR5cGU6Qy5wb2ludFNldFR5cGUsbmFtZTpDLm5hbWUsbnVtYmVyT2ZQb2ludHM6Qy5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAsbnVtYmVyT2ZQb2ludFBpeGVsczpDLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Qn1gfTskKEEsZixhKTticmVha31jYXNlIHAuVHJhbnNmb3JtTGlzdDp7bGV0IEM9cy5kYXRhLGw9W10sQj0wO0MuZm9yRWFjaChmPT57bGV0IGM9IiIsRT0iIjtmLnRyYW5zZm9ybVR5cGUudHJhbnNmb3JtUGFyYW1ldGVyaXphdGlvbiE9PSJDb21wb3NpdGUiJiYoYz1gZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0YoQSxmLmZpeGVkUGFyYW1ldGVycyxhLEIpfWAsQis9MSxFPWBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RihBLGYucGFyYW1ldGVycyxhLEIpfWAsQis9MSk7bGV0IHU9e3RyYW5zZm9ybVR5cGU6Zi50cmFuc2Zvcm1UeXBlLG51bWJlck9mRml4ZWRQYXJhbWV0ZXJzOmYubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnMsbnVtYmVyT2ZQYXJhbWV0ZXJzOmYubnVtYmVyT2ZQYXJhbWV0ZXJzLG5hbWU6Zi5uYW1lLGlucHV0U3BhY2VOYW1lOmYuaW5wdXRTcGFjZU5hbWUsb3V0cHV0U3BhY2VOYW1lOmYub3V0cHV0U3BhY2VOYW1lLHBhcmFtZXRlcnM6RSxmaXhlZFBhcmFtZXRlcnM6Y307bC5wdXNoKHUpfSksJChBLGwsYSk7YnJlYWt9Y2FzZSBwLlBvbHlEYXRhOntsZXQgQz1zLmRhdGEsbD1GKEEsQy5wb2ludHMsYSwwKSxCPUYoQSxDLnZlcnRpY2VzLGEsMSksZj1GKEEsQy5saW5lcyxhLDIpLGM9RihBLEMucG9seWdvbnMsYSwzKSxFPUYoQSxDLnRyaWFuZ2xlU3RyaXBzLGEsNCksdT1GKEEsQy5wb2ludERhdGEsYSw1KSxEPUYoQSxDLnBvaW50RGF0YSxhLDYpLGg9e3BvbHlEYXRhVHlwZTpDLnBvbHlEYXRhVHlwZSxuYW1lOkMubmFtZSxudW1iZXJPZlBvaW50czpDLm51bWJlck9mUG9pbnRzLHBvaW50czpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCx2ZXJ0aWNlc0J1ZmZlclNpemU6Qy52ZXJ0aWNlc0J1ZmZlclNpemUsdmVydGljZXM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtCfWAsbGluZXNCdWZmZXJTaXplOkMubGluZXNCdWZmZXJTaXplLGxpbmVzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLHBvbHlnb25zQnVmZmVyU2l6ZTpDLnBvbHlnb25zQnVmZmVyU2l6ZSxwb2x5Z29uczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2N9YCx0cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU6Qy50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemUsdHJpYW5nbGVTdHJpcHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtFfWAsbnVtYmVyT2ZQb2ludFBpeGVsczpDLm51bWJlck9mUG9pbnRQaXhlbHMscG9pbnREYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7dX1gLG51bWJlck9mQ2VsbFBpeGVsczpDLm51bWJlck9mQ2VsbFBpeGVscyxjZWxsRGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0R9YH07JChBLGgsYSk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgaW5wdXQgSW50ZXJmYWNlVHlwZSIpfX0pLEEucmVzZXRNb2R1bGVTdGRvdXQoKSxBLnJlc2V0TW9kdWxlU3RkZXJyKCk7bGV0IEk9QS5zdGFja1NhdmUoKSxpPTA7dHJ5e2k9QS5jYWxsTWFpbihlLnNsaWNlKCkpfWNhdGNoKHMpe3Rocm93IHR5cGVvZiBzPT0ibnVtYmVyIiYmKGNvbnNvbGUubG9nKCJFeGNlcHRpb24gd2hpbGUgcnVubmluZyBwaXBlbGluZToiKSxjb25zb2xlLmxvZygic3Rkb3V0OiIsQS5nZXRNb2R1bGVTdGRvdXQoKSksY29uc29sZS5lcnJvcigic3RkZXJyOiIsQS5nZXRNb2R1bGVTdGRlcnIoKSksdHlwZW9mIEEuZ2V0RXhjZXB0aW9uTWVzc2FnZTwidSI/Y29uc29sZS5lcnJvcigiZXhjZXB0aW9uOiIsQS5nZXRFeGNlcHRpb25NZXNzYWdlKHMpKTpjb25zb2xlLmVycm9yKCJCdWlsZCBtb2R1bGUgaW4gRGVidWcgbW9kZSBmb3IgZXhjZXB0aW9uIG1lc3NhZ2UgaW5mb3JtYXRpb24uIikpLHN9ZmluYWxseXtBLnN0YWNrUmVzdG9yZShJKX1sZXQgbz1BLmdldE1vZHVsZVN0ZG91dCgpLGc9QS5nZXRNb2R1bGVTdGRlcnIoKSxRPVtdO3JldHVybiB0IT1udWxsJiZ0Lmxlbmd0aD4wJiZpPT09MCYmdC5mb3JFYWNoKGZ1bmN0aW9uKHMsYSl7bGV0IEM9bnVsbDtzd2l0Y2gocy50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IEI9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsYSwwXSk+Pj4wLGY9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsYSwwXSksYz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsQixmKTtDPXtkYXRhOkFyLmRlY29kZShjKX07YnJlYWt9Y2FzZSBwLkpzb25Db21wYXRpYmxlOntsZXQgQj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxhLDBdKT4+PjAsZj1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxhLDBdKSxjPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcixCLGYpO0M9SlNPTi5wYXJzZShBci5kZWNvZGUoYykpO2JyZWFrfWNhc2UgcC5CaW5hcnlTdHJlYW06e2xldCBCPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGEsMF0pPj4+MCxmPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGEsMF0pO0M9e2RhdGE6dHIoQSxCLGYpfTticmVha31jYXNlIHAuVGV4dEZpbGU6e0M9e3BhdGg6cy5kYXRhLnBhdGgsZGF0YTpBLmZzX3JlYWRGaWxlKHMuZGF0YS5wYXRoLHtlbmNvZGluZzoidXRmOCJ9KX07YnJlYWt9Y2FzZSBwLkJpbmFyeUZpbGU6e0M9e3BhdGg6cy5kYXRhLnBhdGgsZGF0YTphaShBLHMuZGF0YS5wYXRoKX07YnJlYWt9Y2FzZSBwLkltYWdlOntsZXQgQj1PQShBLGEpO0IuZGF0YT1rKEEsYSwwLEIuaW1hZ2VUeXBlLmNvbXBvbmVudFR5cGUpLEIuZGlyZWN0aW9uPWsoQSxhLDEsckEuRmxvYXQ2NCksQi5tZXRhZGF0YT1uZXcgTWFwKEIubWV0YWRhdGEpLEM9QjticmVha31jYXNlIHAuTWVzaDp7bGV0IEI9T0EoQSxhKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9ayhBLGEsMCxCLm1lc2hUeXBlLnBvaW50Q29tcG9uZW50VHlwZSk6Qi5wb2ludHM9VyhCLm1lc2hUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZDZWxscz4wP0IuY2VsbHM9ayhBLGEsMSxCLm1lc2hUeXBlLmNlbGxDb21wb25lbnRUeXBlKTpCLmNlbGxzPVcoQi5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPWsoQSxhLDIsQi5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5wb2ludERhdGE9VyhCLm1lc2hUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZkNlbGxQaXhlbHM+MD9CLmNlbGxEYXRhPWsoQSxhLDMsQi5tZXNoVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpCLmNlbGxEYXRhPVcoQi5tZXNoVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQz1CO2JyZWFrfWNhc2UgcC5Qb2ludFNldDp7bGV0IEI9T0EoQSxhKTtCLm51bWJlck9mUG9pbnRzPjA/Qi5wb2ludHM9ayhBLGEsMCxCLnBvaW50U2V0VHlwZS5wb2ludENvbXBvbmVudFR5cGUpOkIucG9pbnRzPVcoQi5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksQi5udW1iZXJPZlBvaW50UGl4ZWxzPjA/Qi5wb2ludERhdGE9ayhBLGEsMSxCLnBvaW50U2V0VHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSk6Qi5wb2ludERhdGE9VyhCLnBvaW50U2V0VHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEM9QjticmVha31jYXNlIHAuVHJhbnNmb3JtTGlzdDp7bGV0IEI9T0EoQSxhKSxmPTA7Qi5mb3JFYWNoKChjLEUpPT57Yy50cmFuc2Zvcm1UeXBlLnRyYW5zZm9ybVBhcmFtZXRlcml6YXRpb24hPT0iQ29tcG9zaXRlIiYmKGMubnVtYmVyT2ZGaXhlZFBhcmFtZXRlcnM+MCYmKEJbRV0uZml4ZWRQYXJhbWV0ZXJzPWsoQSxhLGYsckEuRmxvYXQ2NCkpLGYrPTEsYy5udW1iZXJPZlBhcmFtZXRlcnM+MCYmKEJbRV0ucGFyYW1ldGVycz1rKEEsYSxmLGMudHJhbnNmb3JtVHlwZS5wYXJhbWV0ZXJzVmFsdWVUeXBlKSksZis9MSl9KSxDPUI7YnJlYWt9Y2FzZSBwLlBvbHlEYXRhOntsZXQgQj1PQShBLGEpO0IubnVtYmVyT2ZQb2ludHM+MD9CLnBvaW50cz1rKEEsYSwwLHJBLkZsb2F0MzIpOkIucG9pbnRzPW5ldyBGbG9hdDMyQXJyYXksQi52ZXJ0aWNlc0J1ZmZlclNpemU+MD9CLnZlcnRpY2VzPWsoQSxhLDEsTC5VSW50MzIpOkIudmVydGljZXM9bmV3IFVpbnQzMkFycmF5LEIubGluZXNCdWZmZXJTaXplPjA/Qi5saW5lcz1rKEEsYSwyLEwuVUludDMyKTpCLmxpbmVzPW5ldyBVaW50MzJBcnJheSxCLnBvbHlnb25zQnVmZmVyU2l6ZT4wP0IucG9seWdvbnM9ayhBLGEsMyxMLlVJbnQzMik6Qi5wb2x5Z29ucz1uZXcgVWludDMyQXJyYXksQi50cmlhbmdsZVN0cmlwc0J1ZmZlclNpemU+MD9CLnRyaWFuZ2xlU3RyaXBzPWsoQSxhLDQsTC5VSW50MzIpOkIudHJpYW5nbGVTdHJpcHM9bmV3IFVpbnQzMkFycmF5LEIubnVtYmVyT2ZQb2ludFBpeGVscz4wP0IucG9pbnREYXRhPWsoQSxhLDUsQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOkIucG9pbnREYXRhPVcoQi5wb2x5RGF0YVR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCLm51bWJlck9mQ2VsbFBpeGVscz4wP0IuY2VsbERhdGE9ayhBLGEsNixCLnBvbHlEYXRhVHlwZS5jZWxsUGl4ZWxDb21wb25lbnRUeXBlKTpCLmNlbGxEYXRhPVcoQi5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEM9QjticmVha31kZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBvdXRwdXQgSW50ZXJmYWNlVHlwZSIpfWxldCBsPXt0eXBlOnMudHlwZSxkYXRhOkN9O1EucHVzaChsKX0pLHtyZXR1cm5WYWx1ZTppLHN0ZG91dDpvLHN0ZGVycjpnLG91dHB1dHM6UX19dmFyIHJyPXNpO3ZhciBDaT10eXBlb2YgZ2xvYmFsVGhpcy5TaGFyZWRBcnJheUJ1ZmZlcjwidSI7ZnVuY3Rpb24gQmkoQSxlKXtpZihBPT1udWxsKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgcj0wO3I8QS5sZW5ndGg7cisrKXtsZXQgST1RaShBW3JdLGUpO0khPT1udWxsJiZ0LnB1c2goSSl9cmV0dXJuIHR9ZnVuY3Rpb24gUWkoQSxlKXtpZihBPT1udWxsKXJldHVybiBudWxsO2xldCB0PW51bGw7cmV0dXJuIEEuYnVmZmVyIT09dm9pZCAwP3Q9QS5idWZmZXI6QS5ieXRlTGVuZ3RoIT09dm9pZCAwJiYodD1BKSxDaSYmdCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyP251bGw6ZT90OnQuc2xpY2UoMCl9dmFyIElyPUJpO2Z1bmN0aW9uIEVpKEEpe3JldHVybltBLmRhdGEsQS5kaXJlY3Rpb25dfXZhciBpcj1FaTtmdW5jdGlvbiBsaShBKXtyZXR1cm5bQS5wb2ludHMsQS5wb2ludERhdGEsQS5jZWxscyxBLmNlbGxEYXRhXX12YXIgb3I9bGk7ZnVuY3Rpb24gY2koQSl7cmV0dXJuW0EucG9pbnRzLEEudmVydGljZXMsQS5saW5lcyxBLnBvbHlnb25zLEEudHJpYW5nbGVTdHJpcHMsQS5wb2ludERhdGEsQS5jZWxsRGF0YV19dmFyIGdyPWNpO3ZhciBmaTtmdW5jdGlvbiBnZSgpe3JldHVybiBmaX12YXIgdWk7ZnVuY3Rpb24gbnIoKXtyZXR1cm4gdWl9dmFyIGRpO2Z1bmN0aW9uIG5lKCl7cmV0dXJuIGRpfXZhciBaZT1uZXcgTWFwO2Z1bmN0aW9uIHBpKCl7bGV0IEE9bmUoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1udWxsKSxBfWZ1bmN0aW9uIGFyKCl7bGV0IEE9Z2UoKTtyZXR1cm4gdHlwZW9mIEE+InUiJiYoQT1uZXcgVVJMKCIvcGlwZWxpbmVzIixkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pLmhyZWYpLEF9ZnVuY3Rpb24gYWUoKXtsZXQgQT1ucigpO3JldHVybiB0eXBlb2YgQT4idSImJihBPXt9KSxBfWFzeW5jIGZ1bmN0aW9uIGhpKEEsZSx0KXtsZXQgcj1BLEk9QTtpZih0eXBlb2YgQSE9InN0cmluZyImJihyPW5ldyBVUkwoQS5ocmVmKSxJPXIuaHJlZiksWmUuaGFzKEkpKXJldHVybiBaZS5nZXQoSSk7e2xldCBpPWF3YWl0IHp0KEEsZT8udG9TdHJpbmcoKT8/YXIoKSx0Pz9hZSgpKTtyZXR1cm4gWmUuc2V0KEksaSksaX19YXN5bmMgZnVuY3Rpb24geWkoQSxlLHQscixJKXtpZighYXdhaXQgWHQoKSl7bGV0IEU9IldlYkFzc2VtYmx5IFNJTUQgc3VwcG9ydCBpcyByZXF1aXJlZCAtLSBwbGVhc2UgdXBkYXRlIHlvdXIgYnJvd3Nlci4iO3Rocm93IGFsZXJ0KEUpLG5ldyBFcnJvcihFKX1sZXQgaT1JPy53ZWJXb3JrZXI/P251bGw7aWYoaT09PSExKXtsZXQgRT1hd2FpdCBoaShBLnRvU3RyaW5nKCksST8ucGlwZWxpbmVCYXNlVXJsLEk/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P2FlKCkpO3JldHVybiBycihFLGUsdCxyKX1sZXQgbz1pLGc9ST8ucGlwZWxpbmVXb3JrZXJVcmw/P3BpKCksUT10eXBlb2YgZyE9InN0cmluZyImJnR5cGVvZiBnPy5ocmVmPCJ1Ij9nLmhyZWY6Zyx7d29ya2VyUHJveHk6cyx3b3JrZXI6YX09YXdhaXQgX3QobyxRLEk/LnBpcGVsaW5lUXVlcnlQYXJhbXM/P2FlKCkpO289YTtsZXQgQz1bXTtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oRSl7aWYoRS50eXBlPT09cC5CaW5hcnlTdHJlYW0pe2xldCB1PUUuZGF0YS5kYXRhO0MucHVzaCh1KX1lbHNlIGlmKEUudHlwZT09PXAuQmluYXJ5RmlsZSl7bGV0IHU9RS5kYXRhLmRhdGE7Qy5wdXNoKHUpfWVsc2UgaWYoRS50eXBlPT09cC5JbWFnZSl7bGV0IHU9RS5kYXRhO3UuZGF0YSE9PW51bGwmJkMucHVzaCguLi5pcih1KSl9ZWxzZSBpZihFLnR5cGU9PT1wLk1lc2gpe2xldCB1PUUuZGF0YTtDLnB1c2goLi4ub3IodSkpfWVsc2UgaWYoRS50eXBlPT09cC5Qb2x5RGF0YSl7bGV0IHU9RS5kYXRhO0MucHVzaCguLi5ncih1KSl9fSk7bGV0IGw9ST8ucGlwZWxpbmVCYXNlVXJsPz9hcigpLEI9dHlwZW9mIGwhPSJzdHJpbmciJiZ0eXBlb2YgbD8uaHJlZjwidSI/bC5ocmVmOmwsZj1yIT1udWxsP3VlKHIsSXIoQyxJPy5ub0NvcHkpKTpudWxsLGM9YXdhaXQgcy5ydW5QaXBlbGluZShBLnRvU3RyaW5nKCksQixlLHQsZixJPy5waXBlbGluZVF1ZXJ5UGFyYW1zPz9hZSgpKTtyZXR1cm57cmV0dXJuVmFsdWU6Yy5yZXR1cm5WYWx1ZSxzdGRvdXQ6Yy5zdGRvdXQsc3RkZXJyOmMuc3RkZXJyLG91dHB1dHM6Yy5vdXRwdXRzLHdlYldvcmtlcjpvfX12YXIgYj15aTt2YXIgRGk9bnVsbDtmdW5jdGlvbiBzcigpe3JldHVybiBEaX12YXIgVmUsd2k9YGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQGl0ay13YXNtL2Rvd25zYW1wbGVAJHtRZX0vZGlzdC9waXBlbGluZXNgO2Z1bmN0aW9uIHVzKEEpe1ZlPUF9ZnVuY3Rpb24gTygpe2lmKHR5cGVvZiBWZTwidSIpcmV0dXJuIFZlO2xldCBBPWdlKCk7cmV0dXJuIHR5cGVvZiBBPCJ1Ij9BOndpfXZhciB6ZSxtaT1udWxsO2Z1bmN0aW9uIENyKEEpe3plPUF9ZnVuY3Rpb24gRygpe2lmKHR5cGVvZiB6ZTwidSIpcmV0dXJuIHplO2xldCBBPW5lKCk7cmV0dXJuIHR5cGVvZiBBPCJ1Ij9BOm1pfXZhciB1QT1udWxsO2FzeW5jIGZ1bmN0aW9uIEJyKCl7bGV0IEE9RygpLGU9dHlwZW9mIEEhPSJzdHJpbmciJiZ0eXBlb2YgQT8uaHJlZjwidSI/QS5ocmVmOkE7dUE9YXdhaXQgTEEoZSl9ZnVuY3Rpb24gbXMoQSl7dUE9QX1hc3luYyBmdW5jdGlvbiBIKCl7aWYodUEhPT1udWxsKXJldHVybiB1QS50ZXJtaW5hdGVkJiZhd2FpdCBCcigpLHVBO2xldCBBPXNyKCk7cmV0dXJuIEEhPT1udWxsP0E6KGF3YWl0IEJyKCksdUEpfWFzeW5jIGZ1bmN0aW9uIFJpKEEsZT17c2hyaW5rRmFjdG9yczpbMiwyXX0pe2xldCB0PVt7dHlwZTpwLkltYWdlfV0scj1be3R5cGU6cC5JbWFnZSxkYXRhOkF9XSxJPVtdO2lmKEkucHVzaCgiMCIpLEkucHVzaCgiMCIpLEkucHVzaCgiLS1tZW1vcnktaW8iKSx0eXBlb2YgZS5zaHJpbmtGYWN0b3JzPCJ1Iil7aWYoZS5zaHJpbmtGYWN0b3JzLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcignInNocmluay1mYWN0b3JzIiBvcHRpb24gbXVzdCBoYXZlIGEgbGVuZ3RoID4gMicpO0kucHVzaCgiLS1zaHJpbmstZmFjdG9ycyIpLGF3YWl0IFByb21pc2UuYWxsKGUuc2hyaW5rRmFjdG9ycy5tYXAoYXN5bmMgZj0+e0kucHVzaChmLnRvU3RyaW5nKCkpfSkpfXR5cGVvZiBlLmluZm9ybWF0aW9uT25seTwidSImJmUuaW5mb3JtYXRpb25Pbmx5JiZJLnB1c2goIi0taW5mb3JtYXRpb24tb25seSIpO2xldCBnPSJkb3duc2FtcGxlLWJpbi1zaHJpbmsiLFE9ZT8ud2ViV29ya2VyO1E9PT12b2lkIDAmJihRPWF3YWl0IEgoKSk7bGV0e3dlYldvcmtlcjpzLHJldHVyblZhbHVlOmEsc3RkZXJyOkMsb3V0cHV0czpsfT1hd2FpdCBiKGcsSSx0LHIse3BpcGVsaW5lQmFzZVVybDpPKCkscGlwZWxpbmVXb3JrZXJVcmw6RygpLHdlYldvcmtlcjpRLG5vQ29weTplPy5ub0NvcHl9KTtpZihhIT09MCYmQyE9PSIiKXRocm93IG5ldyBFcnJvcihDKTtyZXR1cm57d2ViV29ya2VyOnMsZG93bnNhbXBsZWQ6bFswXT8uZGF0YX19dmFyIFNpPVJpO2FzeW5jIGZ1bmN0aW9uIEZpKEEsZT17c2hyaW5rRmFjdG9yczpbMiwyXX0pe2xldCB0PVt7dHlwZTpwLkltYWdlfV0scj1be3R5cGU6cC5JbWFnZSxkYXRhOkF9XSxJPVtdO2lmKEkucHVzaCgiMCIpLEkucHVzaCgiMCIpLEkucHVzaCgiLS1tZW1vcnktaW8iKSx0eXBlb2YgZS5zaHJpbmtGYWN0b3JzPCJ1Iil7aWYoZS5zaHJpbmtGYWN0b3JzLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcignInNocmluay1mYWN0b3JzIiBvcHRpb24gbXVzdCBoYXZlIGEgbGVuZ3RoID4gMicpO0kucHVzaCgiLS1zaHJpbmstZmFjdG9ycyIpLGF3YWl0IFByb21pc2UuYWxsKGUuc2hyaW5rRmFjdG9ycy5tYXAoYXN5bmMgZj0+e0kucHVzaChmLnRvU3RyaW5nKCkpfSkpfWlmKHR5cGVvZiBlLmNyb3BSYWRpdXM8InUiKXtpZihlLmNyb3BSYWRpdXMubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCciY3JvcC1yYWRpdXMiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAyJyk7SS5wdXNoKCItLWNyb3AtcmFkaXVzIiksYXdhaXQgUHJvbWlzZS5hbGwoZS5jcm9wUmFkaXVzLm1hcChhc3luYyBmPT57SS5wdXNoKGYudG9TdHJpbmcoKSl9KSl9bGV0IGc9ImRvd25zYW1wbGUtbGFiZWwtaW1hZ2UiLFE9ZT8ud2ViV29ya2VyO1E9PT12b2lkIDAmJihRPWF3YWl0IEgoKSk7bGV0e3dlYldvcmtlcjpzLHJldHVyblZhbHVlOmEsc3RkZXJyOkMsb3V0cHV0czpsfT1hd2FpdCBiKGcsSSx0LHIse3BpcGVsaW5lQmFzZVVybDpPKCkscGlwZWxpbmVXb3JrZXJVcmw6RygpLHdlYldvcmtlcjpRLG5vQ29weTplPy5ub0NvcHl9KTtpZihhIT09MCYmQyE9PSIiKXRocm93IG5ldyBFcnJvcihDKTtyZXR1cm57d2ViV29ya2VyOnMsZG93bnNhbXBsZWQ6bFswXT8uZGF0YX19dmFyIE5pPUZpO2FzeW5jIGZ1bmN0aW9uIGtpKEE9e3Nocmlua0ZhY3RvcnM6WzIsMl19KXtsZXQgZT1be3R5cGU6cC5Kc29uQ29tcGF0aWJsZX1dLHQ9W10scj1bXTtpZihyLnB1c2goIjAiKSxyLnB1c2goIi0tbWVtb3J5LWlvIiksdHlwZW9mIEEuc2hyaW5rRmFjdG9yczwidSIpe2lmKEEuc2hyaW5rRmFjdG9ycy5sZW5ndGg8MSl0aHJvdyBuZXcgRXJyb3IoJyJzaHJpbmstZmFjdG9ycyIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDEnKTtyLnB1c2goIi0tc2hyaW5rLWZhY3RvcnMiKSxhd2FpdCBQcm9taXNlLmFsbChBLnNocmlua0ZhY3RvcnMubWFwKGFzeW5jIGw9PntyLnB1c2gobC50b1N0cmluZygpKX0pKX1sZXQgaT0iZG93bnNhbXBsZS1zaWdtYSIsbz1BPy53ZWJXb3JrZXI7bz09PXZvaWQgMCYmKG89YXdhaXQgSCgpKTtsZXR7d2ViV29ya2VyOmcscmV0dXJuVmFsdWU6USxzdGRlcnI6cyxvdXRwdXRzOmF9PWF3YWl0IGIoaSxyLGUsdCx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpHKCksd2ViV29ya2VyOm8sbm9Db3B5OkE/Lm5vQ29weX0pO2lmKFEhPT0wJiZzIT09IiIpdGhyb3cgbmV3IEVycm9yKHMpO3JldHVybnt3ZWJXb3JrZXI6ZyxzaWdtYTphWzBdPy5kYXRhfX12YXIgVWk9a2k7YXN5bmMgZnVuY3Rpb24gR2koQSxlPXtzaHJpbmtGYWN0b3JzOlsyLDJdfSl7bGV0IHQ9W3t0eXBlOnAuSW1hZ2V9XSxyPVt7dHlwZTpwLkltYWdlLGRhdGE6QX1dLEk9W107aWYoSS5wdXNoKCIwIiksSS5wdXNoKCIwIiksSS5wdXNoKCItLW1lbW9yeS1pbyIpLHR5cGVvZiBlLnNocmlua0ZhY3RvcnM8InUiKXtpZihlLnNocmlua0ZhY3RvcnMubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCcic2hyaW5rLWZhY3RvcnMiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAyJyk7SS5wdXNoKCItLXNocmluay1mYWN0b3JzIiksYXdhaXQgUHJvbWlzZS5hbGwoZS5zaHJpbmtGYWN0b3JzLm1hcChhc3luYyBmPT57SS5wdXNoKGYudG9TdHJpbmcoKSl9KSl9aWYodHlwZW9mIGUuY3JvcFJhZGl1czwidSIpe2lmKGUuY3JvcFJhZGl1cy5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoJyJjcm9wLXJhZGl1cyIgb3B0aW9uIG11c3QgaGF2ZSBhIGxlbmd0aCA+IDInKTtJLnB1c2goIi0tY3JvcC1yYWRpdXMiKSxhd2FpdCBQcm9taXNlLmFsbChlLmNyb3BSYWRpdXMubWFwKGFzeW5jIGY9PntJLnB1c2goZi50b1N0cmluZygpKX0pKX1sZXQgZz0iZG93bnNhbXBsZSIsUT1lPy53ZWJXb3JrZXI7UT09PXZvaWQgMCYmKFE9YXdhaXQgSCgpKTtsZXR7d2ViV29ya2VyOnMscmV0dXJuVmFsdWU6YSxzdGRlcnI6QyxvdXRwdXRzOmx9PWF3YWl0IGIoZyxJLHQscix7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpHKCksd2ViV29ya2VyOlEsbm9Db3B5OmU/Lm5vQ29weX0pO2lmKGEhPT0wJiZDIT09IiIpdGhyb3cgbmV3IEVycm9yKEMpO3JldHVybnt3ZWJXb3JrZXI6cyxkb3duc2FtcGxlZDpsWzBdPy5kYXRhfX12YXIgYmk9R2k7YXN5bmMgZnVuY3Rpb24gTGkoQT17c2l6ZTpbMSwxXSxzaWdtYTpbMSwxXX0pe2xldCBlPVt7dHlwZTpwLkpzb25Db21wYXRpYmxlfV0sdD1bXSxyPVtdO2lmKHIucHVzaCgiMCIpLHIucHVzaCgiLS1tZW1vcnktaW8iKSx0eXBlb2YgQS5zaXplPCJ1Iil7aWYoQS5zaXplLmxlbmd0aDwxKXRocm93IG5ldyBFcnJvcignInNpemUiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7ci5wdXNoKCItLXNpemUiKSxhd2FpdCBQcm9taXNlLmFsbChBLnNpemUubWFwKGFzeW5jIGw9PntyLnB1c2gobC50b1N0cmluZygpKX0pKX1pZih0eXBlb2YgQS5zaWdtYTwidSIpe2lmKEEuc2lnbWEubGVuZ3RoPDEpdGhyb3cgbmV3IEVycm9yKCcic2lnbWEiIG9wdGlvbiBtdXN0IGhhdmUgYSBsZW5ndGggPiAxJyk7ci5wdXNoKCItLXNpZ21hIiksYXdhaXQgUHJvbWlzZS5hbGwoQS5zaWdtYS5tYXAoYXN5bmMgbD0+e3IucHVzaChsLnRvU3RyaW5nKCkpfSkpfXR5cGVvZiBBLm1heEtlcm5lbFdpZHRoPCJ1IiYmci5wdXNoKCItLW1heC1rZXJuZWwtd2lkdGgiLEEubWF4S2VybmVsV2lkdGgudG9TdHJpbmcoKSksdHlwZW9mIEEubWF4S2VybmVsRXJyb3I8InUiJiZyLnB1c2goIi0tbWF4LWtlcm5lbC1lcnJvciIsQS5tYXhLZXJuZWxFcnJvci50b1N0cmluZygpKTtsZXQgaT0iZ2F1c3NpYW4ta2VybmVsLXJhZGl1cyIsbz1BPy53ZWJXb3JrZXI7bz09PXZvaWQgMCYmKG89YXdhaXQgSCgpKTtsZXR7d2ViV29ya2VyOmcscmV0dXJuVmFsdWU6USxzdGRlcnI6cyxvdXRwdXRzOmF9PWF3YWl0IGIoaSxyLGUsdCx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpHKCksd2ViV29ya2VyOm8sbm9Db3B5OkE/Lm5vQ29weX0pO2lmKFEhPT0wJiZzIT09IiIpdGhyb3cgbmV3IEVycm9yKHMpO3JldHVybnt3ZWJXb3JrZXI6ZyxyYWRpdXM6YVswXT8uZGF0YX19dmFyIEppPUxpO2FzeW5jIGZ1bmN0aW9uIE9pKEEsZSx0LHI9e30pe2xldCBJPVt7dHlwZTpwLkpzb25Db21wYXRpYmxlfV0saT1be3R5cGU6cC5UcmFuc2Zvcm1MaXN0LGRhdGE6QX0se3R5cGU6cC5JbWFnZSxkYXRhOmV9LHt0eXBlOnAuSW1hZ2UsZGF0YTp0fV0sbz1bXTtvLnB1c2goIjAiKSxvLnB1c2goIjEiKSxvLnB1c2goIjIiKSxvLnB1c2goIjAiKSxvLnB1c2goIi0tbWVtb3J5LWlvIiksdHlwZW9mIHIucGFkZGluZzwidSImJm8ucHVzaCgiLS1wYWRkaW5nIixyLnBhZGRpbmcudG9TdHJpbmcoKSk7bGV0IEM9InJlc2FtcGxlLWJvdW5kaW5nLWJveCIsbD1yPy53ZWJXb3JrZXI7bD09PXZvaWQgMCYmKGw9YXdhaXQgSCgpKTtsZXR7d2ViV29ya2VyOkIscmV0dXJuVmFsdWU6ZixzdGRlcnI6YyxvdXRwdXRzOkV9PWF3YWl0IGIoQyxvLEksaSx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpHKCksd2ViV29ya2VyOmwsbm9Db3B5OnI/Lm5vQ29weX0pO2lmKGYhPT0wJiZjIT09IiIpdGhyb3cgbmV3IEVycm9yKGMpO3JldHVybnt3ZWJXb3JrZXI6Qixib3VuZGluZ0JveDpFWzBdPy5kYXRhfX12YXIgSGk9T2k7YXN5bmMgZnVuY3Rpb24gTWkoQSxlLHQ9e30pe2xldCByPVt7dHlwZTpwLkltYWdlfV0sST1be3R5cGU6cC5JbWFnZSxkYXRhOkF9LHt0eXBlOnAuSW1hZ2UsZGF0YTplfV0saT1bXTtpZihpLnB1c2goIjAiKSxpLnB1c2goIjEiKSxpLnB1c2goIjAiKSxpLnB1c2goIi0tbWVtb3J5LWlvIiksdHlwZW9mIHQudHJhbnNmb3JtPCJ1Iil7bGV0IEU9SS5sZW5ndGgudG9TdHJpbmcoKTtJLnB1c2goe3R5cGU6cC5UcmFuc2Zvcm1MaXN0LGRhdGE6dC50cmFuc2Zvcm19KSxpLnB1c2goIi0tdHJhbnNmb3JtIixFKX1pZih0eXBlb2YgdC5pbnRlcnBvbGF0b3I8InUiKXtpZighWyJsaW5lYXIiLCJuZWFyZXN0X25laWdoYm9yIiwibGFiZWxfaW1hZ2UiLCJiX3NwbGluZSIsIndpbmRvd2VkX3NpbmMiLCJnYXVzc2lhbiJdLmluY2x1ZGVzKHQuaW50ZXJwb2xhdG9yKSl0aHJvdyBuZXcgRXJyb3IoJyJpbnRlcnBvbGF0b3IiIG9wdGlvbiBtdXN0IGJlIG9uZSBvZiBsaW5lYXIsIG5lYXJlc3RfbmVpZ2hib3IsIGxhYmVsX2ltYWdlLCBiX3NwbGluZSwgd2luZG93ZWRfc2luYywgZ2F1c3NpYW4nKTtpLnB1c2goIi0taW50ZXJwb2xhdG9yIix0LmludGVycG9sYXRvci50b1N0cmluZygpKX10eXBlb2YgdC5kZWZhdWx0VmFsdWU8InUiJiZpLnB1c2goIi0tZGVmYXVsdC12YWx1ZSIsdC5kZWZhdWx0VmFsdWUudG9TdHJpbmcoKSk7bGV0IHM9InJlc2FtcGxlLXRvLXJlZmVyZW5jZSIsYT10Py53ZWJXb3JrZXI7YT09PXZvaWQgMCYmKGE9YXdhaXQgSCgpKTtsZXR7d2ViV29ya2VyOkMscmV0dXJuVmFsdWU6bCxzdGRlcnI6QixvdXRwdXRzOmZ9PWF3YWl0IGIocyxpLHIsSSx7cGlwZWxpbmVCYXNlVXJsOk8oKSxwaXBlbGluZVdvcmtlclVybDpHKCksd2ViV29ya2VyOmEsbm9Db3B5OnQ/Lm5vQ29weX0pO2lmKGwhPT0wJiZCIT09IiIpdGhyb3cgbmV3IEVycm9yKEIpO3JldHVybnt3ZWJXb3JrZXI6QyxvdXRwdXQ6ZlswXT8uZGF0YX19dmFyIFlpPU1pO3ZhciBRcj0nZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCx2YXIgVmU9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciB6ZT0oQSx0KT0+e2Zvcih2YXIgZSBpbiB0KVZlKEEsZSx7Z2V0OnRbZV0sZW51bWVyYWJsZTohMH0pfTt2YXIgX3Q9U3ltYm9sKCJDb21saW5rLnByb3h5IiksWGU9U3ltYm9sKCJDb21saW5rLmVuZHBvaW50IiksdmU9U3ltYm9sKCJDb21saW5rLnJlbGVhc2VQcm94eSIpLGl0PVN5bWJvbCgiQ29tbGluay5maW5hbGl6ZXIiKSxiQT1TeW1ib2woIkNvbWxpbmsudGhyb3duIiksanQ9QT0+dHlwZW9mIEE9PSJvYmplY3QiJiZBIT09bnVsbHx8dHlwZW9mIEE9PSJmdW5jdGlvbiIsJGU9e2NhbkhhbmRsZTpBPT5qdChBKSYmQVtfdF0sc2VyaWFsaXplKEEpe2xldHtwb3J0MTp0LHBvcnQyOmV9PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gWUEoQSx0KSxbZSxbZV1dfSxkZXNlcmlhbGl6ZShBKXtyZXR1cm4gQS5zdGFydCgpLHJyKEEpfX0sQXI9e2NhbkhhbmRsZTpBPT5qdChBKSYmYkEgaW4gQSxzZXJpYWxpemUoe3ZhbHVlOkF9KXtsZXQgdDtyZXR1cm4gQSBpbnN0YW5jZW9mIEVycm9yP3Q9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6QS5tZXNzYWdlLG5hbWU6QS5uYW1lLHN0YWNrOkEuc3RhY2t9fTp0PXtpc0Vycm9yOiExLHZhbHVlOkF9LFt0LFtdXX0sZGVzZXJpYWxpemUoQSl7dGhyb3cgQS5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKEEudmFsdWUubWVzc2FnZSksQS52YWx1ZSk6QS52YWx1ZX19LFd0PW5ldyBNYXAoW1sicHJveHkiLCRlXSxbInRocm93IixBcl1dKTtmdW5jdGlvbiB0cihBLHQpe2ZvcihsZXQgZSBvZiBBKWlmKHQ9PT1lfHxlPT09IioifHxlIGluc3RhbmNlb2YgUmVnRXhwJiZlLnRlc3QodCkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWUEoQSx0PWdsb2JhbFRoaXMsZT1bIioiXSl7dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiByKEkpe2lmKCFJfHwhSS5kYXRhKXJldHVybjtpZighdHIoZSxJLm9yaWdpbikpe2NvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gXCcke0kub3JpZ2lufVwnIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWxldHtpZDpvLHR5cGU6aSxwYXRoOmd9PU9iamVjdC5hc3NpZ24oe3BhdGg6W119LEkuZGF0YSksUT0oSS5kYXRhLmFyZ3VtZW50TGlzdHx8W10pLm1hcCgkKSxDO3RyeXtsZXQgcz1nLnNsaWNlKDAsLTEpLnJlZHVjZSgoZixhKT0+ZlthXSxBKSxCPWcucmVkdWNlKChmLGEpPT5mW2FdLEEpO3N3aXRjaChpKXtjYXNlIkdFVCI6Qz1CO2JyZWFrO2Nhc2UiU0VUIjpzW2cuc2xpY2UoLTEpWzBdXT0kKEkuZGF0YS52YWx1ZSksQz0hMDticmVhaztjYXNlIkFQUExZIjpDPUIuYXBwbHkocyxRKTticmVhaztjYXNlIkNPTlNUUlVDVCI6e2xldCBmPW5ldyBCKC4uLlEpO0M9bnIoZil9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2xldHtwb3J0MTpmLHBvcnQyOmF9PW5ldyBNZXNzYWdlQ2hhbm5lbDtZQShBLGEpLEM9Z3QoZixbZl0pfWJyZWFrO2Nhc2UiUkVMRUFTRSI6Qz12b2lkIDA7YnJlYWs7ZGVmYXVsdDpyZXR1cm59fWNhdGNoKHMpe0M9e3ZhbHVlOnMsW2JBXTowfX1Qcm9taXNlLnJlc29sdmUoQykuY2F0Y2gocz0+KHt2YWx1ZTpzLFtiQV06MH0pKS50aGVuKHM9PntsZXRbQixmXT1PQShzKTt0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxCKSx7aWQ6b30pLGYpLGk9PT0iUkVMRUFTRSImJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHIpLFp0KHQpLGl0IGluIEEmJnR5cGVvZiBBW2l0XT09ImZ1bmN0aW9uIiYmQVtpdF0oKSl9KS5jYXRjaChzPT57bGV0W0IsZl09T0Eoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtiQV06MH0pO3QucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEIpLHtpZDpvfSksZil9KX0pLHQuc3RhcnQmJnQuc3RhcnQoKX1mdW5jdGlvbiBlcihBKXtyZXR1cm4gQS5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBadChBKXtlcihBKSYmQS5jbG9zZSgpfWZ1bmN0aW9uIHJyKEEsdCl7cmV0dXJuIG50KEEsW10sdCl9ZnVuY3Rpb24gTEEoQSl7aWYoQSl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIFZ0KEEpe3JldHVybiByQShBLHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntadChBKX0pfXZhciBKQT1uZXcgV2Vha01hcCxIQT0iRmluYWxpemF0aW9uUmVnaXN0cnkiaW4gZ2xvYmFsVGhpcyYmbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KEE9PntsZXQgdD0oSkEuZ2V0KEEpfHwwKS0xO0pBLnNldChBLHQpLHQ9PT0wJiZWdChBKX0pO2Z1bmN0aW9uIElyKEEsdCl7bGV0IGU9KEpBLmdldCh0KXx8MCkrMTtKQS5zZXQodCxlKSxIQSYmSEEucmVnaXN0ZXIoQSx0LEEpfWZ1bmN0aW9uIG9yKEEpe0hBJiZIQS51bnJlZ2lzdGVyKEEpfWZ1bmN0aW9uIG50KEEsdD1bXSxlPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITEsST1uZXcgUHJveHkoZSx7Z2V0KG8saSl7aWYoTEEociksaT09PXZlKXJldHVybigpPT57b3IoSSksVnQoQSkscj0hMH07aWYoaT09PSJ0aGVuIil7aWYodC5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5JfTtsZXQgZz1yQShBLHt0eXBlOiJHRVQiLHBhdGg6dC5tYXAoUT0+US50b1N0cmluZygpKX0pLnRoZW4oJCk7cmV0dXJuIGcudGhlbi5iaW5kKGcpfXJldHVybiBudChBLFsuLi50LGldKX0sc2V0KG8saSxnKXtMQShyKTtsZXRbUSxDXT1PQShnKTtyZXR1cm4gckEoQSx7dHlwZToiU0VUIixwYXRoOlsuLi50LGldLm1hcChzPT5zLnRvU3RyaW5nKCkpLHZhbHVlOlF9LEMpLnRoZW4oJCl9LGFwcGx5KG8saSxnKXtMQShyKTtsZXQgUT10W3QubGVuZ3RoLTFdO2lmKFE9PT1YZSlyZXR1cm4gckEoQSx7dHlwZToiRU5EUE9JTlQifSkudGhlbigkKTtpZihRPT09ImJpbmQiKXJldHVybiBudChBLHQuc2xpY2UoMCwtMSkpO2xldFtDLHNdPVB0KGcpO3JldHVybiByQShBLHt0eXBlOiJBUFBMWSIscGF0aDp0Lm1hcChCPT5CLnRvU3RyaW5nKCkpLGFyZ3VtZW50TGlzdDpDfSxzKS50aGVuKCQpfSxjb25zdHJ1Y3QobyxpKXtMQShyKTtsZXRbZyxRXT1QdChpKTtyZXR1cm4gckEoQSx7dHlwZToiQ09OU1RSVUNUIixwYXRoOnQubWFwKEM9PkMudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omd9LFEpLnRoZW4oJCl9fSk7cmV0dXJuIElyKEksQSksSX1mdW5jdGlvbiBpcihBKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxBKX1mdW5jdGlvbiBQdChBKXtsZXQgdD1BLm1hcChPQSk7cmV0dXJuW3QubWFwKGU9PmVbMF0pLGlyKHQubWFwKGU9PmVbMV0pKV19dmFyIHp0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGd0KEEsdCl7cmV0dXJuIHp0LnNldChBLHQpLEF9ZnVuY3Rpb24gbnIoQSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oQSx7W190XTohMH0pfWZ1bmN0aW9uIE9BKEEpe2ZvcihsZXRbdCxlXW9mIFd0KWlmKGUuY2FuSGFuZGxlKEEpKXtsZXRbcixJXT1lLnNlcmlhbGl6ZShBKTtyZXR1cm5be3R5cGU6IkhBTkRMRVIiLG5hbWU6dCx2YWx1ZTpyfSxJXX1yZXR1cm5be3R5cGU6IlJBVyIsdmFsdWU6QX0senQuZ2V0KEEpfHxbXV19ZnVuY3Rpb24gJChBKXtzd2l0Y2goQS50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBXdC5nZXQoQS5uYW1lKS5kZXNlcmlhbGl6ZShBLnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIEEudmFsdWV9fWZ1bmN0aW9uIHJBKEEsdCxlKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2xldCBJPWdyKCk7QS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBvKGkpeyFpLmRhdGF8fCFpLmRhdGEuaWR8fGkuZGF0YS5pZCE9PUl8fChBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG8pLHIoaS5kYXRhKSl9KSxBLnN0YXJ0JiZBLnN0YXJ0KCksQS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHtpZDpJfSx0KSxlKX0pfWZ1bmN0aW9uIGdyKCl7cmV0dXJuIG5ldyBBcnJheSg0KS5maWxsKDApLm1hcCgoKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oIi0iKX1mdW5jdGlvbiBmQShBLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBLmFwcGx5KHQsYXJndW1lbnRzKX19dmFye3RvU3RyaW5nOnNyfT1PYmplY3QucHJvdG90eXBlLHtnZXRQcm90b3R5cGVPZjpNQX09T2JqZWN0LHtpdGVyYXRvcjpUQSx0b1N0cmluZ1RhZzpBZX09U3ltYm9sLHhBPShBPT50PT57bGV0IGU9c3IuY2FsbCh0KTtyZXR1cm4gQVtlXXx8KEFbZV09ZS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpKX0pKE9iamVjdC5jcmVhdGUobnVsbCkpLE89QT0+KEE9QS50b0xvd2VyQ2FzZSgpLHQ9PnhBKHQpPT09QSksS0E9QT0+dD0+dHlwZW9mIHQ9PT1BLHtpc0FycmF5Om9BfT1BcnJheSxJQT1LQSgidW5kZWZpbmVkIik7ZnVuY3Rpb24gbEEoQSl7cmV0dXJuIEEhPT1udWxsJiYhSUEoQSkmJkEuY29uc3RydWN0b3IhPT1udWxsJiYhSUEoQS5jb25zdHJ1Y3RvcikmJmsoQS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcikmJkEuY29uc3RydWN0b3IuaXNCdWZmZXIoQSl9dmFyIHRlPU8oIkFycmF5QnVmZmVyIik7ZnVuY3Rpb24gYXIoQSl7bGV0IHQ7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz90PUFycmF5QnVmZmVyLmlzVmlldyhBKTp0PUEmJkEuYnVmZmVyJiZ0ZShBLmJ1ZmZlciksdH12YXIgQ3I9S0EoInN0cmluZyIpLGs9S0EoImZ1bmN0aW9uIiksZWU9S0EoIm51bWJlciIpLHVBPUE9PkEhPT1udWxsJiZ0eXBlb2YgQT09Im9iamVjdCIsQnI9QT0+QT09PSEwfHxBPT09ITEscUE9QT0+e2lmKHhBKEEpIT09Im9iamVjdCIpcmV0dXJuITE7bGV0IHQ9TUEoQSk7cmV0dXJuKHQ9PT1udWxsfHx0PT09T2JqZWN0LnByb3RvdHlwZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpPT09bnVsbCkmJiEoQWUgaW4gQSkmJiEoVEEgaW4gQSl9LFFyPUE9PntpZighdUEoQSl8fGxBKEEpKXJldHVybiExO3RyeXtyZXR1cm4gT2JqZWN0LmtleXMoQSkubGVuZ3RoPT09MCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKEEpPT09T2JqZWN0LnByb3RvdHlwZX1jYXRjaHtyZXR1cm4hMX19LEVyPU8oIkRhdGUiKSxjcj1PKCJGaWxlIiksZnI9QT0+ISEoQSYmdHlwZW9mIEEudXJpPCJ1IiksbHI9QT0+QSYmdHlwZW9mIEEuZ2V0UGFydHM8InUiLHVyPU8oIkJsb2IiKSxkcj1PKCJGaWxlTGlzdCIpLGhyPUE9PnVBKEEpJiZrKEEucGlwZSk7ZnVuY3Rpb24gRHIoKXtyZXR1cm4gdHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp7fX12YXIgdnQ9RHIoKSwkdD10eXBlb2YgdnQuRm9ybURhdGE8InUiP3Z0LkZvcm1EYXRhOnZvaWQgMCx5cj1BPT57aWYoIUEpcmV0dXJuITE7aWYoJHQmJkEgaW5zdGFuY2VvZiAkdClyZXR1cm4hMDtsZXQgdD1NQShBKTtpZighdHx8dD09PU9iamVjdC5wcm90b3R5cGV8fCFrKEEuYXBwZW5kKSlyZXR1cm4hMTtsZXQgZT14QShBKTtyZXR1cm4gZT09PSJmb3JtZGF0YSJ8fGU9PT0ib2JqZWN0IiYmayhBLnRvU3RyaW5nKSYmQS50b1N0cmluZygpPT09IltvYmplY3QgRm9ybURhdGFdIn0scHI9TygiVVJMU2VhcmNoUGFyYW1zIiksW21yLHdyLFNyLFJyXT1bIlJlYWRhYmxlU3RyZWFtIiwiUmVxdWVzdCIsIlJlc3BvbnNlIiwiSGVhZGVycyJdLm1hcChPKSxGcj1BPT5BLnRyaW0/QS50cmltKCk6QS5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywiIik7ZnVuY3Rpb24gZEEoQSx0LHthbGxPd25LZXlzOmU9ITF9PXt9KXtpZihBPT09bnVsbHx8dHlwZW9mIEE+InUiKXJldHVybjtsZXQgcixJO2lmKHR5cGVvZiBBIT0ib2JqZWN0IiYmKEE9W0FdKSxvQShBKSlmb3Iocj0wLEk9QS5sZW5ndGg7cjxJO3IrKyl0LmNhbGwobnVsbCxBW3JdLHIsQSk7ZWxzZXtpZihsQShBKSlyZXR1cm47bGV0IG89ZT9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKTpPYmplY3Qua2V5cyhBKSxpPW8ubGVuZ3RoLGc7Zm9yKHI9MDtyPGk7cisrKWc9b1tyXSx0LmNhbGwobnVsbCxBW2ddLGcsQSl9fWZ1bmN0aW9uIHJlKEEsdCl7aWYobEEoQSkpcmV0dXJuIG51bGw7dD10LnRvTG93ZXJDYXNlKCk7bGV0IGU9T2JqZWN0LmtleXMoQSkscj1lLmxlbmd0aCxJO2Zvcig7ci0tID4wOylpZihJPWVbcl0sdD09PUkudG9Mb3dlckNhc2UoKSlyZXR1cm4gSTtyZXR1cm4gbnVsbH12YXIgQUE9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Omdsb2JhbCxJZT1BPT4hSUEoQSkmJkEhPT1BQTtmdW5jdGlvbiBzdCguLi5BKXtsZXR7Y2FzZWxlc3M6dCxza2lwVW5kZWZpbmVkOmV9PUllKHRoaXMpJiZ0aGlzfHx7fSxyPXt9LEk9KG8saSk9PntpZihpPT09Il9fcHJvdG9fXyJ8fGk9PT0iY29uc3RydWN0b3IifHxpPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBnPXQmJnJlKHIsaSl8fGksUT1hdChyLGcpP3JbZ106dm9pZCAwO3FBKFEpJiZxQShvKT9yW2ddPXN0KFEsbyk6cUEobyk/cltnXT1zdCh7fSxvKTpvQShvKT9yW2ddPW8uc2xpY2UoKTooIWV8fCFJQShvKSkmJihyW2ddPW8pfTtmb3IobGV0IG89MCxpPUEubGVuZ3RoO288aTtvKyspQVtvXSYmZEEoQVtvXSxJKTtyZXR1cm4gcn12YXIgTnI9KEEsdCxlLHthbGxPd25LZXlzOnJ9PXt9KT0+KGRBKHQsKEksbyk9PntlJiZrKEkpP09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLG8se19fcHJvdG9fXzpudWxsLHZhbHVlOmZBKEksZSksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTpPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxvLHtfX3Byb3RvX186bnVsbCx2YWx1ZTpJLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9LHthbGxPd25LZXlzOnJ9KSxBKSxVcj1BPT4oQS5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihBPUEuc2xpY2UoMSkpLEEpLEdyPShBLHQsZSxyKT0+e0EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KEEucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIse19fcHJvdG9fXzpudWxsLHZhbHVlOkEsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQSwic3VwZXIiLHtfX3Byb3RvX186bnVsbCx2YWx1ZTp0LnByb3RvdHlwZX0pLGUmJk9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUsZSl9LGtyPShBLHQsZSxyKT0+e2xldCBJLG8saSxnPXt9O2lmKHQ9dHx8e30sQT09bnVsbClyZXR1cm4gdDtkb3tmb3IoST1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhBKSxvPUkubGVuZ3RoO28tLSA+MDspaT1JW29dLCghcnx8cihpLEEsdCkpJiYhZ1tpXSYmKHRbaV09QVtpXSxnW2ldPSEwKTtBPWUhPT0hMSYmTUEoQSl9d2hpbGUoQSYmKCFlfHxlKEEsdCkpJiZBIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9LExyPShBLHQsZSk9PntBPVN0cmluZyhBKSwoZT09PXZvaWQgMHx8ZT5BLmxlbmd0aCkmJihlPUEubGVuZ3RoKSxlLT10Lmxlbmd0aDtsZXQgcj1BLmluZGV4T2YodCxlKTtyZXR1cm4gciE9PS0xJiZyPT09ZX0sYnI9QT0+e2lmKCFBKXJldHVybiBudWxsO2lmKG9BKEEpKXJldHVybiBBO2xldCB0PUEubGVuZ3RoO2lmKCFlZSh0KSlyZXR1cm4gbnVsbDtsZXQgZT1uZXcgQXJyYXkodCk7Zm9yKDt0LS0gPjA7KWVbdF09QVt0XTtyZXR1cm4gZX0sSnI9KEE9PnQ9PkEmJnQgaW5zdGFuY2VvZiBBKSh0eXBlb2YgVWludDhBcnJheTwidSImJk1BKFVpbnQ4QXJyYXkpKSxIcj0oQSx0KT0+e2xldCByPShBJiZBW1RBXSkuY2FsbChBKSxJO2Zvcig7KEk9ci5uZXh0KCkpJiYhSS5kb25lOyl7bGV0IG89SS52YWx1ZTt0LmNhbGwoQSxvWzBdLG9bMV0pfX0sT3I9KEEsdCk9PntsZXQgZSxyPVtdO2Zvcig7KGU9QS5leGVjKHQpKSE9PW51bGw7KXIucHVzaChlKTtyZXR1cm4gcn0sWXI9TygiSFRNTEZvcm1FbGVtZW50IikscXI9QT0+QS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csZnVuY3Rpb24oZSxyLEkpe3JldHVybiByLnRvVXBwZXJDYXNlKCkrSX0pLGF0PSgoe2hhc093blByb3BlcnR5OkF9KT0+KHQsZSk9PkEuY2FsbCh0LGUpKShPYmplY3QucHJvdG90eXBlKSxNcj1PKCJSZWdFeHAiKSxvZT0oQSx0KT0+e2xldCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKEEpLHI9e307ZEEoZSwoSSxvKT0+e2xldCBpOyhpPXQoSSxvLEEpKSE9PSExJiYocltvXT1pfHxJKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEEscil9LFRyPUE9PntvZShBLCh0LGUpPT57aWYoayhBKSYmWyJhcmd1bWVudHMiLCJjYWxsZXIiLCJjYWxsZWUiXS5pbmNsdWRlcyhlKSlyZXR1cm4hMTtsZXQgcj1BW2VdO2lmKGsocikpe2lmKHQuZW51bWVyYWJsZT0hMSwid3JpdGFibGUiaW4gdCl7dC53cml0YWJsZT0hMTtyZXR1cm59dC5zZXR8fCh0LnNldD0oKT0+e3Rocm93IEVycm9yKCJDYW4gbm90IHJld3JpdGUgcmVhZC1vbmx5IG1ldGhvZCBcJyIrZSsiXCciKX0pfX0pfSx4cj0oQSx0KT0+e2xldCBlPXt9LHI9ST0+e0kuZm9yRWFjaChvPT57ZVtvXT0hMH0pfTtyZXR1cm4gb0EoQSk/cihBKTpyKFN0cmluZyhBKS5zcGxpdCh0KSksZX0sS3I9KCk9Pnt9LFByPShBLHQpPT5BIT1udWxsJiZOdW1iZXIuaXNGaW5pdGUoQT0rQSk/QTp0O2Z1bmN0aW9uIF9yKEEpe3JldHVybiEhKEEmJmsoQS5hcHBlbmQpJiZBW0FlXT09PSJGb3JtRGF0YSImJkFbVEFdKX12YXIganI9QT0+e2xldCB0PW5ldyBXZWFrU2V0LGU9cj0+e2lmKHVBKHIpKXtpZih0LmhhcyhyKSlyZXR1cm47aWYobEEocikpcmV0dXJuIHI7aWYoISgidG9KU09OImluIHIpKXt0LmFkZChyKTtsZXQgST1vQShyKT9bXTp7fTtyZXR1cm4gZEEociwobyxpKT0+e2xldCBnPWUobyk7IUlBKGcpJiYoSVtpXT1nKX0pLHQuZGVsZXRlKHIpLEl9fXJldHVybiByfTtyZXR1cm4gZShBKX0sV3I9TygiQXN5bmNGdW5jdGlvbiIpLFpyPUE9PkEmJih1QShBKXx8ayhBKSkmJmsoQS50aGVuKSYmayhBLmNhdGNoKSxpZT0oKEEsdCk9PkE/c2V0SW1tZWRpYXRlOnQ/KChlLHIpPT4oQUEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtzb3VyY2U6SSxkYXRhOm99KT0+e0k9PT1BQSYmbz09PWUmJnIubGVuZ3RoJiZyLnNoaWZ0KCkoKX0sITEpLEk9PntyLnB1c2goSSksQUEucG9zdE1lc3NhZ2UoZSwiKiIpfSkpKGBheGlvc0Ake01hdGgucmFuZG9tKCl9YCxbXSk6ZT0+c2V0VGltZW91dChlKSkodHlwZW9mIHNldEltbWVkaWF0ZT09ImZ1bmN0aW9uIixrKEFBLnBvc3RNZXNzYWdlKSksVnI9dHlwZW9mIHF1ZXVlTWljcm90YXNrPCJ1Ij9xdWV1ZU1pY3JvdGFzay5iaW5kKEFBKTp0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MubmV4dFRpY2t8fGllLHpyPUE9PkEhPW51bGwmJmsoQVtUQV0pLG49e2lzQXJyYXk6b0EsaXNBcnJheUJ1ZmZlcjp0ZSxpc0J1ZmZlcjpsQSxpc0Zvcm1EYXRhOnlyLGlzQXJyYXlCdWZmZXJWaWV3OmFyLGlzU3RyaW5nOkNyLGlzTnVtYmVyOmVlLGlzQm9vbGVhbjpCcixpc09iamVjdDp1QSxpc1BsYWluT2JqZWN0OnFBLGlzRW1wdHlPYmplY3Q6UXIsaXNSZWFkYWJsZVN0cmVhbTptcixpc1JlcXVlc3Q6d3IsaXNSZXNwb25zZTpTcixpc0hlYWRlcnM6UnIsaXNVbmRlZmluZWQ6SUEsaXNEYXRlOkVyLGlzRmlsZTpjcixpc1JlYWN0TmF0aXZlQmxvYjpmcixpc1JlYWN0TmF0aXZlOmxyLGlzQmxvYjp1cixpc1JlZ0V4cDpNcixpc0Z1bmN0aW9uOmssaXNTdHJlYW06aHIsaXNVUkxTZWFyY2hQYXJhbXM6cHIsaXNUeXBlZEFycmF5OkpyLGlzRmlsZUxpc3Q6ZHIsZm9yRWFjaDpkQSxtZXJnZTpzdCxleHRlbmQ6TnIsdHJpbTpGcixzdHJpcEJPTTpVcixpbmhlcml0czpHcix0b0ZsYXRPYmplY3Q6a3Isa2luZE9mOnhBLGtpbmRPZlRlc3Q6TyxlbmRzV2l0aDpMcix0b0FycmF5OmJyLGZvckVhY2hFbnRyeTpIcixtYXRjaEFsbDpPcixpc0hUTUxGb3JtOllyLGhhc093blByb3BlcnR5OmF0LGhhc093blByb3A6YXQscmVkdWNlRGVzY3JpcHRvcnM6b2UsZnJlZXplTWV0aG9kczpUcix0b09iamVjdFNldDp4cix0b0NhbWVsQ2FzZTpxcixub29wOktyLHRvRmluaXRlTnVtYmVyOlByLGZpbmRLZXk6cmUsZ2xvYmFsOkFBLGlzQ29udGV4dERlZmluZWQ6SWUsaXNTcGVjQ29tcGxpYW50Rm9ybTpfcix0b0pTT05PYmplY3Q6anIsaXNBc3luY0ZuOldyLGlzVGhlbmFibGU6WnIsc2V0SW1tZWRpYXRlOmllLGFzYXA6VnIsaXNJdGVyYWJsZTp6cn07dmFyIFhyPW4udG9PYmplY3RTZXQoWyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSksbmU9QT0+e2xldCB0PXt9LGUscixJO3JldHVybiBBJiZBLnNwbGl0KGAlMEFgKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe0k9aS5pbmRleE9mKCI6IiksZT1pLnN1YnN0cmluZygwLEkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLHI9aS5zdWJzdHJpbmcoSSsxKS50cmltKCksISghZXx8dFtlXSYmWHJbZV0pJiYoZT09PSJzZXQtY29va2llIj90W2VdP3RbZV0ucHVzaChyKTp0W2VdPVtyXTp0W2VdPXRbZV0/dFtlXSsiLCAiK3I6cil9KSx0fTtmdW5jdGlvbiB2cihBKXtsZXQgdD0wLGU9QS5sZW5ndGg7Zm9yKDt0PGU7KXtsZXQgcj1BLmNoYXJDb2RlQXQodCk7aWYociE9PTkmJnIhPT0zMilicmVhazt0Kz0xfWZvcig7ZT50Oyl7bGV0IHI9QS5jaGFyQ29kZUF0KGUtMSk7aWYociE9PTkmJnIhPT0zMilicmVhaztlLT0xfXJldHVybiB0PT09MCYmZT09PUEubGVuZ3RoP0E6QS5zbGljZSh0LGUpfXZhciAkcj1uZXcgUmVnRXhwKCJbXFxcXHUwMDAwLVxcXFx1MDAwOFxcXFx1MDAwYS1cXFxcdTAwMWZcXFxcdTAwN2ZdKyIsImciKSxBST1uZXcgUmVnRXhwKCJbXlxcXFx1MDAwOVxcXFx1MDAyMC1cXFxcdTAwN2VcXFxcdTAwODAtXFxcXHUwMGZmXSsiLCJnIik7ZnVuY3Rpb24gQ3QoQSx0KXtyZXR1cm4gbi5pc0FycmF5KEEpP0EubWFwKGU9PkN0KGUsdCkpOnZyKFN0cmluZyhBKS5yZXBsYWNlKHQsIiIpKX12YXIgZ2U9QT0+Q3QoQSwkciksdEk9QT0+Q3QoQSxBSSk7ZnVuY3Rpb24gUEEoQSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gbi5mb3JFYWNoKEEudG9KU09OKCksKGUscik9Pnt0W3JdPXRJKGUpfSksdH12YXIgc2U9U3ltYm9sKCJpbnRlcm5hbHMiKTtmdW5jdGlvbiBoQShBKXtyZXR1cm4gQSYmU3RyaW5nKEEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIF9BKEEpe3JldHVybiBBPT09ITF8fEE9PW51bGw/QTpuLmlzQXJyYXkoQSk/QS5tYXAoX0EpOmdlKFN0cmluZyhBKSl9ZnVuY3Rpb24gZUkoQSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxlPS8oW15cXHMsOz1dKylcXHMqKD86PVxccyooW14sO10rKSk/L2cscjtmb3IoO3I9ZS5leGVjKEEpOyl0W3JbMV1dPXJbMl07cmV0dXJuIHR9dmFyIHJJPUE9Pi9eWy1fYS16QS1aMC05XmB8fiwhJTIzJCUmXCcqKy5dKyQvLnRlc3QoQS50cmltKCkpO2Z1bmN0aW9uIEJ0KEEsdCxlLHIsSSl7aWYobi5pc0Z1bmN0aW9uKHIpKXJldHVybiByLmNhbGwodGhpcyx0LGUpO2lmKEkmJih0PWUpLCEhbi5pc1N0cmluZyh0KSl7aWYobi5pc1N0cmluZyhyKSlyZXR1cm4gdC5pbmRleE9mKHIpIT09LTE7aWYobi5pc1JlZ0V4cChyKSlyZXR1cm4gci50ZXN0KHQpfX1mdW5jdGlvbiBJSShBKXtyZXR1cm4gQS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csKHQsZSxyKT0+ZS50b1VwcGVyQ2FzZSgpK3IpfWZ1bmN0aW9uIG9JKEEsdCl7bGV0IGU9bi50b0NhbWVsQ2FzZSgiICIrdCk7WyJnZXQiLCJzZXQiLCJoYXMiXS5mb3JFYWNoKHI9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoQSxyK2Use19fcHJvdG9fXzpudWxsLHZhbHVlOmZ1bmN0aW9uKEksbyxpKXtyZXR1cm4gdGhpc1tyXS5jYWxsKHRoaXMsdCxJLG8saSl9LGNvbmZpZ3VyYWJsZTohMH0pfSl9dmFyIGlBPWNsYXNze2NvbnN0cnVjdG9yKHQpe3QmJnRoaXMuc2V0KHQpfXNldCh0LGUscil7bGV0IEk9dGhpcztmdW5jdGlvbiBvKGcsUSxDKXtsZXQgcz1oQShRKTtpZighcyl0aHJvdyBuZXcgRXJyb3IoImhlYWRlciBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7bGV0IEI9bi5maW5kS2V5KEkscyk7KCFCfHxJW0JdPT09dm9pZCAwfHxDPT09ITB8fEM9PT12b2lkIDAmJklbQl0hPT0hMSkmJihJW0J8fFFdPV9BKGcpKX1sZXQgaT0oZyxRKT0+bi5mb3JFYWNoKGcsKEMscyk9Pm8oQyxzLFEpKTtpZihuLmlzUGxhaW5PYmplY3QodCl8fHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKWkodCxlKTtlbHNlIGlmKG4uaXNTdHJpbmcodCkmJih0PXQudHJpbSgpKSYmIXJJKHQpKWkobmUodCksZSk7ZWxzZSBpZihuLmlzT2JqZWN0KHQpJiZuLmlzSXRlcmFibGUodCkpe2xldCBnPXt9LFEsQztmb3IobGV0IHMgb2YgdCl7aWYoIW4uaXNBcnJheShzKSl0aHJvdyBUeXBlRXJyb3IoIk9iamVjdCBpdGVyYXRvciBtdXN0IHJldHVybiBhIGtleS12YWx1ZSBwYWlyIik7Z1tDPXNbMF1dPShRPWdbQ10pP24uaXNBcnJheShRKT9bLi4uUSxzWzFdXTpbUSxzWzFdXTpzWzFdfWkoZyxlKX1lbHNlIHQhPW51bGwmJm8oZSx0LHIpO3JldHVybiB0aGlzfWdldCh0LGUpe2lmKHQ9aEEodCksdCl7bGV0IHI9bi5maW5kS2V5KHRoaXMsdCk7aWYocil7bGV0IEk9dGhpc1tyXTtpZighZSlyZXR1cm4gSTtpZihlPT09ITApcmV0dXJuIGVJKEkpO2lmKG4uaXNGdW5jdGlvbihlKSlyZXR1cm4gZS5jYWxsKHRoaXMsSSxyKTtpZihuLmlzUmVnRXhwKGUpKXJldHVybiBlLmV4ZWMoSSk7dGhyb3cgbmV3IFR5cGVFcnJvcigicGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24iKX19fWhhcyh0LGUpe2lmKHQ9aEEodCksdCl7bGV0IHI9bi5maW5kS2V5KHRoaXMsdCk7cmV0dXJuISEociYmdGhpc1tyXSE9PXZvaWQgMCYmKCFlfHxCdCh0aGlzLHRoaXNbcl0scixlKSkpfXJldHVybiExfWRlbGV0ZSh0LGUpe2xldCByPXRoaXMsST0hMTtmdW5jdGlvbiBvKGkpe2lmKGk9aEEoaSksaSl7bGV0IGc9bi5maW5kS2V5KHIsaSk7ZyYmKCFlfHxCdChyLHJbZ10sZyxlKSkmJihkZWxldGUgcltnXSxJPSEwKX19cmV0dXJuIG4uaXNBcnJheSh0KT90LmZvckVhY2gobyk6byh0KSxJfWNsZWFyKHQpe2xldCBlPU9iamVjdC5rZXlzKHRoaXMpLHI9ZS5sZW5ndGgsST0hMTtmb3IoO3ItLTspe2xldCBvPWVbcl07KCF0fHxCdCh0aGlzLHRoaXNbb10sbyx0LCEwKSkmJihkZWxldGUgdGhpc1tvXSxJPSEwKX1yZXR1cm4gSX1ub3JtYWxpemUodCl7bGV0IGU9dGhpcyxyPXt9O3JldHVybiBuLmZvckVhY2godGhpcywoSSxvKT0+e2xldCBpPW4uZmluZEtleShyLG8pO2lmKGkpe2VbaV09X0EoSSksZGVsZXRlIGVbb107cmV0dXJufWxldCBnPXQ/SUkobyk6U3RyaW5nKG8pLnRyaW0oKTtnIT09byYmZGVsZXRlIGVbb10sZVtnXT1fQShJKSxyW2ddPSEwfSksdGhpc31jb25jYXQoLi4udCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY29uY2F0KHRoaXMsLi4udCl9dG9KU09OKHQpe2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIG4uZm9yRWFjaCh0aGlzLChyLEkpPT57ciE9bnVsbCYmciE9PSExJiYoZVtJXT10JiZuLmlzQXJyYXkocik/ci5qb2luKCIsICIpOnIpfSksZX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCl9dG9TdHJpbmcoKXtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbdCxlXSk9PnQrIjogIitlKS5qb2luKGAlMEFgKX1nZXRTZXRDb29raWUoKXtyZXR1cm4gdGhpcy5nZXQoInNldC1jb29raWUiKXx8W119Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iQXhpb3NIZWFkZXJzIn1zdGF0aWMgZnJvbSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXM/dDpuZXcgdGhpcyh0KX1zdGF0aWMgY29uY2F0KHQsLi4uZSl7bGV0IHI9bmV3IHRoaXModCk7cmV0dXJuIGUuZm9yRWFjaChJPT5yLnNldChJKSkscn1zdGF0aWMgYWNjZXNzb3IodCl7bGV0IHI9KHRoaXNbc2VdPXRoaXNbc2VdPXthY2Nlc3NvcnM6e319KS5hY2Nlc3NvcnMsST10aGlzLnByb3RvdHlwZTtmdW5jdGlvbiBvKGkpe2xldCBnPWhBKGkpO3JbZ118fChvSShJLGkpLHJbZ109ITApfXJldHVybiBuLmlzQXJyYXkodCk/dC5mb3JFYWNoKG8pOm8odCksdGhpc319O2lBLmFjY2Vzc29yKFsiQ29udGVudC1UeXBlIiwiQ29udGVudC1MZW5ndGgiLCJBY2NlcHQiLCJBY2NlcHQtRW5jb2RpbmciLCJVc2VyLUFnZW50IiwiQXV0aG9yaXphdGlvbiJdKTtuLnJlZHVjZURlc2NyaXB0b3JzKGlBLnByb3RvdHlwZSwoe3ZhbHVlOkF9LHQpPT57bGV0IGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7cmV0dXJue2dldDooKT0+QSxzZXQocil7dGhpc1tlXT1yfX19KTtuLmZyZWV6ZU1ldGhvZHMoaUEpO3ZhciBTPWlBO3ZhciBpST0iW1JFREFDVEVEICoqKipdIjtmdW5jdGlvbiBuSShBKXtpZihuLmhhc093blByb3AoQSwidG9KU09OIikpcmV0dXJuITA7bGV0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKEEpO2Zvcig7dCYmdCE9PU9iamVjdC5wcm90b3R5cGU7KXtpZihuLmhhc093blByb3AodCwidG9KU09OIikpcmV0dXJuITA7dD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9cmV0dXJuITF9ZnVuY3Rpb24gZ0koQSx0KXtsZXQgZT1uZXcgU2V0KHQubWFwKG89PlN0cmluZyhvKS50b0xvd2VyQ2FzZSgpKSkscj1bXSxJPW89PntpZihvPT09bnVsbHx8dHlwZW9mIG8hPSJvYmplY3QifHxuLmlzQnVmZmVyKG8pKXJldHVybiBvO2lmKHIuaW5kZXhPZihvKSE9PS0xKXJldHVybjtvIGluc3RhbmNlb2YgUyYmKG89by50b0pTT04oKSksci5wdXNoKG8pO2xldCBpO2lmKG4uaXNBcnJheShvKSlpPVtdLG8uZm9yRWFjaCgoZyxRKT0+e2xldCBDPUkoZyk7bi5pc1VuZGVmaW5lZChDKXx8KGlbUV09Qyl9KTtlbHNle2lmKCFuLmlzUGxhaW5PYmplY3QobykmJm5JKG8pKXJldHVybiByLnBvcCgpLG87aT1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXRbZyxRXW9mIE9iamVjdC5lbnRyaWVzKG8pKXtsZXQgQz1lLmhhcyhnLnRvTG93ZXJDYXNlKCkpP2lJOkkoUSk7bi5pc1VuZGVmaW5lZChDKXx8KGlbZ109Qyl9fXJldHVybiByLnBvcCgpLGl9O3JldHVybiBJKEEpfXZhciBOPWNsYXNzIEEgZXh0ZW5kcyBFcnJvcntzdGF0aWMgZnJvbSh0LGUscixJLG8saSl7bGV0IGc9bmV3IEEodC5tZXNzYWdlLGV8fHQuY29kZSxyLEksbyk7cmV0dXJuIGcuY2F1c2U9dCxnLm5hbWU9dC5uYW1lLHQuc3RhdHVzIT1udWxsJiZnLnN0YXR1cz09bnVsbCYmKGcuc3RhdHVzPXQuc3RhdHVzKSxpJiZPYmplY3QuYXNzaWduKGcsaSksZ31jb25zdHJ1Y3Rvcih0LGUscixJLG8pe3N1cGVyKHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtZXNzYWdlIix7X19wcm90b19fOm51bGwsdmFsdWU6dCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdGhpcy5pc0F4aW9zRXJyb3I9ITAsZSYmKHRoaXMuY29kZT1lKSxyJiYodGhpcy5jb25maWc9ciksSSYmKHRoaXMucmVxdWVzdD1JKSxvJiYodGhpcy5yZXNwb25zZT1vLHRoaXMuc3RhdHVzPW8uc3RhdHVzKX10b0pTT04oKXtsZXQgdD10aGlzLmNvbmZpZyxlPXQmJm4uaGFzT3duUHJvcCh0LCJyZWRhY3QiKT90LnJlZGFjdDp2b2lkIDAscj1uLmlzQXJyYXkoZSkmJmUubGVuZ3RoPjA/Z0kodCxlKTpuLnRvSlNPTk9iamVjdCh0KTtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6cixjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5zdGF0dXN9fX07Ti5FUlJfQkFEX09QVElPTl9WQUxVRT0iRVJSX0JBRF9PUFRJT05fVkFMVUUiO04uRVJSX0JBRF9PUFRJT049IkVSUl9CQURfT1BUSU9OIjtOLkVDT05OQUJPUlRFRD0iRUNPTk5BQk9SVEVEIjtOLkVUSU1FRE9VVD0iRVRJTUVET1VUIjtOLkVDT05OUkVGVVNFRD0iRUNPTk5SRUZVU0VEIjtOLkVSUl9ORVRXT1JLPSJFUlJfTkVUV09SSyI7Ti5FUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTPSJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTIjtOLkVSUl9ERVBSRUNBVEVEPSJFUlJfREVQUkVDQVRFRCI7Ti5FUlJfQkFEX1JFU1BPTlNFPSJFUlJfQkFEX1JFU1BPTlNFIjtOLkVSUl9CQURfUkVRVUVTVD0iRVJSX0JBRF9SRVFVRVNUIjtOLkVSUl9DQU5DRUxFRD0iRVJSX0NBTkNFTEVEIjtOLkVSUl9OT1RfU1VQUE9SVD0iRVJSX05PVF9TVVBQT1JUIjtOLkVSUl9JTlZBTElEX1VSTD0iRVJSX0lOVkFMSURfVVJMIjtOLkVSUl9GT1JNX0RBVEFfREVQVEhfRVhDRUVERUQ9IkVSUl9GT1JNX0RBVEFfREVQVEhfRVhDRUVERUQiO3ZhciBkPU47dmFyIGpBPW51bGw7ZnVuY3Rpb24gRXQoQSl7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChBKXx8bi5pc0FycmF5KEEpfWZ1bmN0aW9uIGFlKEEpe3JldHVybiBuLmVuZHNXaXRoKEEsIltdIik/QS5zbGljZSgwLC0yKTpBfWZ1bmN0aW9uIFF0KEEsdCxlKXtyZXR1cm4gQT9BLmNvbmNhdCh0KS5tYXAoZnVuY3Rpb24oSSxvKXtyZXR1cm4gST1hZShJKSwhZSYmbz8iWyIrSSsiXSI6SX0pLmpvaW4oZT8iLiI6IiIpOnR9ZnVuY3Rpb24gc0koQSl7cmV0dXJuIG4uaXNBcnJheShBKSYmIUEuc29tZShFdCl9dmFyIGFJPW4udG9GbGF0T2JqZWN0KG4se30sbnVsbCxmdW5jdGlvbih0KXtyZXR1cm4vXmlzW0EtWl0vLnRlc3QodCl9KTtmdW5jdGlvbiBDSShBLHQsZSl7aWYoIW4uaXNPYmplY3QoQSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7dD10fHxuZXcoakF8fEZvcm1EYXRhKSxlPW4udG9GbGF0T2JqZWN0KGUse21ldGFUb2tlbnM6ITAsZG90czohMSxpbmRleGVzOiExfSwhMSxmdW5jdGlvbihFLHUpe3JldHVybiFuLmlzVW5kZWZpbmVkKHVbRV0pfSk7bGV0IHI9ZS5tZXRhVG9rZW5zLEk9ZS52aXNpdG9yfHxCLG89ZS5kb3RzLGk9ZS5pbmRleGVzLGc9ZS5CbG9ifHx0eXBlb2YgQmxvYjwidSImJkJsb2IsUT1lLm1heERlcHRoPT09dm9pZCAwPzEwMDplLm1heERlcHRoLEM9ZyYmbi5pc1NwZWNDb21wbGlhbnRGb3JtKHQpO2lmKCFuLmlzRnVuY3Rpb24oSSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmdW5jdGlvbiBzKGMpe2lmKGM9PT1udWxsKXJldHVybiIiO2lmKG4uaXNEYXRlKGMpKXJldHVybiBjLnRvSVNPU3RyaW5nKCk7aWYobi5pc0Jvb2xlYW4oYykpcmV0dXJuIGMudG9TdHJpbmcoKTtpZighQyYmbi5pc0Jsb2IoYykpdGhyb3cgbmV3IGQoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIG4uaXNBcnJheUJ1ZmZlcihjKXx8bi5pc1R5cGVkQXJyYXkoYyk/QyYmdHlwZW9mIEJsb2I9PSJmdW5jdGlvbiI/bmV3IEJsb2IoW2NdKTpCdWZmZXIuZnJvbShjKTpjfWZ1bmN0aW9uIEIoYyxFLHUpe2xldCB5PWM7aWYobi5pc1JlYWN0TmF0aXZlKHQpJiZuLmlzUmVhY3ROYXRpdmVCbG9iKGMpKXJldHVybiB0LmFwcGVuZChRdCh1LEUsbykscyhjKSksITE7aWYoYyYmIXUmJnR5cGVvZiBjPT0ib2JqZWN0Iil7aWYobi5lbmRzV2l0aChFLCJ7fSIpKUU9cj9FOkUuc2xpY2UoMCwtMiksYz1KU09OLnN0cmluZ2lmeShjKTtlbHNlIGlmKG4uaXNBcnJheShjKSYmc0koYyl8fChuLmlzRmlsZUxpc3QoYyl8fG4uZW5kc1dpdGgoRSwiW10iKSkmJih5PW4udG9BcnJheShjKSkpcmV0dXJuIEU9YWUoRSkseS5mb3JFYWNoKGZ1bmN0aW9uKEQsYil7IShuLmlzVW5kZWZpbmVkKEQpfHxEPT09bnVsbCkmJnQuYXBwZW5kKGk9PT0hMD9RdChbRV0sYixvKTppPT09bnVsbD9FOkUrIltdIixzKEQpKX0pLCExfXJldHVybiBFdChjKT8hMDoodC5hcHBlbmQoUXQodSxFLG8pLHMoYykpLCExKX1sZXQgZj1bXSxhPU9iamVjdC5hc3NpZ24oYUkse2RlZmF1bHRWaXNpdG9yOkIsY29udmVydFZhbHVlOnMsaXNWaXNpdGFibGU6RXR9KTtmdW5jdGlvbiBsKGMsRSx1PTApe2lmKCFuLmlzVW5kZWZpbmVkKGMpKXtpZih1PlEpdGhyb3cgbmV3IGQoIk9iamVjdCBpcyB0b28gZGVlcGx5IG5lc3RlZCAoIit1KyIgbGV2ZWxzKS4gTWF4IGRlcHRoOiAiK1EsZC5FUlJfRk9STV9EQVRBX0RFUFRIX0VYQ0VFREVEKTtpZihmLmluZGV4T2YoYykhPT0tMSl0aHJvdyBFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICIrRS5qb2luKCIuIikpO2YucHVzaChjKSxuLmZvckVhY2goYyxmdW5jdGlvbihoLEQpeyghKG4uaXNVbmRlZmluZWQoaCl8fGg9PT1udWxsKSYmSS5jYWxsKHQsaCxuLmlzU3RyaW5nKEQpP0QudHJpbSgpOkQsRSxhKSk9PT0hMCYmbChoLEU/RS5jb25jYXQoRCk6W0RdLHUrMSl9KSxmLnBvcCgpfX1pZighbi5pc09iamVjdChBKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIGwoQSksdH12YXIgWj1DSTtmdW5jdGlvbiBDZShBKXtsZXQgdD17IiEiOiIlMjUyMSIsIlwnIjoiJTI1MjciLCIoIjoiJTI1MjgiLCIpIjoiJTI1MjkiLCJ+IjoiJTI1N0UiLCIlMjUyMCI6IisifTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoL1shXCcoKX5dfCUyNTIwL2csZnVuY3Rpb24ocil7cmV0dXJuIHRbcl19KX1mdW5jdGlvbiBCZShBLHQpe3RoaXMuX3BhaXJzPVtdLEEmJlooQSx0aGlzLHQpfXZhciBRZT1CZS5wcm90b3R5cGU7UWUuYXBwZW5kPWZ1bmN0aW9uKHQsZSl7dGhpcy5fcGFpcnMucHVzaChbdCxlXSl9O1FlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe2xldCBlPXQ/ZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsbCh0aGlzLHIsQ2UpfTpDZTtyZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uKEkpe3JldHVybiBlKElbMF0pKyI9IitlKElbMV0pfSwiIikuam9pbigiJiIpfTt2YXIgV0E9QmU7ZnVuY3Rpb24gQkkoQSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChBKS5yZXBsYWNlKC8lMjUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNTI0L2csIiQiKS5yZXBsYWNlKC8lMjUyQy9naSwiLCIpLnJlcGxhY2UoLyUyNTIwL2csIisiKX1mdW5jdGlvbiBEQShBLHQsZSl7aWYoIXQpcmV0dXJuIEE7bGV0IHI9ZSYmZS5lbmNvZGV8fEJJLEk9bi5pc0Z1bmN0aW9uKGUpP3tzZXJpYWxpemU6ZX06ZSxvPUkmJkkuc2VyaWFsaXplLGk7aWYobz9pPW8odCxJKTppPW4uaXNVUkxTZWFyY2hQYXJhbXModCk/dC50b1N0cmluZygpOm5ldyBXQSh0LEkpLnRvU3RyaW5nKHIpLGkpe2xldCBnPUEuaW5kZXhPZigiJTIzIik7ZyE9PS0xJiYoQT1BLnNsaWNlKDAsZykpLEErPShBLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK2l9cmV0dXJuIEF9dmFyIGN0PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5oYW5kbGVycz1bXX11c2UodCxlLHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDp0LHJlamVjdGVkOmUsc3luY2hyb25vdXM6cj9yLnN5bmNocm9ub3VzOiExLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9ZWplY3QodCl7dGhpcy5oYW5kbGVyc1t0XSYmKHRoaXMuaGFuZGxlcnNbdF09bnVsbCl9Y2xlYXIoKXt0aGlzLmhhbmRsZXJzJiYodGhpcy5oYW5kbGVycz1bXSl9Zm9yRWFjaCh0KXtuLmZvckVhY2godGhpcy5oYW5kbGVycyxmdW5jdGlvbihyKXtyIT09bnVsbCYmdChyKX0pfX0sZnQ9Y3Q7dmFyIG5BPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExLGxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc6ITB9O3ZhciBFZT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1Ij9VUkxTZWFyY2hQYXJhbXM6V0E7dmFyIGNlPXR5cGVvZiBGb3JtRGF0YTwidSI/Rm9ybURhdGE6bnVsbDt2YXIgZmU9dHlwZW9mIEJsb2I8InUiP0Jsb2I6bnVsbDt2YXIgbGU9e2lzQnJvd3NlcjohMCxjbGFzc2VzOntVUkxTZWFyY2hQYXJhbXM6RWUsRm9ybURhdGE6Y2UsQmxvYjpmZX0scHJvdG9jb2xzOlsiaHR0cCIsImh0dHBzIiwiZmlsZSIsImJsb2IiLCJ1cmwiLCJkYXRhIl19O3ZhciBkdD17fTt6ZShkdCx7aGFzQnJvd3NlckVudjooKT0+dXQsaGFzU3RhbmRhcmRCcm93c2VyRW52OigpPT5RSSxoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6KCk9PkVJLG5hdmlnYXRvcjooKT0+bHQsb3JpZ2luOigpPT5jSX0pO3ZhciB1dD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixsdD10eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmbmF2aWdhdG9yfHx2b2lkIDAsUUk9dXQmJighbHR8fFsiUmVhY3ROYXRpdmUiLCJOYXRpdmVTY3JpcHQiLCJOUyJdLmluZGV4T2YobHQucHJvZHVjdCk8MCksRUk9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPCJ1IiYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZ0eXBlb2Ygc2VsZi5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iLGNJPXV0JiZ3aW5kb3cubG9jYXRpb24uaHJlZnx8Imh0dHA6Ly9sb2NhbGhvc3QiO3ZhciB3PXsuLi5kdCwuLi5sZX07ZnVuY3Rpb24gaHQoQSx0KXtyZXR1cm4gWihBLG5ldyB3LmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zLHt2aXNpdG9yOmZ1bmN0aW9uKGUscixJLG8pe3JldHVybiB3LmlzTm9kZSYmbi5pc0J1ZmZlcihlKT8odGhpcy5hcHBlbmQocixlLnRvU3RyaW5nKCJiYXNlNjQiKSksITEpOm8uZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwuLi50fSl9ZnVuY3Rpb24gZkkoQSl7cmV0dXJuIG4ubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLEEpLm1hcCh0PT50WzBdPT09IltdIj8iIjp0WzFdfHx0WzBdKX1mdW5jdGlvbiBsSShBKXtsZXQgdD17fSxlPU9iamVjdC5rZXlzKEEpLHIsST1lLmxlbmd0aCxvO2ZvcihyPTA7cjxJO3IrKylvPWVbcl0sdFtvXT1BW29dO3JldHVybiB0fWZ1bmN0aW9uIHVJKEEpe2Z1bmN0aW9uIHQoZSxyLEksbyl7bGV0IGk9ZVtvKytdO2lmKGk9PT0iX19wcm90b19fIilyZXR1cm4hMDtsZXQgZz1OdW1iZXIuaXNGaW5pdGUoK2kpLFE9bz49ZS5sZW5ndGg7cmV0dXJuIGk9IWkmJm4uaXNBcnJheShJKT9JLmxlbmd0aDppLFE/KG4uaGFzT3duUHJvcChJLGkpP0lbaV09bi5pc0FycmF5KElbaV0pP0lbaV0uY29uY2F0KHIpOltJW2ldLHJdOklbaV09ciwhZyk6KCghbi5oYXNPd25Qcm9wKEksaSl8fCFuLmlzT2JqZWN0KElbaV0pKSYmKElbaV09W10pLHQoZSxyLElbaV0sbykmJm4uaXNBcnJheShJW2ldKSYmKElbaV09bEkoSVtpXSkpLCFnKX1pZihuLmlzRm9ybURhdGEoQSkmJm4uaXNGdW5jdGlvbihBLmVudHJpZXMpKXtsZXQgZT17fTtyZXR1cm4gbi5mb3JFYWNoRW50cnkoQSwocixJKT0+e3QoZkkociksSSxlLDApfSksZX1yZXR1cm4gbnVsbH12YXIgWkE9dUk7dmFyIGdBPShBLHQpPT5BIT1udWxsJiZuLmhhc093blByb3AoQSx0KT9BW3RdOnZvaWQgMDtmdW5jdGlvbiBkSShBLHQsZSl7aWYobi5pc1N0cmluZyhBKSl0cnl7cmV0dXJuKHR8fEpTT04ucGFyc2UpKEEpLG4udHJpbShBKX1jYXRjaChyKXtpZihyLm5hbWUhPT0iU3ludGF4RXJyb3IiKXRocm93IHJ9cmV0dXJuKGV8fEpTT04uc3RyaW5naWZ5KShBKX12YXIgRHQ9e3RyYW5zaXRpb25hbDpuQSxhZGFwdGVyOlsieGhyIiwiaHR0cCIsImZldGNoIl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24odCxlKXtsZXQgcj1lLmdldENvbnRlbnRUeXBlKCl8fCIiLEk9ci5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEsbz1uLmlzT2JqZWN0KHQpO2lmKG8mJm4uaXNIVE1MRm9ybSh0KSYmKHQ9bmV3IEZvcm1EYXRhKHQpKSxuLmlzRm9ybURhdGEodCkpcmV0dXJuIEk/SlNPTi5zdHJpbmdpZnkoWkEodCkpOnQ7aWYobi5pc0FycmF5QnVmZmVyKHQpfHxuLmlzQnVmZmVyKHQpfHxuLmlzU3RyZWFtKHQpfHxuLmlzRmlsZSh0KXx8bi5pc0Jsb2IodCl8fG4uaXNSZWFkYWJsZVN0cmVhbSh0KSlyZXR1cm4gdDtpZihuLmlzQXJyYXlCdWZmZXJWaWV3KHQpKXJldHVybiB0LmJ1ZmZlcjtpZihuLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXJldHVybiBlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIsITEpLHQudG9TdHJpbmcoKTtsZXQgZztpZihvKXtsZXQgUT1nQSh0aGlzLCJmb3JtU2VyaWFsaXplciIpO2lmKHIuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik+LTEpcmV0dXJuIGh0KHQsUSkudG9TdHJpbmcoKTtpZigoZz1uLmlzRmlsZUxpc3QodCkpfHxyLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7bGV0IEM9Z0EodGhpcywiZW52Iikscz1DJiZDLkZvcm1EYXRhO3JldHVybiBaKGc/eyJmaWxlc1tdIjp0fTp0LHMmJm5ldyBzLFEpfX1yZXR1cm4gb3x8ST8oZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vanNvbiIsITEpLGRJKHQpKTp0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe2xldCBlPWdBKHRoaXMsInRyYW5zaXRpb25hbCIpfHxEdC50cmFuc2l0aW9uYWwscj1lJiZlLmZvcmNlZEpTT05QYXJzaW5nLEk9Z0EodGhpcywicmVzcG9uc2VUeXBlIiksbz1JPT09Impzb24iO2lmKG4uaXNSZXNwb25zZSh0KXx8bi5pc1JlYWRhYmxlU3RyZWFtKHQpKXJldHVybiB0O2lmKHQmJm4uaXNTdHJpbmcodCkmJihyJiYhSXx8bykpe2xldCBnPSEoZSYmZS5zaWxlbnRKU09OUGFyc2luZykmJm87dHJ5e3JldHVybiBKU09OLnBhcnNlKHQsZ0EodGhpcywicGFyc2VSZXZpdmVyIikpfWNhdGNoKFEpe2lmKGcpdGhyb3cgUS5uYW1lPT09IlN5bnRheEVycm9yIj9kLmZyb20oUSxkLkVSUl9CQURfUkVTUE9OU0UsdGhpcyxudWxsLGdBKHRoaXMsInJlc3BvbnNlIikpOlF9fXJldHVybiB0fV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTp3LmNsYXNzZXMuRm9ybURhdGEsQmxvYjp3LmNsYXNzZXMuQmxvYn0sdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PTIwMCYmdDwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOnZvaWQgMH19fTtuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwicXVlcnkiXSxBPT57RHQuaGVhZGVyc1tBXT17fX0pO3ZhciBzQT1EdDtmdW5jdGlvbiB5QShBLHQpe2xldCBlPXRoaXN8fHNBLHI9dHx8ZSxJPVMuZnJvbShyLmhlYWRlcnMpLG89ci5kYXRhO3JldHVybiBuLmZvckVhY2goQSxmdW5jdGlvbihnKXtvPWcuY2FsbChlLG8sSS5ub3JtYWxpemUoKSx0P3Quc3RhdHVzOnZvaWQgMCl9KSxJLm5vcm1hbGl6ZSgpLG99ZnVuY3Rpb24gcEEoQSl7cmV0dXJuISEoQSYmQS5fX0NBTkNFTF9fKX12YXIgeXQ9Y2xhc3MgZXh0ZW5kcyBke2NvbnN0cnVjdG9yKHQsZSxyKXtzdXBlcih0Pz8iY2FuY2VsZWQiLGQuRVJSX0NBTkNFTEVELGUsciksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIix0aGlzLl9fQ0FOQ0VMX189ITB9fSxUPXl0O2Z1bmN0aW9uIG1BKEEsdCxlKXtsZXQgcj1lLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshZS5zdGF0dXN8fCFyfHxyKGUuc3RhdHVzKT9BKGUpOnQobmV3IGQoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIitlLnN0YXR1cyxlLnN0YXR1cz49NDAwJiZlLnN0YXR1czw1MDA/ZC5FUlJfQkFEX1JFUVVFU1Q6ZC5FUlJfQkFEX1JFU1BPTlNFLGUuY29uZmlnLGUucmVxdWVzdCxlKSl9ZnVuY3Rpb24gcHQoQSl7bGV0IHQ9L14oWy0rXFx3XXsxLDI1fSk6KD86XFwvXFwvKT8vLmV4ZWMoQSk7cmV0dXJuIHQmJnRbMV18fCIifWZ1bmN0aW9uIGhJKEEsdCl7QT1BfHwxMDtsZXQgZT1uZXcgQXJyYXkoQSkscj1uZXcgQXJyYXkoQSksST0wLG89MCxpO3JldHVybiB0PXQhPT12b2lkIDA/dDoxZTMsZnVuY3Rpb24oUSl7bGV0IEM9RGF0ZS5ub3coKSxzPXJbb107aXx8KGk9QyksZVtJXT1RLHJbSV09QztsZXQgQj1vLGY9MDtmb3IoO0IhPT1JOylmKz1lW0IrK10sQj1CJUE7aWYoST0oSSsxKSVBLEk9PT1vJiYobz0obysxKSVBKSxDLWk8dClyZXR1cm47bGV0IGE9cyYmQy1zO3JldHVybiBhP01hdGgucm91bmQoZioxZTMvYSk6dm9pZCAwfX12YXIgdWU9aEk7ZnVuY3Rpb24gREkoQSx0KXtsZXQgZT0wLHI9MWUzL3QsSSxvLGk9KEMscz1EYXRlLm5vdygpKT0+e2U9cyxJPW51bGwsbyYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLEEoLi4uQyl9O3JldHVyblsoLi4uQyk9PntsZXQgcz1EYXRlLm5vdygpLEI9cy1lO0I+PXI/aShDLHMpOihJPUMsb3x8KG89c2V0VGltZW91dCgoKT0+e289bnVsbCxpKEkpfSxyLUIpKSl9LCgpPT5JJiZpKEkpXX12YXIgZGU9REk7dmFyIGFBPShBLHQsZT0zKT0+e2xldCByPTAsST11ZSg1MCwyNTApO3JldHVybiBkZShvPT57aWYoIW98fHR5cGVvZiBvLmxvYWRlZCE9Im51bWJlciIpcmV0dXJuO2xldCBpPW8ubG9hZGVkLGc9by5sZW5ndGhDb21wdXRhYmxlP28udG90YWw6dm9pZCAwLFE9ZyE9bnVsbD9NYXRoLm1pbihpLGcpOmksQz1NYXRoLm1heCgwLFEtcikscz1JKEMpO3I9TWF0aC5tYXgocixRKTtsZXQgQj17bG9hZGVkOlEsdG90YWw6Zyxwcm9ncmVzczpnP1EvZzp2b2lkIDAsYnl0ZXM6QyxyYXRlOnN8fHZvaWQgMCxlc3RpbWF0ZWQ6cyYmZz8oZy1RKS9zOnZvaWQgMCxldmVudDpvLGxlbmd0aENvbXB1dGFibGU6ZyE9bnVsbCxbdD8iZG93bmxvYWQiOiJ1cGxvYWQiXTohMH07QShCKX0sZSl9LG10PShBLHQpPT57bGV0IGU9QSE9bnVsbDtyZXR1cm5bcj0+dFswXSh7bGVuZ3RoQ29tcHV0YWJsZTplLHRvdGFsOkEsbG9hZGVkOnJ9KSx0WzFdXX0sd3Q9QT0+KC4uLnQpPT5uLmFzYXAoKCk9PkEoLi4udCkpO3ZhciBoZT13Lmhhc1N0YW5kYXJkQnJvd3NlckVudj8oKEEsdCk9PmU9PihlPW5ldyBVUkwoZSx3Lm9yaWdpbiksQS5wcm90b2NvbD09PWUucHJvdG9jb2wmJkEuaG9zdD09PWUuaG9zdCYmKHR8fEEucG9ydD09PWUucG9ydCkpKShuZXcgVVJMKHcub3JpZ2luKSx3Lm5hdmlnYXRvciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdCh3Lm5hdmlnYXRvci51c2VyQWdlbnQpKTooKT0+ITA7dmFyIERlPXcuaGFzU3RhbmRhcmRCcm93c2VyRW52P3t3cml0ZShBLHQsZSxyLEksbyxpKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybjtsZXQgZz1bYCR7QX09JHtlbmNvZGVVUklDb21wb25lbnQodCl9YF07bi5pc051bWJlcihlKSYmZy5wdXNoKGBleHBpcmVzPSR7bmV3IERhdGUoZSkudG9VVENTdHJpbmcoKX1gKSxuLmlzU3RyaW5nKHIpJiZnLnB1c2goYHBhdGg9JHtyfWApLG4uaXNTdHJpbmcoSSkmJmcucHVzaChgZG9tYWluPSR7SX1gKSxvPT09ITAmJmcucHVzaCgic2VjdXJlIiksbi5pc1N0cmluZyhpKSYmZy5wdXNoKGBTYW1lU2l0ZT0ke2l9YCksZG9jdW1lbnQuY29va2llPWcuam9pbigiOyAiKX0scmVhZChBKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBudWxsO2xldCB0PWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgcj10W2VdLnJlcGxhY2UoL15cXHMrLywiIiksST1yLmluZGV4T2YoIj0iKTtpZihJIT09LTEmJnIuc2xpY2UoMCxJKT09PUEpcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyLnNsaWNlKEkrMSkpfXJldHVybiBudWxsfSxyZW1vdmUoQSl7dGhpcy53cml0ZShBLCIiLERhdGUubm93KCktODY0ZTUsIi8iKX19Ont3cml0ZSgpe30scmVhZCgpe3JldHVybiBudWxsfSxyZW1vdmUoKXt9fTtmdW5jdGlvbiBTdChBKXtyZXR1cm4gdHlwZW9mIEEhPSJzdHJpbmciPyExOi9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KEEpfWZ1bmN0aW9uIFJ0KEEsdCl7cmV0dXJuIHQ/QS5yZXBsYWNlKC9cXC8/XFwvJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cXC8rLywiIik6QX1mdW5jdGlvbiB3QShBLHQsZSl7bGV0IHI9IVN0KHQpO3JldHVybiBBJiYocnx8ZT09PSExKT9SdChBLHQpOnR9dmFyIHllPUE9PkEgaW5zdGFuY2VvZiBTP3suLi5BfTpBO2Z1bmN0aW9uIFkoQSx0KXt0PXR8fHt9O2xldCBlPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImhhc093blByb3BlcnR5Iix7X19wcm90b19fOm51bGwsdmFsdWU6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIHIoQyxzLEIsZil7cmV0dXJuIG4uaXNQbGFpbk9iamVjdChDKSYmbi5pc1BsYWluT2JqZWN0KHMpP24ubWVyZ2UuY2FsbCh7Y2FzZWxlc3M6Zn0sQyxzKTpuLmlzUGxhaW5PYmplY3Qocyk/bi5tZXJnZSh7fSxzKTpuLmlzQXJyYXkocyk/cy5zbGljZSgpOnN9ZnVuY3Rpb24gSShDLHMsQixmKXtpZihuLmlzVW5kZWZpbmVkKHMpKXtpZighbi5pc1VuZGVmaW5lZChDKSlyZXR1cm4gcih2b2lkIDAsQyxCLGYpfWVsc2UgcmV0dXJuIHIoQyxzLEIsZil9ZnVuY3Rpb24gbyhDLHMpe2lmKCFuLmlzVW5kZWZpbmVkKHMpKXJldHVybiByKHZvaWQgMCxzKX1mdW5jdGlvbiBpKEMscyl7aWYobi5pc1VuZGVmaW5lZChzKSl7aWYoIW4uaXNVbmRlZmluZWQoQykpcmV0dXJuIHIodm9pZCAwLEMpfWVsc2UgcmV0dXJuIHIodm9pZCAwLHMpfWZ1bmN0aW9uIGcoQyxzLEIpe2lmKG4uaGFzT3duUHJvcCh0LEIpKXJldHVybiByKEMscyk7aWYobi5oYXNPd25Qcm9wKEEsQikpcmV0dXJuIHIodm9pZCAwLEMpfWxldCBRPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDppLHRyYW5zZm9ybVJlcXVlc3Q6aSx0cmFuc2Zvcm1SZXNwb25zZTppLHBhcmFtc1NlcmlhbGl6ZXI6aSx0aW1lb3V0OmksdGltZW91dE1lc3NhZ2U6aSx3aXRoQ3JlZGVudGlhbHM6aSx3aXRoWFNSRlRva2VuOmksYWRhcHRlcjppLHJlc3BvbnNlVHlwZTppLHhzcmZDb29raWVOYW1lOmkseHNyZkhlYWRlck5hbWU6aSxvblVwbG9hZFByb2dyZXNzOmksb25Eb3dubG9hZFByb2dyZXNzOmksZGVjb21wcmVzczppLG1heENvbnRlbnRMZW5ndGg6aSxtYXhCb2R5TGVuZ3RoOmksYmVmb3JlUmVkaXJlY3Q6aSx0cmFuc3BvcnQ6aSxodHRwQWdlbnQ6aSxodHRwc0FnZW50OmksY2FuY2VsVG9rZW46aSxzb2NrZXRQYXRoOmksYWxsb3dlZFNvY2tldFBhdGhzOmkscmVzcG9uc2VFbmNvZGluZzppLHZhbGlkYXRlU3RhdHVzOmcsaGVhZGVyczooQyxzLEIpPT5JKHllKEMpLHllKHMpLEIsITApfTtyZXR1cm4gbi5mb3JFYWNoKE9iamVjdC5rZXlzKHsuLi5BLC4uLnR9KSxmdW5jdGlvbihzKXtpZihzPT09Il9fcHJvdG9fXyJ8fHM9PT0iY29uc3RydWN0b3IifHxzPT09InByb3RvdHlwZSIpcmV0dXJuO2xldCBCPW4uaGFzT3duUHJvcChRLHMpP1Fbc106SSxmPW4uaGFzT3duUHJvcChBLHMpP0Fbc106dm9pZCAwLGE9bi5oYXNPd25Qcm9wKHQscyk/dFtzXTp2b2lkIDAsbD1CKGYsYSxzKTtuLmlzVW5kZWZpbmVkKGwpJiZCIT09Z3x8KGVbc109bCl9KSxlfXZhciB5ST1bImNvbnRlbnQtdHlwZSIsImNvbnRlbnQtbGVuZ3RoIl07ZnVuY3Rpb24gcEkoQSx0LGUpe2lmKGUhPT0iY29udGVudC1vbmx5Iil7QS5zZXQodCk7cmV0dXJufU9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKFtyLEldKT0+e3lJLmluY2x1ZGVzKHIudG9Mb3dlckNhc2UoKSkmJkEuc2V0KHIsSSl9KX12YXIgbUk9QT0+ZW5jb2RlVVJJQ29tcG9uZW50KEEpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2dpLCh0LGUpPT5TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGUsMTYpKSksVkE9QT0+e2xldCB0PVkoe30sQSksZT1mPT5uLmhhc093blByb3AodCxmKT90W2ZdOnZvaWQgMCxyPWUoImRhdGEiKSxJPWUoIndpdGhYU1JGVG9rZW4iKSxvPWUoInhzcmZIZWFkZXJOYW1lIiksaT1lKCJ4c3JmQ29va2llTmFtZSIpLGc9ZSgiaGVhZGVycyIpLFE9ZSgiYXV0aCIpLEM9ZSgiYmFzZVVSTCIpLHM9ZSgiYWxsb3dBYnNvbHV0ZVVybHMiKSxCPWUoInVybCIpO2lmKHQuaGVhZGVycz1nPVMuZnJvbShnKSx0LnVybD1EQSh3QShDLEIscyksQS5wYXJhbXMsQS5wYXJhbXNTZXJpYWxpemVyKSxRJiZnLnNldCgiQXV0aG9yaXphdGlvbiIsIkJhc2ljICIrYnRvYSgoUS51c2VybmFtZXx8IiIpKyI6IisoUS5wYXNzd29yZD9tSShRLnBhc3N3b3JkKToiIikpKSxuLmlzRm9ybURhdGEocikmJih3Lmhhc1N0YW5kYXJkQnJvd3NlckVudnx8dy5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY/Zy5zZXRDb250ZW50VHlwZSh2b2lkIDApOm4uaXNGdW5jdGlvbihyLmdldEhlYWRlcnMpJiZwSShnLHIuZ2V0SGVhZGVycygpLGUoImZvcm1EYXRhSGVhZGVyUG9saWN5IikpKSx3Lmhhc1N0YW5kYXJkQnJvd3NlckVudiYmKG4uaXNGdW5jdGlvbihJKSYmKEk9SSh0KSksST09PSEwfHxJPT1udWxsJiZoZSh0LnVybCkpKXtsZXQgYT1vJiZpJiZEZS5yZWFkKGkpO2EmJmcuc2V0KG8sYSl9cmV0dXJuIHR9O3ZhciB3ST10eXBlb2YgWE1MSHR0cFJlcXVlc3Q8InUiLHBlPXdJJiZmdW5jdGlvbihBKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSxyKXtsZXQgST1WQShBKSxvPUkuZGF0YSxpPVMuZnJvbShJLmhlYWRlcnMpLm5vcm1hbGl6ZSgpLHtyZXNwb25zZVR5cGU6ZyxvblVwbG9hZFByb2dyZXNzOlEsb25Eb3dubG9hZFByb2dyZXNzOkN9PUkscyxCLGYsYSxsO2Z1bmN0aW9uIGMoKXthJiZhKCksbCYmbCgpLEkuY2FuY2VsVG9rZW4mJkkuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUocyksSS5zaWduYWwmJkkuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixzKX1sZXQgRT1uZXcgWE1MSHR0cFJlcXVlc3Q7RS5vcGVuKEkubWV0aG9kLnRvVXBwZXJDYXNlKCksSS51cmwsITApLEUudGltZW91dD1JLnRpbWVvdXQ7ZnVuY3Rpb24gdSgpe2lmKCFFKXJldHVybjtsZXQgaD1TLmZyb20oImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBFJiZFLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxiPXtkYXRhOiFnfHxnPT09InRleHQifHxnPT09Impzb24iP0UucmVzcG9uc2VUZXh0OkUucmVzcG9uc2Usc3RhdHVzOkUuc3RhdHVzLHN0YXR1c1RleHQ6RS5zdGF0dXNUZXh0LGhlYWRlcnM6aCxjb25maWc6QSxyZXF1ZXN0OkV9O21BKGZ1bmN0aW9uKFFBKXtlKFFBKSxjKCl9LGZ1bmN0aW9uKFFBKXtyKFFBKSxjKCl9LGIpLEU9bnVsbH0ib25sb2FkZW5kImluIEU/RS5vbmxvYWRlbmQ9dTpFLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFFfHxFLnJlYWR5U3RhdGUhPT00fHxFLnN0YXR1cz09PTAmJiEoRS5yZXNwb25zZVVSTCYmRS5yZXNwb25zZVVSTC5zdGFydHNXaXRoKCJmaWxlOiIpKXx8c2V0VGltZW91dCh1KX0sRS5vbmFib3J0PWZ1bmN0aW9uKCl7RSYmKHIobmV3IGQoIlJlcXVlc3QgYWJvcnRlZCIsZC5FQ09OTkFCT1JURUQsQSxFKSksYygpLEU9bnVsbCl9LEUub25lcnJvcj1mdW5jdGlvbihEKXtsZXQgYj1EJiZELm1lc3NhZ2U/RC5tZXNzYWdlOiJOZXR3b3JrIEVycm9yIix6PW5ldyBkKGIsZC5FUlJfTkVUV09SSyxBLEUpO3ouZXZlbnQ9RHx8bnVsbCxyKHopLGMoKSxFPW51bGx9LEUub250aW1lb3V0PWZ1bmN0aW9uKCl7bGV0IEQ9SS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrSS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLGI9SS50cmFuc2l0aW9uYWx8fG5BO0kudGltZW91dEVycm9yTWVzc2FnZSYmKEQ9SS50aW1lb3V0RXJyb3JNZXNzYWdlKSxyKG5ldyBkKEQsYi5jbGFyaWZ5VGltZW91dEVycm9yP2QuRVRJTUVET1VUOmQuRUNPTk5BQk9SVEVELEEsRSkpLGMoKSxFPW51bGx9LG89PT12b2lkIDAmJmkuc2V0Q29udGVudFR5cGUobnVsbCksInNldFJlcXVlc3RIZWFkZXIiaW4gRSYmbi5mb3JFYWNoKFBBKGkpLGZ1bmN0aW9uKEQsYil7RS5zZXRSZXF1ZXN0SGVhZGVyKGIsRCl9KSxuLmlzVW5kZWZpbmVkKEkud2l0aENyZWRlbnRpYWxzKXx8KEUud2l0aENyZWRlbnRpYWxzPSEhSS53aXRoQ3JlZGVudGlhbHMpLGcmJmchPT0ianNvbiImJihFLnJlc3BvbnNlVHlwZT1JLnJlc3BvbnNlVHlwZSksQyYmKFtmLGxdPWFBKEMsITApLEUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGYpKSxRJiZFLnVwbG9hZCYmKFtCLGFdPWFBKFEpLEUudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixCKSxFLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZW5kIixhKSksKEkuY2FuY2VsVG9rZW58fEkuc2lnbmFsKSYmKHM9aD0+e0UmJihyKCFofHxoLnR5cGU/bmV3IFQobnVsbCxBLEUpOmgpLEUuYWJvcnQoKSxjKCksRT1udWxsKX0sSS5jYW5jZWxUb2tlbiYmSS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUocyksSS5zaWduYWwmJihJLnNpZ25hbC5hYm9ydGVkP3MoKTpJLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIscykpKTtsZXQgeT1wdChJLnVybCk7aWYoeSYmIXcucHJvdG9jb2xzLmluY2x1ZGVzKHkpKXtyKG5ldyBkKCJVbnN1cHBvcnRlZCBwcm90b2NvbCAiK3krIjoiLGQuRVJSX0JBRF9SRVFVRVNULEEpKTtyZXR1cm59RS5zZW5kKG98fG51bGwpfSl9O3ZhciBTST0oQSx0KT0+e2lmKEE9QT9BLmZpbHRlcihCb29sZWFuKTpbXSwhdCYmIUEubGVuZ3RoKXJldHVybjtsZXQgZT1uZXcgQWJvcnRDb250cm9sbGVyLHI9ITEsST1mdW5jdGlvbihRKXtpZighcil7cj0hMCxpKCk7bGV0IEM9USBpbnN0YW5jZW9mIEVycm9yP1E6dGhpcy5yZWFzb247ZS5hYm9ydChDIGluc3RhbmNlb2YgZD9DOm5ldyBUKEMgaW5zdGFuY2VvZiBFcnJvcj9DLm1lc3NhZ2U6QykpfX0sbz10JiZzZXRUaW1lb3V0KCgpPT57bz1udWxsLEkobmV3IGQoYHRpbWVvdXQgb2YgJHt0fW1zIGV4Y2VlZGVkYCxkLkVUSU1FRE9VVCkpfSx0KSxpPSgpPT57QSYmKG8mJmNsZWFyVGltZW91dChvKSxvPW51bGwsQS5mb3JFYWNoKFE9PntRLnVuc3Vic2NyaWJlP1EudW5zdWJzY3JpYmUoSSk6US5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsSSl9KSxBPW51bGwpfTtBLmZvckVhY2goUT0+US5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsSSkpO2xldHtzaWduYWw6Z309ZTtyZXR1cm4gZy51bnN1YnNjcmliZT0oKT0+bi5hc2FwKGkpLGd9LG1lPVNJO3ZhciBSST1mdW5jdGlvbiooQSx0KXtsZXQgZT1BLmJ5dGVMZW5ndGg7aWYoIXR8fGU8dCl7eWllbGQgQTtyZXR1cm59bGV0IHI9MCxJO2Zvcig7cjxlOylJPXIrdCx5aWVsZCBBLnNsaWNlKHIsSSkscj1JfSxGST1hc3luYyBmdW5jdGlvbiooQSx0KXtmb3IgYXdhaXQobGV0IGUgb2YgTkkoQSkpeWllbGQqUkkoZSx0KX0sTkk9YXN5bmMgZnVuY3Rpb24qKEEpe2lmKEFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKXt5aWVsZCpBO3JldHVybn1sZXQgdD1BLmdldFJlYWRlcigpO3RyeXtmb3IoOzspe2xldHtkb25lOmUsdmFsdWU6cn09YXdhaXQgdC5yZWFkKCk7aWYoZSlicmVhazt5aWVsZCByfX1maW5hbGx5e2F3YWl0IHQuY2FuY2VsKCl9fSxGdD0oQSx0LGUscik9PntsZXQgST1GSShBLHQpLG89MCxpLGc9UT0+e2l8fChpPSEwLHImJnIoUSkpfTtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHthc3luYyBwdWxsKFEpe3RyeXtsZXR7ZG9uZTpDLHZhbHVlOnN9PWF3YWl0IEkubmV4dCgpO2lmKEMpe2coKSxRLmNsb3NlKCk7cmV0dXJufWxldCBCPXMuYnl0ZUxlbmd0aDtpZihlKXtsZXQgZj1vKz1CO2UoZil9US5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHMpKX1jYXRjaChDKXt0aHJvdyBnKEMpLEN9fSxjYW5jZWwoUSl7cmV0dXJuIGcoUSksSS5yZXR1cm4oKX19LHtoaWdoV2F0ZXJNYXJrOjJ9KX07ZnVuY3Rpb24gTnQoQSl7aWYoIUF8fHR5cGVvZiBBIT0ic3RyaW5nInx8IUEuc3RhcnRzV2l0aCgiZGF0YToiKSlyZXR1cm4gMDtsZXQgdD1BLmluZGV4T2YoIiwiKTtpZih0PDApcmV0dXJuIDA7bGV0IGU9QS5zbGljZSg1LHQpLHI9QS5zbGljZSh0KzEpO2lmKC87YmFzZTY0L2kudGVzdChlKSl7bGV0IGk9ci5sZW5ndGgsZz1yLmxlbmd0aDtmb3IobGV0IGE9MDthPGc7YSsrKWlmKHIuY2hhckNvZGVBdChhKT09PTM3JiZhKzI8Zyl7bGV0IGw9ci5jaGFyQ29kZUF0KGErMSksYz1yLmNoYXJDb2RlQXQoYSsyKTsobD49NDgmJmw8PTU3fHxsPj02NSYmbDw9NzB8fGw+PTk3JiZsPD0xMDIpJiYoYz49NDgmJmM8PTU3fHxjPj02NSYmYzw9NzB8fGM+PTk3JiZjPD0xMDIpJiYoaS09MixhKz0yKX1sZXQgUT0wLEM9Zy0xLHM9YT0+YT49MiYmci5jaGFyQ29kZUF0KGEtMik9PT0zNyYmci5jaGFyQ29kZUF0KGEtMSk9PT01MSYmKHIuY2hhckNvZGVBdChhKT09PTY4fHxyLmNoYXJDb2RlQXQoYSk9PT0xMDApO0M+PTAmJihyLmNoYXJDb2RlQXQoQyk9PT02MT8oUSsrLEMtLSk6cyhDKSYmKFErKyxDLT0zKSksUT09PTEmJkM+PTAmJihyLmNoYXJDb2RlQXQoQyk9PT02MXx8cyhDKSkmJlErKztsZXQgZj1NYXRoLmZsb29yKGkvNCkqMy0oUXx8MCk7cmV0dXJuIGY+MD9mOjB9aWYodHlwZW9mIEJ1ZmZlcjwidSImJnR5cGVvZiBCdWZmZXIuYnl0ZUxlbmd0aD09ImZ1bmN0aW9uIilyZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgociwidXRmOCIpO2xldCBvPTA7Zm9yKGxldCBpPTAsZz1yLmxlbmd0aDtpPGc7aSsrKXtsZXQgUT1yLmNoYXJDb2RlQXQoaSk7aWYoUTwxMjgpbys9MTtlbHNlIGlmKFE8MjA0OClvKz0yO2Vsc2UgaWYoUT49NTUyOTYmJlE8PTU2MzE5JiZpKzE8Zyl7bGV0IEM9ci5jaGFyQ29kZUF0KGkrMSk7Qz49NTYzMjAmJkM8PTU3MzQzPyhvKz00LGkrKyk6bys9M31lbHNlIG8rPTN9cmV0dXJuIG99dmFyIENBPSIxLjE2LjEiO3ZhciB3ZT02NCoxMDI0LHtpc0Z1bmN0aW9uOnpBfT1uLFNlPShBLC4uLnQpPT57dHJ5e3JldHVybiEhQSguLi50KX1jYXRjaHtyZXR1cm4hMX19LFVJPUE9PntsZXQgdD1uLmdsb2JhbCE9PXZvaWQgMCYmbi5nbG9iYWwhPT1udWxsP24uZ2xvYmFsOmdsb2JhbFRoaXMse1JlYWRhYmxlU3RyZWFtOmUsVGV4dEVuY29kZXI6cn09dDtBPW4ubWVyZ2UuY2FsbCh7c2tpcFVuZGVmaW5lZDohMH0se1JlcXVlc3Q6dC5SZXF1ZXN0LFJlc3BvbnNlOnQuUmVzcG9uc2V9LEEpO2xldHtmZXRjaDpJLFJlcXVlc3Q6byxSZXNwb25zZTppfT1BLGc9ST96QShJKTp0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiIsUT16QShvKSxDPXpBKGkpO2lmKCFnKXJldHVybiExO2xldCBzPWcmJnpBKGUpLEI9ZyYmKHR5cGVvZiByPT0iZnVuY3Rpb24iPyh1PT55PT51LmVuY29kZSh5KSkobmV3IHIpOmFzeW5jIHU9Pm5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBvKHUpLmFycmF5QnVmZmVyKCkpKSxmPVEmJnMmJlNlKCgpPT57bGV0IHU9ITEseT1uZXcgbyh3Lm9yaWdpbix7Ym9keTpuZXcgZSxtZXRob2Q6IlBPU1QiLGdldCBkdXBsZXgoKXtyZXR1cm4gdT0hMCwiaGFsZiJ9fSksaD15LmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKTtyZXR1cm4geS5ib2R5IT1udWxsJiZ5LmJvZHkuY2FuY2VsKCksdSYmIWh9KSxhPUMmJnMmJlNlKCgpPT5uLmlzUmVhZGFibGVTdHJlYW0obmV3IGkoIiIpLmJvZHkpKSxsPXtzdHJlYW06YSYmKHU9PnUuYm9keSl9O2cmJlsidGV4dCIsImFycmF5QnVmZmVyIiwiYmxvYiIsImZvcm1EYXRhIiwic3RyZWFtIl0uZm9yRWFjaCh1PT57IWxbdV0mJihsW3VdPSh5LGgpPT57bGV0IEQ9eSYmeVt1XTtpZihEKXJldHVybiBELmNhbGwoeSk7dGhyb3cgbmV3IGQoYFJlc3BvbnNlIHR5cGUgXCcke3V9XCcgaXMgbm90IHN1cHBvcnRlZGAsZC5FUlJfTk9UX1NVUFBPUlQsaCl9KX0pO2xldCBjPWFzeW5jIHU9PntpZih1PT1udWxsKXJldHVybiAwO2lmKG4uaXNCbG9iKHUpKXJldHVybiB1LnNpemU7aWYobi5pc1NwZWNDb21wbGlhbnRGb3JtKHUpKXJldHVybihhd2FpdCBuZXcgbyh3Lm9yaWdpbix7bWV0aG9kOiJQT1NUIixib2R5OnV9KS5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO2lmKG4uaXNBcnJheUJ1ZmZlclZpZXcodSl8fG4uaXNBcnJheUJ1ZmZlcih1KSlyZXR1cm4gdS5ieXRlTGVuZ3RoO2lmKG4uaXNVUkxTZWFyY2hQYXJhbXModSkmJih1PXUrIiIpLG4uaXNTdHJpbmcodSkpcmV0dXJuKGF3YWl0IEIodSkpLmJ5dGVMZW5ndGh9LEU9YXN5bmModSx5KT0+e2xldCBoPW4udG9GaW5pdGVOdW1iZXIodS5nZXRDb250ZW50TGVuZ3RoKCkpO3JldHVybiBoPz9jKHkpfTtyZXR1cm4gYXN5bmMgdT0+e2xldHt1cmw6eSxtZXRob2Q6aCxkYXRhOkQsc2lnbmFsOmIsY2FuY2VsVG9rZW46eix0aW1lb3V0OlFBLG9uRG93bmxvYWRQcm9ncmVzczpydCxvblVwbG9hZFByb2dyZXNzOnF0LHJlc3BvbnNlVHlwZTpfLGhlYWRlcnM6WCx3aXRoQ3JlZGVudGlhbHM6VUE9InNhbWUtb3JpZ2luIixmZXRjaE9wdGlvbnM6TXQsbWF4Q29udGVudExlbmd0aDpxLG1heEJvZHlMZW5ndGg6SXR9PVZBKHUpLEVBPW4uaXNOdW1iZXIocSkmJnE+LTEsV2U9bi5pc051bWJlcihJdCkmJkl0Pi0xLFR0PUl8fGZldGNoO189Xz8oXysiIikudG9Mb3dlckNhc2UoKToidGV4dCI7bGV0IGo9bWUoW2IseiYmei50b0Fib3J0U2lnbmFsKCldLFFBKSxKPW51bGwsdj1qJiZqLnVuc3Vic2NyaWJlJiYoKCk9PntqLnVuc3Vic2NyaWJlKCl9KSx4dDt0cnl7aWYoRUEmJnR5cGVvZiB5PT0ic3RyaW5nIiYmeS5zdGFydHNXaXRoKCJkYXRhOiIpJiZOdCh5KT5xKXRocm93IG5ldyBkKCJtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgIitxKyIgZXhjZWVkZWQiLGQuRVJSX0JBRF9SRVNQT05TRSx1LEopO2lmKFdlJiZoIT09ImdldCImJmghPT0iaGVhZCIpe2xldCBtPWF3YWl0IEUoWCxEKTtpZih0eXBlb2YgbT09Im51bWJlciImJmlzRmluaXRlKG0pJiZtPkl0KXRocm93IG5ldyBkKCJSZXF1ZXN0IGJvZHkgbGFyZ2VyIHRoYW4gbWF4Qm9keUxlbmd0aCBsaW1pdCIsZC5FUlJfQkFEX1JFUVVFU1QsdSxKKX1pZihxdCYmZiYmaCE9PSJnZXQiJiZoIT09ImhlYWQiJiYoeHQ9YXdhaXQgRShYLEQpKSE9PTApe2xldCBtPW5ldyBvKHkse21ldGhvZDoiUE9TVCIsYm9keTpELGR1cGxleDoiaGFsZiJ9KSxlQTtpZihuLmlzRm9ybURhdGEoRCkmJihlQT1tLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKSkmJlguc2V0Q29udGVudFR5cGUoZUEpLG0uYm9keSl7bGV0W0dBLGtBXT1tdCh4dCxhQSh3dChxdCkpKTtEPUZ0KG0uYm9keSx3ZSxHQSxrQSl9fW4uaXNTdHJpbmcoVUEpfHwoVUE9VUE/ImluY2x1ZGUiOiJvbWl0Iik7bGV0IEc9USYmImNyZWRlbnRpYWxzImluIG8ucHJvdG90eXBlO2lmKG4uaXNGb3JtRGF0YShEKSl7bGV0IG09WC5nZXRDb250ZW50VHlwZSgpO20mJi9ebXVsdGlwYXJ0XFwvZm9ybS1kYXRhL2kudGVzdChtKSYmIS9ib3VuZGFyeT0vaS50ZXN0KG0pJiZYLmRlbGV0ZSgiY29udGVudC10eXBlIil9WC5zZXQoIlVzZXItQWdlbnQiLCJheGlvcy8iK0NBLCExKTtsZXQgVz17Li4uTXQsc2lnbmFsOmosbWV0aG9kOmgudG9VcHBlckNhc2UoKSxoZWFkZXJzOlBBKFgubm9ybWFsaXplKCkpLGJvZHk6RCxkdXBsZXg6ImhhbGYiLGNyZWRlbnRpYWxzOkc/VUE6dm9pZCAwfTtKPVEmJm5ldyBvKHksVyk7bGV0IE09YXdhaXQoUT9UdChKLE10KTpUdCh5LFcpKTtpZihFQSl7bGV0IG09bi50b0Zpbml0ZU51bWJlcihNLmhlYWRlcnMuZ2V0KCJjb250ZW50LWxlbmd0aCIpKTtpZihtIT1udWxsJiZtPnEpdGhyb3cgbmV3IGQoIm1heENvbnRlbnRMZW5ndGggc2l6ZSBvZiAiK3ErIiBleGNlZWRlZCIsZC5FUlJfQkFEX1JFU1BPTlNFLHUsSil9bGV0IG90PWEmJihfPT09InN0cmVhbSJ8fF89PT0icmVzcG9uc2UiKTtpZihhJiZNLmJvZHkmJihydHx8RUF8fG90JiZ2KSl7bGV0IG09e307WyJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiaGVhZGVycyJdLmZvckVhY2goY0E9PnttW2NBXT1NW2NBXX0pO2xldCBlQT1uLnRvRmluaXRlTnVtYmVyKE0uaGVhZGVycy5nZXQoImNvbnRlbnQtbGVuZ3RoIikpLFtHQSxrQV09cnQmJm10KGVBLGFBKHd0KHJ0KSwhMCkpfHxbXSxLdD0wLFplPWNBPT57aWYoRUEmJihLdD1jQSxLdD5xKSl0aHJvdyBuZXcgZCgibWF4Q29udGVudExlbmd0aCBzaXplIG9mICIrcSsiIGV4Y2VlZGVkIixkLkVSUl9CQURfUkVTUE9OU0UsdSxKKTtHQSYmR0EoY0EpfTtNPW5ldyBpKEZ0KE0uYm9keSx3ZSxaZSwoKT0+e2tBJiZrQSgpLHYmJnYoKX0pLG0pfV89X3x8InRleHQiO2xldCBLPWF3YWl0IGxbbi5maW5kS2V5KGwsXyl8fCJ0ZXh0Il0oTSx1KTtpZihFQSYmIWEmJiFvdCl7bGV0IG07aWYoSyE9bnVsbCYmKHR5cGVvZiBLLmJ5dGVMZW5ndGg9PSJudW1iZXIiP209Sy5ieXRlTGVuZ3RoOnR5cGVvZiBLLnNpemU9PSJudW1iZXIiP209Sy5zaXplOnR5cGVvZiBLPT0ic3RyaW5nIiYmKG09dHlwZW9mIHI9PSJmdW5jdGlvbiI/bmV3IHIoKS5lbmNvZGUoSykuYnl0ZUxlbmd0aDpLLmxlbmd0aCkpLHR5cGVvZiBtPT0ibnVtYmVyIiYmbT5xKXRocm93IG5ldyBkKCJtYXhDb250ZW50TGVuZ3RoIHNpemUgb2YgIitxKyIgZXhjZWVkZWQiLGQuRVJSX0JBRF9SRVNQT05TRSx1LEopfXJldHVybiFvdCYmdiYmdigpLGF3YWl0IG5ldyBQcm9taXNlKChtLGVBKT0+e21BKG0sZUEse2RhdGE6SyxoZWFkZXJzOlMuZnJvbShNLmhlYWRlcnMpLHN0YXR1czpNLnN0YXR1cyxzdGF0dXNUZXh0Ok0uc3RhdHVzVGV4dCxjb25maWc6dSxyZXF1ZXN0Okp9KX0pfWNhdGNoKEcpe2lmKHYmJnYoKSxqJiZqLmFib3J0ZWQmJmoucmVhc29uIGluc3RhbmNlb2YgZCl7bGV0IFc9ai5yZWFzb247dGhyb3cgVy5jb25maWc9dSxKJiYoVy5yZXF1ZXN0PUopLEchPT1XJiYoVy5jYXVzZT1HKSxXfXRocm93IEcmJkcubmFtZT09PSJUeXBlRXJyb3IiJiYvTG9hZCBmYWlsZWR8ZmV0Y2gvaS50ZXN0KEcubWVzc2FnZSk/T2JqZWN0LmFzc2lnbihuZXcgZCgiTmV0d29yayBFcnJvciIsZC5FUlJfTkVUV09SSyx1LEosRyYmRy5yZXNwb25zZSkse2NhdXNlOkcuY2F1c2V8fEd9KTpkLmZyb20oRyxHJiZHLmNvZGUsdSxKLEcmJkcucmVzcG9uc2UpfX19LEdJPW5ldyBNYXAsVXQ9QT0+e2xldCB0PUEmJkEuZW52fHx7fSx7ZmV0Y2g6ZSxSZXF1ZXN0OnIsUmVzcG9uc2U6SX09dCxvPVtyLEksZV0saT1vLmxlbmd0aCxnPWksUSxDLHM9R0k7Zm9yKDtnLS07KVE9b1tnXSxDPXMuZ2V0KFEpLEM9PT12b2lkIDAmJnMuc2V0KFEsQz1nP25ldyBNYXA6VUkodCkpLHM9QztyZXR1cm4gQ30sUW49VXQoKTt2YXIgR3Q9e2h0dHA6akEseGhyOnBlLGZldGNoOntnZXQ6VXR9fTtuLmZvckVhY2goR3QsKEEsdCk9PntpZihBKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KEEsIm5hbWUiLHtfX3Byb3RvX186bnVsbCx2YWx1ZTp0fSl9Y2F0Y2h7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJhZGFwdGVyTmFtZSIse19fcHJvdG9fXzpudWxsLHZhbHVlOnR9KX19KTt2YXIgUmU9QT0+YC0gJHtBfWAsTEk9QT0+bi5pc0Z1bmN0aW9uKEEpfHxBPT09bnVsbHx8QT09PSExO2Z1bmN0aW9uIGJJKEEsdCl7QT1uLmlzQXJyYXkoQSk/QTpbQV07bGV0e2xlbmd0aDplfT1BLHIsSSxvPXt9O2ZvcihsZXQgaT0wO2k8ZTtpKyspe3I9QVtpXTtsZXQgZztpZihJPXIsIUxJKHIpJiYoST1HdFsoZz1TdHJpbmcocikpLnRvTG93ZXJDYXNlKCldLEk9PT12b2lkIDApKXRocm93IG5ldyBkKGBVbmtub3duIGFkYXB0ZXIgXCcke2d9XCdgKTtpZihJJiYobi5pc0Z1bmN0aW9uKEkpfHwoST1JLmdldCh0KSkpKWJyZWFrO29bZ3x8IiUyMyIraV09SX1pZighSSl7bGV0IGk9T2JqZWN0LmVudHJpZXMobykubWFwKChbUSxDXSk9PmBhZGFwdGVyICR7UX0gYCsoQz09PSExPyJpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCI6ImlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkIikpLGc9ZT9pLmxlbmd0aD4xP2BzaW5jZSA6JTBBYCtpLm1hcChSZSkuam9pbihgJTBBYCk6IiAiK1JlKGlbMF0pOiJhcyBubyBhZGFwdGVyIHNwZWNpZmllZCI7dGhyb3cgbmV3IGQoIlRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgIitnLCJFUlJfTk9UX1NVUFBPUlQiKX1yZXR1cm4gSX12YXIgWEE9e2dldEFkYXB0ZXI6YkksYWRhcHRlcnM6R3R9O2Z1bmN0aW9uIGt0KEEpe2lmKEEuY2FuY2VsVG9rZW4mJkEuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLEEuc2lnbmFsJiZBLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBUKG51bGwsQSl9ZnVuY3Rpb24gdkEoQSl7cmV0dXJuIGt0KEEpLEEuaGVhZGVycz1TLmZyb20oQS5oZWFkZXJzKSxBLmRhdGE9eUEuY2FsbChBLEEudHJhbnNmb3JtUmVxdWVzdCksWyJwb3N0IiwicHV0IiwicGF0Y2giXS5pbmRleE9mKEEubWV0aG9kKSE9PS0xJiZBLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsITEpLFhBLmdldEFkYXB0ZXIoQS5hZGFwdGVyfHxzQS5hZGFwdGVyLEEpKEEpLnRoZW4oZnVuY3Rpb24ocil7a3QoQSksQS5yZXNwb25zZT1yO3RyeXtyLmRhdGE9eUEuY2FsbChBLEEudHJhbnNmb3JtUmVzcG9uc2Uscil9ZmluYWxseXtkZWxldGUgQS5yZXNwb25zZX1yZXR1cm4gci5oZWFkZXJzPVMuZnJvbShyLmhlYWRlcnMpLHJ9LGZ1bmN0aW9uKHIpe2lmKCFwQShyKSYmKGt0KEEpLHImJnIucmVzcG9uc2UpKXtBLnJlc3BvbnNlPXIucmVzcG9uc2U7dHJ5e3IucmVzcG9uc2UuZGF0YT15QS5jYWxsKEEsQS50cmFuc2Zvcm1SZXNwb25zZSxyLnJlc3BvbnNlKX1maW5hbGx5e2RlbGV0ZSBBLnJlc3BvbnNlfXIucmVzcG9uc2UuaGVhZGVycz1TLmZyb20oci5yZXNwb25zZS5oZWFkZXJzKX1yZXR1cm4gUHJvbWlzZS5yZWplY3Qocil9KX12YXIgJEE9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChBLHQpPT57JEFbQV09ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByPT09QXx8ImEiKyh0PDE/Im4gIjoiICIpK0F9fSk7dmFyIEZlPXt9OyRBLnRyYW5zaXRpb25hbD1mdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gSShvLGkpe3JldHVybiJbQXhpb3MgdiIrQ0ErIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiBcJyIrbysiXCciK2krKHI/Ii4gIityOiIiKX1yZXR1cm4obyxpLGcpPT57aWYodD09PSExKXRocm93IG5ldyBkKEkoaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyhlPyIgaW4gIitlOiIiKSksZC5FUlJfREVQUkVDQVRFRCk7cmV0dXJuIGUmJiFGZVtpXSYmKEZlW2ldPSEwLGNvbnNvbGUud2FybihJKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK2UrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksdD90KG8saSxnKTohMH19OyRBLnNwZWxsaW5nPWZ1bmN0aW9uKHQpe3JldHVybihlLHIpPT4oY29uc29sZS53YXJuKGAke3J9IGlzIGxpa2VseSBhIG1pc3NwZWxsaW5nIG9mICR7dH1gKSwhMCl9O2Z1bmN0aW9uIEpJKEEsdCxlKXtpZih0eXBlb2YgQSE9Im9iamVjdCIpdGhyb3cgbmV3IGQoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLGQuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2xldCByPU9iamVjdC5rZXlzKEEpLEk9ci5sZW5ndGg7Zm9yKDtJLS0gPjA7KXtsZXQgbz1yW0ldLGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbyk/dFtvXTp2b2lkIDA7aWYoaSl7bGV0IGc9QVtvXSxRPWc9PT12b2lkIDB8fGkoZyxvLEEpO2lmKFEhPT0hMCl0aHJvdyBuZXcgZCgib3B0aW9uICIrbysiIG11c3QgYmUgIitRLGQuRVJSX0JBRF9PUFRJT05fVkFMVUUpO2NvbnRpbnVlfWlmKGUhPT0hMCl0aHJvdyBuZXcgZCgiVW5rbm93biBvcHRpb24gIitvLGQuRVJSX0JBRF9PUFRJT04pfX12YXIgU0E9e2Fzc2VydE9wdGlvbnM6SkksdmFsaWRhdG9yczokQX07dmFyIEg9U0EudmFsaWRhdG9ycyxCQT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmRlZmF1bHRzPXR8fHt9LHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBmdCxyZXNwb25zZTpuZXcgZnR9fWFzeW5jIHJlcXVlc3QodCxlKXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QodCxlKX1jYXRjaChyKXtpZihyIGluc3RhbmNlb2YgRXJyb3Ipe2xldCBJPXt9O0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKEkpOkk9bmV3IEVycm9yO2xldCBvPSgoKT0+e2lmKCFJLnN0YWNrKXJldHVybiIiO2xldCBpPUkuc3RhY2suaW5kZXhPZihgJTBBYCk7cmV0dXJuIGk9PT0tMT8iIjpJLnN0YWNrLnNsaWNlKGkrMSl9KSgpO3RyeXtpZighci5zdGFjaylyLnN0YWNrPW87ZWxzZSBpZihvKXtsZXQgaT1vLmluZGV4T2YoYCUwQWApLGc9aT09PS0xPy0xOm8uaW5kZXhPZihgJTBBYCxpKzEpLFE9Zz09PS0xPyIiOm8uc2xpY2UoZysxKTtTdHJpbmcoci5zdGFjaykuZW5kc1dpdGgoUSl8fChyLnN0YWNrKz1gJTBBYCtvKX19Y2F0Y2h7fX10aHJvdyByfX1fcmVxdWVzdCh0LGUpe3R5cGVvZiB0PT0ic3RyaW5nIj8oZT1lfHx7fSxlLnVybD10KTplPXR8fHt9LGU9WSh0aGlzLmRlZmF1bHRzLGUpO2xldHt0cmFuc2l0aW9uYWw6cixwYXJhbXNTZXJpYWxpemVyOkksaGVhZGVyczpvfT1lO3IhPT12b2lkIDAmJlNBLmFzc2VydE9wdGlvbnMocix7c2lsZW50SlNPTlBhcnNpbmc6SC50cmFuc2l0aW9uYWwoSC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpILnRyYW5zaXRpb25hbChILmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6SC50cmFuc2l0aW9uYWwoSC5ib29sZWFuKSxsZWdhY3lJbnRlcmNlcHRvclJlcVJlc09yZGVyaW5nOkgudHJhbnNpdGlvbmFsKEguYm9vbGVhbil9LCExKSxJIT1udWxsJiYobi5pc0Z1bmN0aW9uKEkpP2UucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOkl9OlNBLmFzc2VydE9wdGlvbnMoSSx7ZW5jb2RlOkguZnVuY3Rpb24sc2VyaWFsaXplOkguZnVuY3Rpb259LCEwKSksZS5hbGxvd0Fic29sdXRlVXJscyE9PXZvaWQgMHx8KHRoaXMuZGVmYXVsdHMuYWxsb3dBYnNvbHV0ZVVybHMhPT12b2lkIDA/ZS5hbGxvd0Fic29sdXRlVXJscz10aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzOmUuYWxsb3dBYnNvbHV0ZVVybHM9ITApLFNBLmFzc2VydE9wdGlvbnMoZSx7YmFzZVVybDpILnNwZWxsaW5nKCJiYXNlVVJMIiksd2l0aFhzcmZUb2tlbjpILnNwZWxsaW5nKCJ3aXRoWFNSRlRva2VuIil9LCEwKSxlLm1ldGhvZD0oZS5tZXRob2R8fHRoaXMuZGVmYXVsdHMubWV0aG9kfHwiZ2V0IikudG9Mb3dlckNhc2UoKTtsZXQgaT1vJiZuLm1lcmdlKG8uY29tbW9uLG9bZS5tZXRob2RdKTtvJiZuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwicXVlcnkiLCJjb21tb24iXSxsPT57ZGVsZXRlIG9bbF19KSxlLmhlYWRlcnM9Uy5jb25jYXQoaSxvKTtsZXQgZz1bXSxRPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbihjKXtpZih0eXBlb2YgYy5ydW5XaGVuPT0iZnVuY3Rpb24iJiZjLnJ1bldoZW4oZSk9PT0hMSlyZXR1cm47UT1RJiZjLnN5bmNocm9ub3VzO2xldCBFPWUudHJhbnNpdGlvbmFsfHxuQTtFJiZFLmxlZ2FjeUludGVyY2VwdG9yUmVxUmVzT3JkZXJpbmc/Zy51bnNoaWZ0KGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpOmcucHVzaChjLmZ1bGZpbGxlZCxjLnJlamVjdGVkKX0pO2xldCBDPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oYyl7Qy5wdXNoKGMuZnVsZmlsbGVkLGMucmVqZWN0ZWQpfSk7bGV0IHMsQj0wLGY7aWYoIVEpe2xldCBsPVt2QS5iaW5kKHRoaXMpLHZvaWQgMF07Zm9yKGwudW5zaGlmdCguLi5nKSxsLnB1c2goLi4uQyksZj1sLmxlbmd0aCxzPVByb21pc2UucmVzb2x2ZShlKTtCPGY7KXM9cy50aGVuKGxbQisrXSxsW0IrK10pO3JldHVybiBzfWY9Zy5sZW5ndGg7bGV0IGE9ZTtmb3IoO0I8Zjspe2xldCBsPWdbQisrXSxjPWdbQisrXTt0cnl7YT1sKGEpfWNhdGNoKEUpe2MuY2FsbCh0aGlzLEUpO2JyZWFrfX10cnl7cz12QS5jYWxsKHRoaXMsYSl9Y2F0Y2gobCl7cmV0dXJuIFByb21pc2UucmVqZWN0KGwpfWZvcihCPTAsZj1DLmxlbmd0aDtCPGY7KXM9cy50aGVuKENbQisrXSxDW0IrK10pO3JldHVybiBzfWdldFVyaSh0KXt0PVkodGhpcy5kZWZhdWx0cyx0KTtsZXQgZT13QSh0LmJhc2VVUkwsdC51cmwsdC5hbGxvd0Fic29sdXRlVXJscyk7cmV0dXJuIERBKGUsdC5wYXJhbXMsdC5wYXJhbXNTZXJpYWxpemVyKX19O24uZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sZnVuY3Rpb24odCl7QkEucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUscil7cmV0dXJuIHRoaXMucmVxdWVzdChZKHJ8fHt9LHttZXRob2Q6dCx1cmw6ZSxkYXRhOihyfHx7fSkuZGF0YX0pKX19KTtuLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giLCJxdWVyeSJdLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUocil7cmV0dXJuIGZ1bmN0aW9uKG8saSxnKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFkoZ3x8e30se21ldGhvZDp0LGhlYWRlcnM6cj97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6byxkYXRhOml9KSl9fUJBLnByb3RvdHlwZVt0XT1lKCksdCE9PSJxdWVyeSImJihCQS5wcm90b3R5cGVbdCsiRm9ybSJdPWUoITApKX0pO3ZhciBSQT1CQTt2YXIgTHQ9Y2xhc3MgQXtjb25zdHJ1Y3Rvcih0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7bGV0IGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG8pe2U9b30pO2xldCByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oST0+e2lmKCFyLl9saXN0ZW5lcnMpcmV0dXJuO2xldCBvPXIuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKDtvLS0gPjA7KXIuX2xpc3RlbmVyc1tvXShJKTtyLl9saXN0ZW5lcnM9bnVsbH0pLHRoaXMucHJvbWlzZS50aGVuPUk9PntsZXQgbyxpPW5ldyBQcm9taXNlKGc9PntyLnN1YnNjcmliZShnKSxvPWd9KS50aGVuKEkpO3JldHVybiBpLmNhbmNlbD1mdW5jdGlvbigpe3IudW5zdWJzY3JpYmUobyl9LGl9LHQoZnVuY3Rpb24obyxpLGcpe3IucmVhc29ufHwoci5yZWFzb249bmV3IFQobyxpLGcpLGUoci5yZWFzb24pKX0pfXRocm93SWZSZXF1ZXN0ZWQoKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn1zdWJzY3JpYmUodCl7aWYodGhpcy5yZWFzb24pe3QodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2godCk6dGhpcy5fbGlzdGVuZXJzPVt0XX11bnN1YnNjcmliZSh0KXtpZighdGhpcy5fbGlzdGVuZXJzKXJldHVybjtsZXQgZT10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZih0KTtlIT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UoZSwxKX10b0Fib3J0U2lnbmFsKCl7bGV0IHQ9bmV3IEFib3J0Q29udHJvbGxlcixlPXI9Pnt0LmFib3J0KHIpfTtyZXR1cm4gdGhpcy5zdWJzY3JpYmUoZSksdC5zaWduYWwudW5zdWJzY3JpYmU9KCk9PnRoaXMudW5zdWJzY3JpYmUoZSksdC5zaWduYWx9c3RhdGljIHNvdXJjZSgpe2xldCB0O3JldHVybnt0b2tlbjpuZXcgQShmdW5jdGlvbihJKXt0PUl9KSxjYW5jZWw6dH19fSxOZT1MdDtmdW5jdGlvbiBidChBKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEEuYXBwbHkobnVsbCxlKX19ZnVuY3Rpb24gSnQoQSl7cmV0dXJuIG4uaXNPYmplY3QoQSkmJkEuaXNBeGlvc0Vycm9yPT09ITB9dmFyIEh0PXtDb250aW51ZToxMDAsU3dpdGNoaW5nUHJvdG9jb2xzOjEwMSxQcm9jZXNzaW5nOjEwMixFYXJseUhpbnRzOjEwMyxPazoyMDAsQ3JlYXRlZDoyMDEsQWNjZXB0ZWQ6MjAyLE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjoyMDMsTm9Db250ZW50OjIwNCxSZXNldENvbnRlbnQ6MjA1LFBhcnRpYWxDb250ZW50OjIwNixNdWx0aVN0YXR1czoyMDcsQWxyZWFkeVJlcG9ydGVkOjIwOCxJbVVzZWQ6MjI2LE11bHRpcGxlQ2hvaWNlczozMDAsTW92ZWRQZXJtYW5lbnRseTozMDEsRm91bmQ6MzAyLFNlZU90aGVyOjMwMyxOb3RNb2RpZmllZDozMDQsVXNlUHJveHk6MzA1LFVudXNlZDozMDYsVGVtcG9yYXJ5UmVkaXJlY3Q6MzA3LFBlcm1hbmVudFJlZGlyZWN0OjMwOCxCYWRSZXF1ZXN0OjQwMCxVbmF1dGhvcml6ZWQ6NDAxLFBheW1lbnRSZXF1aXJlZDo0MDIsRm9yYmlkZGVuOjQwMyxOb3RGb3VuZDo0MDQsTWV0aG9kTm90QWxsb3dlZDo0MDUsTm90QWNjZXB0YWJsZTo0MDYsUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkOjQwNyxSZXF1ZXN0VGltZW91dDo0MDgsQ29uZmxpY3Q6NDA5LEdvbmU6NDEwLExlbmd0aFJlcXVpcmVkOjQxMSxQcmVjb25kaXRpb25GYWlsZWQ6NDEyLFBheWxvYWRUb29MYXJnZTo0MTMsVXJpVG9vTG9uZzo0MTQsVW5zdXBwb3J0ZWRNZWRpYVR5cGU6NDE1LFJhbmdlTm90U2F0aXNmaWFibGU6NDE2LEV4cGVjdGF0aW9uRmFpbGVkOjQxNyxJbUFUZWFwb3Q6NDE4LE1pc2RpcmVjdGVkUmVxdWVzdDo0MjEsVW5wcm9jZXNzYWJsZUVudGl0eTo0MjIsTG9ja2VkOjQyMyxGYWlsZWREZXBlbmRlbmN5OjQyNCxUb29FYXJseTo0MjUsVXBncmFkZVJlcXVpcmVkOjQyNixQcmVjb25kaXRpb25SZXF1aXJlZDo0MjgsVG9vTWFueVJlcXVlc3RzOjQyOSxSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6NDMxLFVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zOjQ1MSxJbnRlcm5hbFNlcnZlckVycm9yOjUwMCxOb3RJbXBsZW1lbnRlZDo1MDEsQmFkR2F0ZXdheTo1MDIsU2VydmljZVVuYXZhaWxhYmxlOjUwMyxHYXRld2F5VGltZW91dDo1MDQsSHR0cFZlcnNpb25Ob3RTdXBwb3J0ZWQ6NTA1LFZhcmlhbnRBbHNvTmVnb3RpYXRlczo1MDYsSW5zdWZmaWNpZW50U3RvcmFnZTo1MDcsTG9vcERldGVjdGVkOjUwOCxOb3RFeHRlbmRlZDo1MTAsTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6NTExLFdlYlNlcnZlcklzRG93bjo1MjEsQ29ubmVjdGlvblRpbWVkT3V0OjUyMixPcmlnaW5Jc1VucmVhY2hhYmxlOjUyMyxUaW1lb3V0T2NjdXJyZWQ6NTI0LFNzbEhhbmRzaGFrZUZhaWxlZDo1MjUsSW52YWxpZFNzbENlcnRpZmljYXRlOjUyNn07T2JqZWN0LmVudHJpZXMoSHQpLmZvckVhY2goKFtBLHRdKT0+e0h0W3RdPUF9KTt2YXIgVWU9SHQ7ZnVuY3Rpb24gR2UoQSl7bGV0IHQ9bmV3IFJBKEEpLGU9ZkEoUkEucHJvdG90eXBlLnJlcXVlc3QsdCk7cmV0dXJuIG4uZXh0ZW5kKGUsUkEucHJvdG90eXBlLHQse2FsbE93bktleXM6ITB9KSxuLmV4dGVuZChlLHQsbnVsbCx7YWxsT3duS2V5czohMH0pLGUuY3JlYXRlPWZ1bmN0aW9uKEkpe3JldHVybiBHZShZKEEsSSkpfSxlfXZhciBSPUdlKHNBKTtSLkF4aW9zPVJBO1IuQ2FuY2VsZWRFcnJvcj1UO1IuQ2FuY2VsVG9rZW49TmU7Ui5pc0NhbmNlbD1wQTtSLlZFUlNJT049Q0E7Ui50b0Zvcm1EYXRhPVo7Ui5BeGlvc0Vycm9yPWQ7Ui5DYW5jZWw9Ui5DYW5jZWxlZEVycm9yO1IuYWxsPWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLmFsbCh0KX07Ui5zcHJlYWQ9YnQ7Ui5pc0F4aW9zRXJyb3I9SnQ7Ui5tZXJnZUNvbmZpZz1ZO1IuQXhpb3NIZWFkZXJzPVM7Ui5mb3JtVG9KU09OPUE9PlpBKG4uaXNIVE1MRm9ybShBKT9uZXcgRm9ybURhdGEoQSk6QSk7Ui5nZXRBZGFwdGVyPVhBLmdldEFkYXB0ZXI7Ui5IdHRwU3RhdHVzQ29kZT1VZTtSLmRlZmF1bHQ9Ujt2YXIgQXQ9Ujt2YXJ7QXhpb3M6YWcsQXhpb3NFcnJvcjpDZyxDYW5jZWxlZEVycm9yOkJnLGlzQ2FuY2VsOlFnLENhbmNlbFRva2VuOkVnLFZFUlNJT046Y2csYWxsOmZnLENhbmNlbDpsZyxpc0F4aW9zRXJyb3I6dWcsc3ByZWFkOmRnLHRvRm9ybURhdGE6aGcsQXhpb3NIZWFkZXJzOkRnLEh0dHBTdGF0dXNDb2RlOnlnLGZvcm1Ub0pTT046cGcsZ2V0QWRhcHRlcjptZyxtZXJnZUNvbmZpZzp3ZyxjcmVhdGU6U2d9PUF0O3ZhciBGQSxQLFl0LE90PXtlbnY6e2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6ZnVuY3Rpb24oQSl7WXQ9bmV3IFVpbnQ4QXJyYXkoUC5leHBvcnRzLm1lbW9yeS5idWZmZXIpfX19LHR0PWNsYXNze2luaXQoKXtyZXR1cm4gRkF8fCh0eXBlb2YgZmV0Y2g8InUiP0ZBPWZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL3dhc207YmFzZTY0LCIra2UpLnRoZW4odD0+dC5hcnJheUJ1ZmZlcigpKS50aGVuKHQ9PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHQsT3QpKS50aGVuKHRoaXMuX2luaXQpOkZBPVdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKEJ1ZmZlci5mcm9tKGtlLCJiYXNlNjQiKSxPdCkudGhlbih0aGlzLl9pbml0KSxGQSl9X2luaXQodCl7UD10Lmluc3RhbmNlLE90LmVudi5lbXNjcmlwdGVuX25vdGlmeV9tZW1vcnlfZ3Jvd3RoKDApfWRlY29kZSh0LGU9MCl7aWYoIVApdGhyb3cgbmV3IEVycm9yKCJaU1RERGVjb2RlcjogQXdhaXQgLmluaXQoKSBiZWZvcmUgZGVjb2RpbmcuIik7bGV0IHI9dC5ieXRlTGVuZ3RoLEk9UC5leHBvcnRzLm1hbGxvYyhyKTtZdC5zZXQodCxJKSxlPWV8fE51bWJlcihQLmV4cG9ydHMuWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZShJLHIpKTtsZXQgbz1QLmV4cG9ydHMubWFsbG9jKGUpLGk9UC5leHBvcnRzLlpTVERfZGVjb21wcmVzcyhvLGUsSSxyKSxnPVl0LnNsaWNlKG8sbytpKTtyZXR1cm4gUC5leHBvcnRzLmZyZWUoSSksUC5leHBvcnRzLmZyZWUobyksZ319LGtlPSJBR0Z6YlFFQUFBQUJiZzVnQTM5L2Z3Ri9ZQUYvQVg5Z0FuOS9BR0FCZndCZ0JYOS9mMzkvQVg5Z0EzOS9md0JnQkg5L2YzOEJmMkFBQVg5Z0FuOS9BWDlnQjM5L2YzOS9mMzhCZjJBQ2YzOEJmbUFJZjM5L2YzOS9mMzhCZjJBRmYzOS9mMzhBWUE1L2YzOS9mMzkvZjM5L2YzOS9md0YvQWljQkEyVnVkaDlsYlhOamNtbHdkR1Z1WDI1dmRHbG1lVjl0WlcxdmNubGZaM0p2ZDNSb0FBTURJeUlIQUFBQkFRTUhBd0VBQ1FRQUJRRUlDQUVGQmdRRUJBTUdBQUFLQUFVTERBMEdCQVVCY0FFQkFRVUhBUUdBQW9DQUFnWUlBWDhCUVlDakJBc0hyZ0VMQm0xbGJXOXllUUlBQm0xaGJHeHZZd0FGQkdaeVpXVUFCZ3hhVTFSRVgybHpSWEp5YjNJQUVobGFVMVJFWDJacGJtUkVaV052YlhCeVpYTnpaV1JUYVhwbEFCd1BXbE5VUkY5a1pXTnZiWEJ5WlhOekFDSVpYMTlwYm1ScGNtVmpkRjltZFc1amRHbHZibDkwWVdKc1pRRUFFRjlmWlhKeWJtOWZiRzlqWVhScGIyNEFBUWx6ZEdGamExTmhkbVVBQnd4emRHRmphMUpsYzNSdmNtVUFDQXB6ZEdGamEwRnNiRzlqQUFrS2kvSUJJZ1VBUVlRZkN6TUJBWDhnQWdSQUlBQWhBd05BSUFNZ0FTMEFBRG9BQUNBRFFRRnFJUU1nQVVFQmFpRUJJQUpCQVdzaUFnMEFDd3NnQUFzcEFRRi9JQUlFUUNBQUlRTURRQ0FESUFFNkFBQWdBMEVCYWlFRElBSkJBV3NpQWcwQUN3c2dBQXRzQVFKL1FZQWZLQUlBSWdFZ0FFRUhha0Y0Y1NJQ2FpRUFBa0FnQWtFQUlBQWdBVTBiRFFBZ0FEOEFRUkIwU3dSQUlBQS9BRUVRZEd0Qi8vOERha0VRZGtBQVFYOUdCSDlCQUFWQkFCQUFRUUVMUlEwQkMwR0FIeUFBTmdJQUlBRVBDMEdFSDBFd05nSUFRWDhMdVNjQkMzOGpBRUVRYXlJS0pBQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCOUFGTkJFQkJpQjhvQWdBaUJrRVFJQUJCQzJwQmVIRWdBRUVMU1JzaUJVRURkaUlBZGlJQlFRTnhCRUFDUUNBQlFYOXpRUUZ4SUFCcUlnSkJBM1FpQVVHd0gyb2lBQ0FCUWJnZmFpZ0NBQ0lCS0FJSUlnUkdCRUJCaUI4Z0JrRitJQUozY1RZQ0FBd0JDeUFFSUFBMkFnd2dBQ0FFTmdJSUN5QUJRUWhxSVFBZ0FTQUNRUU4wSWdKQkEzSTJBZ1FnQVNBQ2FpSUJJQUVvQWdSQkFYSTJBZ1FNRHdzZ0JVR1FIeWdDQUNJSFRRMEJJQUVFUUFKQVFRSWdBSFFpQWtFQUlBSnJjaUFCSUFCMGNXZ2lBVUVEZENJQVFiQWZhaUlDSUFCQnVCOXFLQUlBSWdBb0FnZ2lCRVlFUUVHSUh5QUdRWDRnQVhkeElnWTJBZ0FNQVFzZ0JDQUNOZ0lNSUFJZ0JEWUNDQXNnQUNBRlFRTnlOZ0lFSUFBZ0JXb2lDQ0FCUVFOMElnRWdCV3NpQkVFQmNqWUNCQ0FBSUFGcUlBUTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRRkJuQjhvQWdBaEFnSi9JQVpCQVNBSFFRTjJkQ0lEY1VVRVFFR0lIeUFESUFaeU5nSUFJQUVNQVFzZ0FTZ0NDQXNoQXlBQklBSTJBZ2dnQXlBQ05nSU1JQUlnQVRZQ0RDQUNJQU0yQWdnTElBQkJDR29oQUVHY0h5QUlOZ0lBUVpBZklBUTJBZ0FNRHd0QmpCOG9BZ0FpQzBVTkFTQUxhRUVDZEVHNElXb29BZ0FpQWlnQ0JFRjRjU0FGYXlFRElBSWhBUU5BQWtBZ0FTZ0NFQ0lBUlFSQUlBRW9BaFFpQUVVTkFRc2dBQ2dDQkVGNGNTQUZheUlCSUFNZ0FTQURTU0lCR3lFRElBQWdBaUFCR3lFQ0lBQWhBUXdCQ3dzZ0FpZ0NHQ0VKSUFJZ0FpZ0NEQ0lFUndSQVFaZ2ZLQUlBR2lBQ0tBSUlJZ0FnQkRZQ0RDQUVJQUEyQWdnTURnc2dBa0VVYWlJQktBSUFJZ0JGQkVBZ0FpZ0NFQ0lBUlEwRElBSkJFR29oQVFzRFFDQUJJUWdnQUNJRVFSUnFJZ0VvQWdBaUFBMEFJQVJCRUdvaEFTQUVLQUlRSWdBTkFBc2dDRUVBTmdJQURBMExRWDhoQlNBQVFiOS9TdzBBSUFCQkMyb2lBRUY0Y1NFRlFZd2ZLQUlBSWdoRkRRQkJBQ0FGYXlFREFrQUNRQUpBQW45QkFDQUZRWUFDU1EwQUdrRWZJQVZCLy8vL0Iwc05BQm9nQlVFbUlBQkJDSFpuSWdCcmRrRUJjU0FBUVFGMGEwRSthZ3NpQjBFQ2RFRzRJV29vQWdBaUFVVUVRRUVBSVFBTUFRdEJBQ0VBSUFWQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQ0EwQUNRQ0FCS0FJRVFYaHhJQVZySWdZZ0EwOE5BQ0FCSVFRZ0JpSUREUUJCQUNFRElBRWhBQXdEQ3lBQUlBRW9BaFFpQmlBR0lBRWdBa0VkZGtFRWNXb29BaEFpQVVZYklBQWdCaHNoQUNBQ1FRRjBJUUlnQVEwQUN3c2dBQ0FFY2tVRVFFRUFJUVJCQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FHaEJBblJCdUNGcUtBSUFJUUFMSUFCRkRRRUxBMEFnQUNnQ0JFRjRjU0FGYXlJQ0lBTkpJUUVnQWlBRElBRWJJUU1nQUNBRUlBRWJJUVFnQUNnQ0VDSUJCSDhnQVFVZ0FDZ0NGQXNpQUEwQUN3c2dCRVVOQUNBRFFaQWZLQUlBSUFWclR3MEFJQVFvQWhnaEJ5QUVJQVFvQWd3aUFrY0VRRUdZSHlnQ0FCb2dCQ2dDQ0NJQUlBSTJBZ3dnQWlBQU5nSUlEQXdMSUFSQkZHb2lBU2dDQUNJQVJRUkFJQVFvQWhBaUFFVU5BeUFFUVJCcUlRRUxBMEFnQVNFR0lBQWlBa0VVYWlJQktBSUFJZ0FOQUNBQ1FSQnFJUUVnQWlnQ0VDSUFEUUFMSUFaQkFEWUNBQXdMQ3lBRlFaQWZLQUlBSWdSTkJFQkJuQjhvQWdBaEFBSkFJQVFnQldzaUFVRVFUd1JBSUFBZ0JXb2lBaUFCUVFGeU5nSUVJQUFnQkdvZ0FUWUNBQ0FBSUFWQkEzSTJBZ1FNQVFzZ0FDQUVRUU55TmdJRUlBQWdCR29pQVNBQktBSUVRUUZ5TmdJRVFRQWhBa0VBSVFFTFFaQWZJQUUyQWdCQm5COGdBallDQUNBQVFRaHFJUUFNRFFzZ0JVR1VIeWdDQUNJQ1NRUkFRWlFmSUFJZ0JXc2lBVFlDQUVHZ0gwR2dIeWdDQUNJQUlBVnFJZ0kyQWdBZ0FpQUJRUUZ5TmdJRUlBQWdCVUVEY2pZQ0JDQUFRUWhxSVFBTURRdEJBQ0VBSUFWQkwyb2lBd0ovUWVBaUtBSUFCRUJCNkNJb0FnQU1BUXRCN0NKQ2Z6Y0NBRUhrSWtLQW9JQ0FnSUFFTndJQVFlQWlJQXBCREdwQmNIRkIyS3JWcWdWek5nSUFRZlFpUVFBMkFnQkJ4Q0pCQURZQ0FFR0FJQXNpQVdvaUJrRUFJQUZySWdoeElnRWdCVTBOREVIQUlpZ0NBQ0lFQkVCQnVDSW9BZ0FpQnlBQmFpSUpJQWROSUFRZ0NVbHlEUTBMQWtCQnhDSXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFR2dIeWdDQUNJRUJFQkJ5Q0loQUFOQUlBUWdBQ2dDQUNJSFR3UkFJQWNnQUNnQ0JHb2dCRXNOQXdzZ0FDZ0NDQ0lBRFFBTEMwRUFFQVFpQWtGL1JnMERJQUVoQmtIa0lpZ0NBQ0lBUVFGcklnUWdBbkVFUUNBQklBSnJJQUlnQkdwQkFDQUFhM0ZxSVFZTElBVWdCazhOQTBIQUlpZ0NBQ0lBQkVCQnVDSW9BZ0FpQkNBR2FpSUlJQVJOSUFBZ0NFbHlEUVFMSUFZUUJDSUFJQUpIRFFFTUJRc2dCaUFDYXlBSWNTSUdFQVFpQWlBQUtBSUFJQUFvQWdScVJnMEJJQUloQUFzZ0FFRi9SZzBCSUFWQk1Hb2dCazBFUUNBQUlRSU1CQXRCNkNJb0FnQWlBaUFESUFacmFrRUFJQUpyY1NJQ0VBUkJmMFlOQVNBQ0lBWnFJUVlnQUNFQ0RBTUxJQUpCZjBjTkFndEJ4Q0pCeENJb0FnQkJCSEkyQWdBTElBRVFCQ0lDUVg5R1FRQVFCQ0lBUVg5R2NpQUFJQUpOY2cwRklBQWdBbXNpQmlBRlFTaHFUUTBGQzBHNElrRzRJaWdDQUNBR2FpSUFOZ0lBUWJ3aUtBSUFJQUJKQkVCQnZDSWdBRFlDQUFzQ1FFR2dIeWdDQUNJREJFQkJ5Q0loQUFOQUlBSWdBQ2dDQUNJQklBQW9BZ1FpQkdwR0RRSWdBQ2dDQ0NJQURRQUxEQVFMUVpnZktBSUFJZ0JCQUNBQUlBSk5HMFVFUUVHWUh5QUNOZ0lBQzBFQUlRQkJ6Q0lnQmpZQ0FFSElJaUFDTmdJQVFhZ2ZRWDgyQWdCQnJCOUI0Q0lvQWdBMkFnQkIxQ0pCQURZQ0FBTkFJQUJCQTNRaUFVRzRIMm9nQVVHd0gyb2lCRFlDQUNBQlFid2ZhaUFFTmdJQUlBQkJBV29pQUVFZ1J3MEFDMEdVSHlBR1FTaHJJZ0JCZUNBQ2EwRUhjU0lCYXlJRU5nSUFRYUFmSUFFZ0Ftb2lBVFlDQUNBQklBUkJBWEkyQWdRZ0FDQUNha0VvTmdJRVFhUWZRZkFpS0FJQU5nSUFEQVFMSUFJZ0EwMGdBU0FEUzNJTkFpQUFLQUlNUVFoeERRSWdBQ0FFSUFacU5nSUVRYUFmSUFOQmVDQURhMEVIY1NJQWFpSUJOZ0lBUVpRZlFaUWZLQUlBSUFacUlnSWdBR3NpQURZQ0FDQUJJQUJCQVhJMkFnUWdBaUFEYWtFb05nSUVRYVFmUWZBaUtBSUFOZ0lBREFNTFFRQWhCQXdLQzBFQUlRSU1DQXRCbUI4b0FnQWdBa3NFUUVHWUh5QUNOZ0lBQ3lBQ0lBWnFJUUZCeUNJaEFBSkFBa0FDUUFOQUlBRWdBQ2dDQUVjRVFDQUFLQUlJSWdBTkFRd0NDd3NnQUMwQURFRUljVVVOQVF0QnlDSWhBQU5BSUFNZ0FDZ0NBQ0lCVHdSQUlBRWdBQ2dDQkdvaUJDQURTdzBEQ3lBQUtBSUlJUUFNQUFzQUN5QUFJQUkyQWdBZ0FDQUFLQUlFSUFacU5nSUVJQUpCZUNBQ2EwRUhjV29pQnlBRlFRTnlOZ0lFSUFGQmVDQUJhMEVIY1dvaUJpQUZJQWRxSWdWcklRQWdBeUFHUmdSQVFhQWZJQVUyQWdCQmxCOUJsQjhvQWdBZ0FHb2lBRFlDQUNBRklBQkJBWEkyQWdRTUNBdEJuQjhvQWdBZ0JrWUVRRUdjSHlBRk5nSUFRWkFmUVpBZktBSUFJQUJxSWdBMkFnQWdCU0FBUVFGeU5nSUVJQUFnQldvZ0FEWUNBQXdJQ3lBR0tBSUVJZ05CQTNGQkFVY05CaUFEUVhoeElRa2dBMEgvQVUwRVFDQUdLQUlNSWdFZ0JpZ0NDQ0lDUmdSQVFZZ2ZRWWdmS0FJQVFYNGdBMEVEZG5keE5nSUFEQWNMSUFJZ0FUWUNEQ0FCSUFJMkFnZ01CZ3NnQmlnQ0dDRUlJQVlnQmlnQ0RDSUNSd1JBSUFZb0FnZ2lBU0FDTmdJTUlBSWdBVFlDQ0F3RkN5QUdRUlJxSWdFb0FnQWlBMFVFUUNBR0tBSVFJZ05GRFFRZ0JrRVFhaUVCQ3dOQUlBRWhCQ0FESWdKQkZHb2lBU2dDQUNJRERRQWdBa0VRYWlFQklBSW9BaEFpQXcwQUN5QUVRUUEyQWdBTUJBdEJsQjhnQmtFb2F5SUFRWGdnQW10QkIzRWlBV3NpQ0RZQ0FFR2dIeUFCSUFKcUlnRTJBZ0FnQVNBSVFRRnlOZ0lFSUFBZ0FtcEJLRFlDQkVHa0gwSHdJaWdDQURZQ0FDQURJQVJCSnlBRWEwRUhjV3BCTDJzaUFDQUFJQU5CRUdwSkd5SUJRUnMyQWdRZ0FVSFFJaWtDQURjQ0VDQUJRY2dpS1FJQU53SUlRZEFpSUFGQkNHbzJBZ0JCekNJZ0JqWUNBRUhJSWlBQ05nSUFRZFFpUVFBMkFnQWdBVUVZYWlFQUEwQWdBRUVITmdJRUlBQkJDR29nQUVFRWFpRUFJQVJKRFFBTElBRWdBMFlOQUNBQklBRW9BZ1JCZm5FMkFnUWdBeUFCSUFOcklnSkJBWEkyQWdRZ0FTQUNOZ0lBSUFKQi93Rk5CRUFnQWtGNGNVR3dIMm9oQUFKL1FZZ2ZLQUlBSWdGQkFTQUNRUU4yZENJQ2NVVUVRRUdJSHlBQklBSnlOZ0lBSUFBTUFRc2dBQ2dDQ0FzaEFTQUFJQU0yQWdnZ0FTQUROZ0lNSUFNZ0FEWUNEQ0FESUFFMkFnZ01BUXRCSHlFQUlBSkIvLy8vQjAwRVFDQUNRU1lnQWtFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUlRQUxJQU1nQURZQ0hDQURRZ0EzQWhBZ0FFRUNkRUc0SVdvaEFRSkFBa0JCakI4b0FnQWlCRUVCSUFCMElnWnhSUVJBUVl3ZklBUWdCbkkyQWdBZ0FTQUROZ0lBREFFTElBSkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJBTkFJQVFpQVNnQ0JFRjRjU0FDUmcwQ0lBQkJIWFloQkNBQVFRRjBJUUFnQVNBRVFRUnhhaUlHS0FJUUlnUU5BQXNnQmlBRE5nSVFDeUFESUFFMkFoZ2dBeUFETmdJTUlBTWdBellDQ0F3QkN5QUJLQUlJSWdBZ0F6WUNEQ0FCSUFNMkFnZ2dBMEVBTmdJWUlBTWdBVFlDRENBRElBQTJBZ2dMUVpRZktBSUFJZ0FnQlUwTkFFR1VIeUFBSUFWcklnRTJBZ0JCb0I5Qm9COG9BZ0FpQUNBRmFpSUNOZ0lBSUFJZ0FVRUJjallDQkNBQUlBVkJBM0kyQWdRZ0FFRUlhaUVBREFnTFFZUWZRVEEyQWdCQkFDRUFEQWNMUVFBaEFnc2dDRVVOQUFKQUlBWW9BaHdpQVVFQ2RFRzRJV29pQkNnQ0FDQUdSZ1JBSUFRZ0FqWUNBQ0FDRFFGQmpCOUJqQjhvQWdCQmZpQUJkM0UyQWdBTUFnc2dDRUVRUVJRZ0NDZ0NFQ0FHUmh0cUlBSTJBZ0FnQWtVTkFRc2dBaUFJTmdJWUlBWW9BaEFpQVFSQUlBSWdBVFlDRUNBQklBSTJBaGdMSUFZb0FoUWlBVVVOQUNBQ0lBRTJBaFFnQVNBQ05nSVlDeUFBSUFscUlRQWdCaUFKYWlJR0tBSUVJUU1MSUFZZ0EwRitjVFlDQkNBRklBQkJBWEkyQWdRZ0FDQUZhaUFBTmdJQUlBQkIvd0ZOQkVBZ0FFRjRjVUd3SDJvaEFRSi9RWWdmS0FJQUlnSkJBU0FBUVFOMmRDSUFjVVVFUUVHSUh5QUFJQUp5TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFVMkFnZ2dBQ0FGTmdJTUlBVWdBVFlDRENBRklBQTJBZ2dNQVF0Qkh5RURJQUJCLy8vL0IwMEVRQ0FBUVNZZ0FFRUlkbWNpQVd0MlFRRnhJQUZCQVhSclFUNXFJUU1MSUFVZ0F6WUNIQ0FGUWdBM0FoQWdBMEVDZEVHNElXb2hBUUpBQWtCQmpCOG9BZ0FpQWtFQklBTjBJZ1J4UlFSQVFZd2ZJQUlnQkhJMkFnQWdBU0FGTmdJQURBRUxJQUJCR1NBRFFRRjJhMEVBSUFOQkgwY2JkQ0VESUFFb0FnQWhBZ05BSUFJaUFTZ0NCRUY0Y1NBQVJnMENJQU5CSFhZaEFpQURRUUYwSVFNZ0FTQUNRUVJ4YWlJRUtBSVFJZ0lOQUFzZ0JDQUZOZ0lRQ3lBRklBRTJBaGdnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFCS0FJSUlnQWdCVFlDRENBQklBVTJBZ2dnQlVFQU5nSVlJQVVnQVRZQ0RDQUZJQUEyQWdnTElBZEJDR29oQUF3Q0N3SkFJQWRGRFFBQ1FDQUVLQUljSWdCQkFuUkJ1Q0ZxSWdFb0FnQWdCRVlFUUNBQklBSTJBZ0FnQWcwQlFZd2ZJQWhCZmlBQWQzRWlDRFlDQUF3Q0N5QUhRUkJCRkNBSEtBSVFJQVJHRzJvZ0FqWUNBQ0FDUlEwQkN5QUNJQWMyQWhnZ0JDZ0NFQ0lBQkVBZ0FpQUFOZ0lRSUFBZ0FqWUNHQXNnQkNnQ0ZDSUFSUTBBSUFJZ0FEWUNGQ0FBSUFJMkFoZ0xBa0FnQTBFUFRRUkFJQVFnQXlBRmFpSUFRUU55TmdJRUlBQWdCR29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQVFnQlVFRGNqWUNCQ0FFSUFWcUlnSWdBMEVCY2pZQ0JDQUNJQU5xSUFNMkFnQWdBMEgvQVUwRVFDQURRWGh4UWJBZmFpRUFBbjlCaUI4b0FnQWlBVUVCSUFOQkEzWjBJZ054UlFSQVFZZ2ZJQUVnQTNJMkFnQWdBQXdCQ3lBQUtBSUlDeUVCSUFBZ0FqWUNDQ0FCSUFJMkFnd2dBaUFBTmdJTUlBSWdBVFlDQ0F3QkMwRWZJUUFnQTBILy8vOEhUUVJBSUFOQkppQURRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0FpQUFOZ0ljSUFKQ0FEY0NFQ0FBUVFKMFFiZ2hhaUVCQWtBQ1FDQUlRUUVnQUhRaUJuRkZCRUJCakI4Z0JpQUljallDQUNBQklBSTJBZ0FNQVFzZ0EwRVpJQUJCQVhaclFRQWdBRUVmUnh0MElRQWdBU2dDQUNFRkEwQWdCU0lCS0FJRVFYaHhJQU5HRFFJZ0FFRWRkaUVHSUFCQkFYUWhBQ0FCSUFaQkJIRnFJZ1lvQWhBaUJRMEFDeUFHSUFJMkFoQUxJQUlnQVRZQ0dDQUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBRW9BZ2dpQUNBQ05nSU1JQUVnQWpZQ0NDQUNRUUEyQWhnZ0FpQUJOZ0lNSUFJZ0FEWUNDQXNnQkVFSWFpRUFEQUVMQWtBZ0NVVU5BQUpBSUFJb0Fod2lBRUVDZEVHNElXb2lBU2dDQUNBQ1JnUkFJQUVnQkRZQ0FDQUVEUUZCakI4Z0MwRitJQUIzY1RZQ0FBd0NDeUFKUVJCQkZDQUpLQUlRSUFKR0cyb2dCRFlDQUNBRVJRMEJDeUFFSUFrMkFoZ2dBaWdDRUNJQUJFQWdCQ0FBTmdJUUlBQWdCRFlDR0FzZ0FpZ0NGQ0lBUlEwQUlBUWdBRFlDRkNBQUlBUTJBaGdMQWtBZ0EwRVBUUVJBSUFJZ0F5QUZhaUlBUVFOeU5nSUVJQUFnQW1vaUFDQUFLQUlFUVFGeU5nSUVEQUVMSUFJZ0JVRURjallDQkNBQ0lBVnFJZ1FnQTBFQmNqWUNCQ0FESUFScUlBTTJBZ0FnQndSQUlBZEJlSEZCc0I5cUlRQkJuQjhvQWdBaEFRSi9RUUVnQjBFRGRuUWlCU0FHY1VVRVFFR0lIeUFGSUFaeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQmlBQUlBRTJBZ2dnQmlBQk5nSU1JQUVnQURZQ0RDQUJJQVkyQWdnTFFad2ZJQVEyQWdCQmtCOGdBellDQUFzZ0FrRUlhaUVBQ3lBS1FSQnFKQUFnQUF2U0N3RUhmd0pBSUFCRkRRQWdBRUVJYXlJQ0lBQkJCR3NvQWdBaUFVRjRjU0lBYWlFRkFrQWdBVUVCY1EwQUlBRkJBM0ZGRFFFZ0FpQUNLQUlBSWdGcklnSkJtQjhvQWdCSkRRRWdBQ0FCYWlFQUFrQUNRRUdjSHlnQ0FDQUNSd1JBSUFGQi93Rk5CRUFnQVVFRGRpRUVJQUlvQWd3aUFTQUNLQUlJSWdOR0JFQkJpQjlCaUI4b0FnQkJmaUFFZDNFMkFnQU1CUXNnQXlBQk5nSU1JQUVnQXpZQ0NBd0VDeUFDS0FJWUlRWWdBaUFDS0FJTUlnRkhCRUFnQWlnQ0NDSURJQUUyQWd3Z0FTQUROZ0lJREFNTElBSkJGR29pQkNnQ0FDSURSUVJBSUFJb0FoQWlBMFVOQWlBQ1FSQnFJUVFMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUF3Q0N5QUZLQUlFSWdGQkEzRkJBMGNOQWtHUUh5QUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0JTQUFOZ0lBRHd0QkFDRUJDeUFHUlEwQUFrQWdBaWdDSENJRFFRSjBRYmdoYWlJRUtBSUFJQUpHQkVBZ0JDQUJOZ0lBSUFFTkFVR01IMEdNSHlnQ0FFRitJQU4zY1RZQ0FBd0NDeUFHUVJCQkZDQUdLQUlRSUFKR0cyb2dBVFlDQUNBQlJRMEJDeUFCSUFZMkFoZ2dBaWdDRUNJREJFQWdBU0FETmdJUUlBTWdBVFlDR0FzZ0FpZ0NGQ0lEUlEwQUlBRWdBellDRkNBRElBRTJBaGdMSUFJZ0JVOE5BQ0FGS0FJRUlnRkJBWEZGRFFBQ1FBSkFBa0FDUUNBQlFRSnhSUVJBUWFBZktBSUFJQVZHQkVCQm9COGdBallDQUVHVUgwR1VIeWdDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1Fad2ZLQUlBUncwR1FaQWZRUUEyQWdCQm5COUJBRFlDQUE4TFFad2ZLQUlBSUFWR0JFQkJuQjhnQWpZQ0FFR1FIMEdRSHlnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQVBDeUFCUVhoeElBQnFJUUFnQVVIL0FVMEVRQ0FCUVFOMklRUWdCU2dDRENJQklBVW9BZ2dpQTBZRVFFR0lIMEdJSHlnQ0FFRitJQVIzY1RZQ0FBd0ZDeUFESUFFMkFnd2dBU0FETmdJSURBUUxJQVVvQWhnaEJpQUZJQVVvQWd3aUFVY0VRRUdZSHlnQ0FCb2dCU2dDQ0NJRElBRTJBZ3dnQVNBRE5nSUlEQU1MSUFWQkZHb2lCQ2dDQUNJRFJRUkFJQVVvQWhBaUEwVU5BaUFGUVJCcUlRUUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXdDQ3lBRklBRkJmbkUyQWdRZ0FpQUFRUUZ5TmdJRUlBQWdBbW9nQURZQ0FBd0RDMEVBSVFFTElBWkZEUUFDUUNBRktBSWNJZ05CQW5SQnVDRnFJZ1FvQWdBZ0JVWUVRQ0FFSUFFMkFnQWdBUTBCUVl3ZlFZd2ZLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBRktBSVFJZ01FUUNBQklBTTJBaEFnQXlBQk5nSVlDeUFGS0FJVUlnTkZEUUFnQVNBRE5nSVVJQU1nQVRZQ0dBc2dBaUFBUVFGeU5nSUVJQUFnQW1vZ0FEWUNBQ0FDUVp3ZktBSUFSdzBBUVpBZklBQTJBZ0FQQ3lBQVFmOEJUUVJBSUFCQmVIRkJzQjlxSVFFQ2YwR0lIeWdDQUNJRFFRRWdBRUVEZG5RaUFIRkZCRUJCaUI4Z0FDQURjallDQUNBQkRBRUxJQUVvQWdnTElRQWdBU0FDTmdJSUlBQWdBallDRENBQ0lBRTJBZ3dnQWlBQU5nSUlEd3RCSHlFRElBQkIvLy8vQjAwRVFDQUFRU1lnQUVFSWRtY2lBV3QyUVFGeElBRkJBWFJyUVQ1cUlRTUxJQUlnQXpZQ0hDQUNRZ0EzQWhBZ0EwRUNkRUc0SVdvaEFRSkFBa0FDUUVHTUh5Z0NBQ0lFUVFFZ0EzUWlCM0ZGQkVCQmpCOGdCQ0FIY2pZQ0FDQUJJQUkyQWdBZ0FpQUJOZ0lZREFFTElBQkJHU0FEUVFGMmEwRUFJQU5CSDBjYmRDRURJQUVvQWdBaEFRTkFJQUVpQkNnQ0JFRjRjU0FBUmcwQ0lBTkJIWFloQVNBRFFRRjBJUU1nQkNBQlFRUnhhaUlIUVJCcUtBSUFJZ0VOQUFzZ0J5QUNOZ0lRSUFJZ0JEWUNHQXNnQWlBQ05nSU1JQUlnQWpZQ0NBd0JDeUFFS0FJSUlnQWdBallDRENBRUlBSTJBZ2dnQWtFQU5nSVlJQUlnQkRZQ0RDQUNJQUEyQWdnTFFhZ2ZRYWdmS0FJQVFRRnJJZ0JCZnlBQUd6WUNBQXNMQkFBakFBc0dBQ0FBSkFBTEVBQWpBQ0FBYTBGd2NTSUFKQUFnQUF0S0FRRi9JQUFnQVVrRVFDQUFJQUVnQWhBQ0R3c2dBZ1JBSUFBZ0Ftb2hBeUFCSUFKcUlRRURRQ0FEUVFGcklnTWdBVUVCYXlJQkxRQUFPZ0FBSUFKQkFXc2lBZzBBQ3dzZ0FBdjlEZ0lSZndGK0l3QkJNR3NpQnlRQVFiaC9JUWdDUUNBRlJRMEFJQVFzQUFBaUNVSC9BWEVoQ3dKQUlBbEJBRWdFUUNBTFFmNEFhMEVCZGlJR0lBVlBEUUpCYkNFSUlBdEIvd0JySWd0Qi93RkxEUUlnQkVFQmFpRUlRUUFoQlFOQUlBVWdDMDhFUUNBTElRZ2dCaUVMREFNRklBQWdCV29nQ0NBRlFRRjJhaUlFTFFBQVFRUjJPZ0FBSUFBZ0JVRUJjbW9nQkMwQUFFRVBjVG9BQUNBRlFRSnFJUVVNQVFzQUN3QUxJQVVnQzAwTkFTQUhRZjhCTmdJRUlBWWdCMEVFYWlBSFFRaHFJQVJCQVdvaURpQUxFQXdpQkVHSWYwc0VRQ0FFSVFnTUFndEJWQ0VJSUFjb0FnZ2lFRUVHU3cwQklBY29BZ1FpRVVFQmRDSUpRUUpxclVJQklCQ3RoaUlZUVFFZ0VIUWlEVUVCYWlJRnJVSUNobng4UWd0OFF2ei8vLy8vLy8vLy93Q0RRdVFDVmcwQlFWSWhDQ0FSUWY4QlN3MEJJQTFCZjNOQkFuUkI1QUpxclNBUlFRRnFJaFZCQVhTdElCaDhRZ2g4VkEwQklBc2dCR3NoRmlBRUlBNXFJUmNnQmtHQUJHb2lFaUFGUVFKMGFpSVJJQWxxUVFKcUlRNGdCa0dFQkdvaEUwR0FnQUlnRUhSQkVIWWhDVUVBSVFWQkFTRVBJQTFCQVdzaUZDRUtBMEFnQlNBVlJrVUVRQUpBSUFZZ0JVRUJkQ0lJYWk4QkFDSUVRZi8vQTBZRVFDQVRJQXBCQW5ScUlBVTZBQUlnQ2tFQmF5RUtRUUVoQkF3QkN5QVBRUUFnQ1NBRXdVb2JJUThMSUFnZ0VXb2dCRHNCQUNBRlFRRnFJUVVNQVFzTElBWWdEenNCZ2dRZ0JpQVFPd0dBQkFKQUlBb2dGRVlFUUNBTlFRTjJJUWhDQUNFWVFRQWhEd05BSUF3Z0ZVWUVRQ0FJSUExQkFYWnFRUU5xSWdsQkFYUWhDRUVBSVFSQkFDRUtBMEJCQUNFRklBb2dEVThOQkFOQUlBVkJBa1pGQkVBZ0V5QUZJQWxzSUFScUlCUnhRUUowYWlBT0lBVWdDbXBxTFFBQU9nQUNJQVZCQVdvaEJRd0JDd3NnQ2tFQ2FpRUtJQVFnQ0dvZ0ZIRWhCQXdBQ3dBRklBWWdERUVCZEdvdUFRQWhDU0FPSUE5cUlnUWdHRGNBQUVFSUlRVURRQ0FGSUFsT1JRUkFJQVFnQldvZ0dEY0FBQ0FGUVFocUlRVU1BUXNMSUJoQ2dZS0VpSkNnd0lBQmZDRVlJQXhCQVdvaERDQUpJQTlxSVE4TUFRc0FDd0FMSUExQkEzWWdEVUVCZG1wQkEyb2hDRUVBSVFVRFFDQU1JQlZHUlFSQVFRQWhDU0FHSUF4QkFYUnFMZ0VBSWdSQkFDQUVRUUJLR3lFRUEwQWdCQ0FKUmtVRVFDQVRJQVZCQW5ScUlBdzZBQUlEUUNBRklBaHFJQlJ4SWdVZ0Nrc05BQXNnQ1VFQmFpRUpEQUVMQ3lBTVFRRnFJUXdNQVFzTFFYOGhDQ0FGRFFJTElCQkJBV29oQ0VFQUlRVURRQ0FGSUExR1JRUkFJQkVnRXlBRlFRSjBhaUlPTFFBQ1FRRjBhaUlFSUFRdkFRQWlDVUVCYWpzQkFDQU9JQWdnQ1dkQllITnFJZ1E2QUFNZ0RpQUpJQVIwSUExck93RUFJQVZCQVdvaEJRd0JDd3NDUUFKQUlBWXZBWUlFQkVBZ0IwRWNhaUlFSUJjZ0ZoQU5JZ2hCaUg5TERRSWdCMEVVYWlBRUlCSVFEaUFIUVF4cUlBUWdFaEFPUVFBaEJRTkFJQWRCSEdvaUJCQVBJQVZCK3dGTGNnMENJQUFnQldvaUJpQUhRUlJxSUFRUUVEb0FBQ0FHSUFkQkRHb2dCQkFRT2dBQklBVkJBbkloQkNBSFFSeHFFQThFUUNBRUlRVU1Bd1VnQUNBRWFpQUhRUlJxSUFkQkhHb2lCQkFRT2dBQUlBWWdCMEVNYWlBRUVCQTZBQU1nQlVFRWFpRUZEQUVMQUFzQUN5QUhRUnhxSWdRZ0Z5QVdFQTBpQ0VHSWYwc05BU0FIUVJScUlBUWdFaEFPSUFkQkRHb2dCQ0FTRUE1QkFDRUZBMEFnQjBFY2FpSUVFQThnQlVIN0FVdHlSUVJBSUFBZ0JXb2lCaUFIUVJScUlBUVFFVG9BQUNBR0lBZEJER29nQkJBUk9nQUJJQVZCQW5JaEJDQUhRUnhxRUE4RVFDQUVJUVVGSUFBZ0JHb2dCMEVVYWlBSFFSeHFJZ1FRRVRvQUFDQUdJQWRCREdvZ0JCQVJPZ0FESUFWQkJHb2hCUXdDQ3dzTEFuOERRRUc2ZnlFSUlBVkIvUUZMRFFNZ0FDQUZhaUlHSUFkQkZHb2dCMEVjYWlJSkVCRTZBQUFnQmtFQmFpRUVJQWtRRDBFRFJnUkFJQWRCREdvaENFRUNEQUlMSUFWQi9BRkxEUU1nQmlBSFFReHFJQWRCSEdvaUJCQVJPZ0FCSUFWQkFtb2hCU0FFRUE5QkEwY05BQXNnQUNBRmFpRUVJQWRCRkdvaENFRURDeUFFSUFnZ0IwRWNhaEFST2dBQUlBWnFJQUJySVFnTUFRc0Nmd05BUWJwL0lRZ2dCVUg5QVVzTkFpQUFJQVZxSWdZZ0IwRVVhaUFIUVJ4cUlna1FFRG9BQUNBR1FRRnFJUVFnQ1JBUFFRTkdCRUFnQjBFTWFpRUlRUUlNQWdzZ0JVSDhBVXNOQWlBR0lBZEJER29nQjBFY2FpSUVFQkE2QUFFZ0JVRUNhaUVGSUFRUUQwRURSdzBBQ3lBQUlBVnFJUVFnQjBFVWFpRUlRUU1MSUFRZ0NDQUhRUnhxRUJBNkFBQWdCbW9nQUdzaENBc2dDRUdJZjBzTkFRc2dDQ0VFUVFBaEJTQUJRUUJCTkJBRElRbEJBQ0VLQTBBZ0JDQUZSd1JBSUFBZ0JXb2lCaTBBQUNJQlFRdExCRUJCYkNFSURBTUZJQWtnQVVFQ2RHb2lBU0FCS0FJQVFRRnFOZ0lBSUFWQkFXb2hCVUVCSUFZdEFBQjBRUUYxSUFwcUlRb01BZ3NBQ3d0QmJDRUlJQXBGRFFBZ0NtY2lCVUVmY3lJQlFRdExEUUFnQTBFZ0lBVnJOZ0lBUVFGQkFpQUJkQ0FLYXlJRFowRWZjeUlCZENBRFJ3MEFJQUFnQkdvZ0FVRUJhaUlBT2dBQUlBa2dBRUVDZEdvaUFDQUFLQUlBUVFGcU5nSUFJQWtvQWdRaUFFRUNTU0FBUVFGeGNnMEFJQUlnQkVFQmFqWUNBQ0FMUVFGcUlRZ0xJQWRCTUdva0FDQUlDNkFGQVF4L0l3QkJFR3NpRENRQUFuOGdCRUVIVFFSQUlBeENBRGNEQ0NBTVFRaHFJZ1VnQXlBRUVBSWFRV3dnQUNBQklBSWdCVUVJRUF3aUFDQUFJQVJMR3lBQUlBQkJpWDlKR3d3QkN5QUFRUUFnQVNnQ0FFRUJhaUlOUVFGMEVBTWhEMEZVSUFNb0FBQWlCa0VQY1NJQVFRcExEUUFhSUFJZ0FFRUZhallDQUNBRElBUnFJZ0pCQkdzaEJ5QUNRUWRySVFzZ0FFRUdhaUVPUVFRaEFpQUdRUVIySVFWQklDQUFkQ0lJUVFGeUlRbEJBQ0VBUVFFaEJpQURJUVFEUUFKQUlBWkJBWEZGQkVBRFFDQUZRWDl6UVlDQWdJQjRjbWdpQmtFWVNVVUVRQ0FBUVNScUlRQWdCQ0FMVFFSL0lBUkJBMm9GSUFRZ0MydEJBM1FnQW1wQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xJQUlnQmtFZWNTSUtha0VDYWlFQ0lBWkJBWFpCQTJ3Z0FHb2dCU0FLZGtFRGNXb2lBQ0FOVHcwQkFuOGdCQ0FMU3lBQ1FRTjJJQVJxSWdVZ0IwdHhSUVJBSUFKQkIzRWhBaUFGREFFTElBUWdCMnRCQTNRZ0FtcEJIM0VoQWlBSEN5SUVLQUFBSUFKMklRVUxJQVVnQ0VFQmEzRWlCaUFJUVFGMFFRRnJJZ29nQ1dzaUVFa0VmeUFPUVFGckJTQUZJQXB4SWdVZ0VFRUFJQVVnQ0U0YmF5RUdJQTRMSVFVZ0R5QUFRUUYwYWlBR1FRRnJJZ283QVFBZ0FFRUJhaUVBSUFJZ0JXb2hBaUFJUVFFZ0Jtc2dDaUFHUVFCS0d5QUphaUlKU2dSQUlBbEJBa2dOQVVFZ0lBbG5JZ1ZySVE1QkFTQUZRUjl6ZENFSUN5QUFJQTFQRFFBZ0NrRUFSeUVHQW44Z0JDQUxTeUFDUVFOMUlBUnFJZ1VnQjB0eFJRUkFJQUpCQjNFaEFpQUZEQUVMSUFJZ0JDQUhhMEVEZEdwQkgzRWhBaUFIQ3lJRUtBQUFJQUoySVFVTUFRc0xRV3dnQ1VFQlJ3MEFHa0ZRSUFBZ0RVc05BQnBCYkNBQ1FTQktEUUFhSUFFZ0FFRUJhellDQUNBRUlBSkJCMnBCQTNWcUlBTnJDeUFNUVJCcUpBQUw4Z0VCQVg4Z0FrVUVRQ0FBUWdBM0FnQWdBRUVBTmdJUUlBQkNBRGNDQ0VHNGZ3OExJQUFnQVRZQ0RDQUFJQUZCQkdvMkFoQWdBa0VFVHdSQUlBQWdBU0FDYWlJQlFRUnJJZ00yQWdnZ0FDQURLQUFBTmdJQUlBRkJBV3N0QUFBaUFRUkFJQUFnQVdkQkYyczJBZ1FnQWc4TElBQkJBRFlDQkVGL0R3c2dBQ0FCTmdJSUlBQWdBUzBBQUNJRE5nSUFBa0FDUUFKQUlBSkJBbXNPQWdFQUFnc2dBQ0FCTFFBQ1FSQjBJQU55SWdNMkFnQUxJQUFnQVMwQUFVRUlkQ0FEYWpZQ0FBc2dBU0FDYWtFQmF5MEFBQ0lCUlFSQUlBQkJBRFlDQkVGc0R3c2dBQ0FCWnlBQ1FRTjBhMEVKYWpZQ0JDQUNDMFFCQW44Z0FTQUNMd0VBSWdNZ0FTZ0NCR29pQkRZQ0JDQUFJQU5CQW5SQm9CMXFLQUlBSUFFb0FnQkJBQ0FFYTNaeE5nSUFJQUVRRHhvZ0FDQUNRUVJxTmdJRUM1OEJBUVIvUVFNaEFTQUFLQUlFSWdKQklFMEVRQ0FBS0FJSUlnRWdBQ2dDRUU4RVFDQUFJQUpCQjNFMkFnUWdBQ0FCSUFKQkEzWnJJZ0kyQWdnZ0FDQUNLQUFBTmdJQVFRQVBDeUFBS0FJTUlnTWdBVVlFUUVFQlFRSWdBa0VnU1JzUEN5QUFJQUVnQVNBRGF5QUNRUU4ySWdRZ0FTQUVheUFEU1NJQkd5SURheUlFTmdJSUlBQWdBaUFEUVFOMGF6WUNCQ0FBSUFRb0FBQTJBZ0FMSUFFTFNBRUVmeUFBS0FJRUlBQW9BZ0JCQW5ScUlnSXRBQUlnQWk4QkFDRUVJQUVnQVNnQ0JDSUZJQUl0QUFNaUFtbzJBZ1FnQUNBRUlBRW9BZ0FnQlhSQkFDQUNhM1pxTmdJQUMxSUJCSDhnQUNnQ0JDQUFLQUlBUVFKMGFpSUNMUUFDSUFJdkFRQWhCQ0FCSUFJdEFBTWlBaUFCS0FJRWFpSUZOZ0lFSUFBZ0JDQUNRUUowUWFBZGFpZ0NBQ0FCS0FJQVFRQWdCV3QyY1dvMkFnQUxDQUFnQUVHSWYwc0xHZ0FnQUFSQUlBRUVRQ0FDSUFBZ0FSRUNBQThMSUFBUUJnc0xwZ2dDRFg4QmZpTUFRUkJySWdra0FDQUpRUUEyQWd3Z0NVRUFOZ0lJQW44Q1FDQURRZWdKYWlBRElBbEJDR29nQ1VFTWFpQUJJQUlnQTBHQUFXb1FDeUlQUVloL1N3MEFRVlFnQ1NnQ0RDSUVJQUFvQWdBaUFVSC9BWEZCQVdwTERRRWFJQUJCQkdvaEN5QUFJQUZCLzRHQWVIRWdCRUVRZEVHQWdQd0hjWEkyQWdCQmZ5QUVJQVJCQUVnYlFRRnFJUUJCQUNFQklBa29BZ2doQlVFQUlRSURRQ0FBSUFKR0JFQWdCVUVEYXlFQlFRQWhBQU5BQWtCQkFDRUNJQUFnQVU0RVFBTkFJQUFnQlU0TkFpQURJQUFnQTJwQjZBbHFMUUFBUVFKMGFrRkFheUlCSUFFb0FnQWlBVUVCYWpZQ0FDQUJJQU5xSUFBNkFPZ0hJQUJCQVdvaEFBd0FDd0FGQTBBZ0FrRUVSa1VFUUNBRElBTWdBQ0FDYWlJSGFrSG9DV290QUFCQkFuUnFRVUJySWdnZ0NDZ0NBQ0lJUVFGcU5nSUFJQU1nQ0dvZ0J6b0E2QWNnQWtFQmFpRUNEQUVMQ3lBQVFRUnFJUUFNQWdzQUN3c2dCRUVCYWlFT0lBTW9BZ0FoQjBFQUlRQkJBU0VJQTBBZ0NDQU9SZzBESUE0Z0NHc2hCQ0FESUFoQkFuUnFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQkJBU0FJZEVFQmRTSU5RUUZyRGdnQUFRUUNCQVFFQXdRTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBQUlRRURRQ0FDSUFaR0RRVWdBeUFDSUFkcWFpMEE2QWNoQ2lBTElBRkJBWFJxSWd3Z0JEb0FBU0FNSUFvNkFBQWdBa0VCYWlFQ0lBRkJBV29oQVF3QUN3QUxRUUFoQWlBRlFRQWdCVUVBU2hzaENpQUFJUUVEUUNBQ0lBcEdEUVFnQ3lBQlFRRjBhaUlHSUFNZ0FpQUhhbW90QU9nSElndzZBQUlnQmlBRU9nQUJJQVlnRERvQUFDQUdJQVE2QUFNZ0FrRUJhaUVDSUFGQkFtb2hBUXdBQ3dBTFFRQWhBaUFGUVFBZ0JVRUFTaHNoQmlBRVFRaDBRWUQrQTNFaEJDQUFJUUVEUUNBQ0lBWkdEUU1nQ3lBQlFRRjBhaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitOd0FBSUFKQkFXb2hBaUFCUVFScUlRRU1BQXNBQzBFQUlRSWdCVUVBSUFWQkFFb2JJUVlnQkVFSWRFR0EvZ054SVFRZ0FDRUJBMEFnQWlBR1JnMENJQXNnQVVFQmRHb2lDaUFFSUFNZ0FpQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJaEUzQUFnZ0NpQVJOd0FBSUFKQkFXb2hBaUFCUVFocUlRRU1BQXNBQzBFQUlRRWdCVUVBSUFWQkFFb2JJUW9nQkVFSWRFR0EvZ054SVF3Z0FDRUVBMEFnQVNBS1JnMEJJQXNnQkVFQmRHb2hFQ0FNSUFNZ0FTQUhhbW90QU9nSGNxMUNnWUNFZ0pDQXdBQitJUkZCQUNFQ0EwQWdBaUFOVGtVRVFDQVFJQUpCQVhScUlnWWdFVGNBR0NBR0lCRTNBQkFnQmlBUk53QUlJQVlnRVRjQUFDQUNRUkJxSVFJTUFRc0xJQUZCQVdvaEFTQUVJQTFxSVFRTUFBc0FDeUFJUVFGcUlRZ2dCU0FIYWlFSElBVWdEV3dnQUdvaEFBd0FDd0FGSUFNZ0FrRUNkR29pQjBGQWF5QUJOZ0lBSUFKQkFXb2hBaUFIS0FJQUlBRnFJUUVNQVFzQUN3QUxJQThMSUFsQkVHb2tBQXZ5QWdFR2Z5TUFRU0JySWdVa0FDQUVLQUlBSVFZZ0JVRU1haUFDSUFNUURTSURRWWgvVFFSQUlBUkJCR29oQWlBQUlBRnFJZ2xCQTJzaEJFRUFJQVpCRUhaclFSOXhJUU1EUUNBRlFReHFFQThnQUNBRVQzSkZCRUFnQWlBRktBSU1JZ1lnQlNnQ0VDSUhkQ0FEZGtFQmRHb2lDQzBBQVNFS0lBQWdDQzBBQURvQUFDQUNJQVlnQnlBS2FpSUdkQ0FEZGtFQmRHb2lCeTBBQUNFSUlBVWdCaUFITFFBQmFqWUNFQ0FBSUFnNkFBRWdBRUVDYWlFQURBRUxDd05BSUFWQkRHb1FEeUVISUFVb0Fnd2hCaUFGS0FJUUlRUWdBQ0FKVHlBSGNrVUVRQ0FDSUFZZ0JIUWdBM1pCQVhScUlnWXRBQUFoQnlBRklBUWdCaTBBQVdvMkFoQWdBQ0FIT2dBQUlBQkJBV29oQUF3QkN3c0RRQ0FBSUFsUFJRUkFJQUlnQmlBRWRDQURka0VCZEdvaUJ5MEFBU0VJSUFBZ0J5MEFBRG9BQUNBQVFRRnFJUUFnQkNBSWFpRUVEQUVMQzBGc1FXd2dBU0FGS0FJVUlBVW9BaGhIR3lBRVFTQkhHeUVEQ3lBRlFTQnFKQUFnQXd2UEZBRWpmeU1BUWRBQWF5SUZKQUJCYkNFSkFrQWdBMEVLU1EwQUFrQWdBeUFDTHdBRUlnY2dBaThBQUNJSUlBSXZBQUlpRFdwcVFRWnFJZ3hKRFFBZ0JDOEJBaUVHSUFWQlBHb2dBa0VHYWlJQ0lBZ1FEU0lKUVloL1N3MEJJQVZCS0dvZ0FpQUlhaUlDSUEwUURTSUpRWWgvU3cwQklBVkJGR29nQWlBTmFpSUNJQWNRRFNJSlFZaC9TdzBCSUFVZ0FpQUhhaUFESUF4ckVBMGlDVUdJZjBzTkFTQUVRUVJxSVFvZ0FDQUJhaUlmUVFOcklTQkJBQ0FHYTBFZmNTRUxJQVVvQWdnaEVTQUZLQUljSVJJZ0JTZ0NNQ0VUSUFVb0FrUWhGQ0FGS0FJRUlRa2dCU2dDR0NFTklBVW9BaXdoRENBRktBSkFJUVlnQlNnQ0VDRWhJQVVvQWlRaElpQUZLQUk0SVNNZ0JTZ0NUQ0VrSUFVb0FnQWhGU0FGS0FJVUlSWWdCU2dDS0NFWElBVW9BandoR0VFQklROGdBQ0FCUVFOcVFRSjJJZ1JxSWdNZ0JHb2lBaUFFYWlJWklRUWdBaUVJSUFNaEJ3TkFJQTlCQVhGRklBUWdJRTl5UlFSQUlBQWdDaUFZSUFaMElBdDJRUUowYWlJT0x3RUFPd0FBSUE0dEFBSWhHaUFPTFFBRElSQWdCeUFLSUJjZ0RIUWdDM1pCQW5ScUlnNHZBUUE3QUFBZ0RpMEFBaUViSUE0dEFBTWhEeUFJSUFvZ0ZpQU5kQ0FMZGtFQ2RHb2lEaThCQURzQUFDQU9MUUFDSVJ3Z0RpMEFBeUVkSUFRZ0NpQVZJQWwwSUF0MlFRSjBhaUlPTHdFQU93QUFJQTR0QUFJaEhpQU9MUUFESVE0Z0FDQVFhaUlsSUFvZ0dDQUdJQnBxSWdaMElBdDJRUUowYWlJUUx3RUFPd0FBSUJBdEFBSWdFQzBBQXlFbUlBY2dEMm9pSnlBS0lCY2dEQ0FiYWlJYWRDQUxka0VDZEdvaUJ5OEJBRHNBQUNBSExRQUNJUXdnQnkwQUF5RVFJQWdnSFdvaUd5QUtJQllnRFNBY2FpSVBkQ0FMZGtFQ2RHb2lDQzhCQURzQUFDQUlMUUFDSVEwZ0NDMEFBeUVjSUFRZ0Rtb2lIU0FLSUJVZ0NTQWVhaUlPZENBTGRrRUNkR29pQ1M4QkFEc0FBQ0FHYWlFQVFRTWhCd0ovSUJRZ0pFa0VRQ0FBSVFaQkF3d0JDeUFBUVFkeElRWWdGQ0FBUVFOMmF5SVVLQUFBSVJoQkFBc2dDUzBBQXlFZUlBa3RBQUloQ0NBTUlCcHFJUUFnRXlBalNRUi9JQUFGSUJNZ0FFRURkbXNpRXlnQUFDRVhRUUFoQnlBQVFRZHhDeUVNSUEwZ0Qyb2hBQ0FIY2lFSlFRTWhEd0ovSUJJZ0lra0VRQ0FBSVExQkF3d0JDeUFBUVFkeElRMGdFaUFBUVFOMmF5SVNLQUFBSVJaQkFBc2dDQ0FPYWlFQUlBbHlJQkVnSVVrRWZ5QUFCU0FSSUFCQkEzWnJJaEVvQUFBaEZVRUFJUThnQUVFSGNRc2hDU0FsSUNacUlRQWdFQ0FuYWlFSElCc2dIR29oQ0NBZElCNXFJUVFnRDNKRklROE1BUXNMSUFVZ0REWUNMQ0FGSUFZMkFrQWdCU0FOTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBSWdCMGtnQUNBRFMzSU5BRUZzSVFrZ0NDQVpTdzBCSUFOQkEyc2hDUU5BSUFWQlBHb1FEMFVnQUNBSlNYRUVRQ0FBSUFvZ0JTZ0NQQ0lOSUFVb0FrQWlESFFnQzNaQkFuUnFJZzR2QVFBN0FBQWdBQ0FPTFFBRGFpSUdJQW9nRFNBTUlBNHRBQUpxSWdCMElBdDJRUUowYWlJTUx3RUFPd0FBSUFVZ0FDQU1MUUFDYWpZQ1FDQUdJQXd0QUFOcUlRQU1BUVVnQTBFQ2F5RU1BMEFnQlVFOGFoQVBJUVlnQlNnQ1BDRU5JQVVvQWtBaENTQUFJQXhMSUFaeVJRUkFJQUFnQ2lBTklBbDBJQXQyUVFKMGFpSUdMd0VBT3dBQUlBVWdDU0FHTFFBQ2FqWUNRQ0FBSUFZdEFBTnFJUUFNQVFzTEEwQWdBQ0FNUzBVRVFDQUFJQW9nRFNBSmRDQUxka0VDZEdvaUJpOEJBRHNBQUNBQUlBWXRBQU5xSVFBZ0NTQUdMUUFDYWlFSkRBRUxDd0pBSUFBZ0EwOE5BQ0FBSUFvZ0RTQUpkQ0FMZGlJQVFRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FKSUFNdEFBSnFJUWtNQVFzZ0NVRWZTdzBBUVNBZ0NTQUtJQUJCQW5ScUxRQUNhaUlBSUFCQklFOGJJUWtMSUFKQkEyc2hEQU5BSUFWQktHb1FEMFVnQnlBTVNYRUVRQ0FISUFvZ0JTZ0NLQ0lHSUFVb0Fpd2lBSFFnQzNaQkFuUnFJZzB2QVFBN0FBQWdCeUFOTFFBRGFpSURJQW9nQmlBQUlBMHRBQUpxSWdCMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FDQUdMUUFDYWpZQ0xDQURJQVl0QUFOcUlRY01BUVVnQWtFQ2F5RUdBMEFnQlVFb2FoQVBJUU1nQlNnQ0tDRU1JQVVvQWl3aEFDQUdJQWRKSUFOeVJRUkFJQWNnQ2lBTUlBQjBJQXQyUVFKMGFpSURMd0VBT3dBQUlBVWdBQ0FETFFBQ2FqWUNMQ0FISUFNdEFBTnFJUWNNQVFzTEEwQWdCaUFIU1VVRVFDQUhJQW9nRENBQWRDQUxka0VDZEdvaUF5OEJBRHNBQUNBSElBTXRBQU5xSVFjZ0FDQURMUUFDYWlFQURBRUxDd0pBSUFJZ0IwME5BQ0FISUFvZ0RDQUFkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FBSUFNdEFBSnFJUUFNQVFzZ0FFRWZTdzBBUVNBZ0FDQUtJQUpCQW5ScUxRQUNhaUlBSUFCQklFOGJJUUFMSUJsQkEyc2hEQU5BSUFWQkZHb1FEMFVnQ0NBTVNYRUVRQ0FJSUFvZ0JTZ0NGQ0lHSUFVb0FoZ2lBblFnQzNaQkFuUnFJZzB2QVFBN0FBQWdDQ0FOTFFBRGFpSURJQW9nQmlBQ0lBMHRBQUpxSWdKMElBdDJRUUowYWlJR0x3RUFPd0FBSUFVZ0FpQUdMUUFDYWpZQ0dDQURJQVl0QUFOcUlRZ01BUVVnR1VFQ2F5RURBMEFnQlVFVWFoQVBJUUlnQlNnQ0ZDRUdJQVVvQWhnaEJ5QURJQWhKSUFKeVJRUkFJQWdnQ2lBR0lBZDBJQXQyUVFKMGFpSUNMd0VBT3dBQUlBVWdCeUFDTFFBQ2FqWUNHQ0FJSUFJdEFBTnFJUWdNQVFzTEEwQWdBeUFJU1VVRVFDQUlJQW9nQmlBSGRDQUxka0VDZEdvaUFpOEJBRHNBQUNBSUlBSXRBQU5xSVFnZ0J5QUNMUUFDYWlFSERBRUxDd0pBSUFnZ0dVOE5BQ0FJSUFvZ0JpQUhkQ0FMZGlJQ1FRSjBhaUlETFFBQU9nQUFJQU10QUFOQkFVWUVRQ0FISUFNdEFBSnFJUWNNQVFzZ0IwRWZTdzBBUVNBZ0J5QUtJQUpCQW5ScUxRQUNhaUlDSUFKQklFOGJJUWNMQTBBZ0JSQVBSU0FFSUNCSmNRUkFJQVFnQ2lBRktBSUFJZ1lnQlNnQ0JDSUNkQ0FMZGtFQ2RHb2lEQzhCQURzQUFDQUVJQXd0QUFOcUlnTWdDaUFHSUFJZ0RDMEFBbW9pQW5RZ0MzWkJBblJxSWdRdkFRQTdBQUFnQlNBQ0lBUXRBQUpxTmdJRUlBTWdCQzBBQTJvaEJBd0JCU0FmUVFKcklRTURRQ0FGRUE4aEFpQUZLQUlBSVFZZ0JTZ0NCQ0VJSUFNZ0JFa2dBbkpGQkVBZ0JDQUtJQVlnQ0hRZ0MzWkJBblJxSWdJdkFRQTdBQUFnQlNBSUlBSXRBQUpxTmdJRUlBUWdBaTBBQTJvaEJBd0JDd3NEUUNBRElBUkpSUVJBSUFRZ0NpQUdJQWgwSUF0MlFRSjBhaUlDTHdFQU93QUFJQVFnQWkwQUEyb2hCQ0FJSUFJdEFBSnFJUWdNQVFzTEFrQWdCQ0FmVHcwQUlBUWdDaUFHSUFoMElBdDJJZ0pCQW5ScUlnTXRBQUE2QUFBZ0F5MEFBMEVCUmdSQUlBZ2dBeTBBQW1vaENBd0JDeUFJUVI5TERRQkJJQ0FJSUFvZ0FrRUNkR290QUFKcUlnSWdBa0VnVHhzaENBdEJiRUZzUVd4QmJFRnNRV3hCYkVGc0lBRWdDRUVnUnhzZ0JTZ0NDQ0FGS0FJTVJ4c2dCMEVnUnhzZ0JTZ0NIQ0FGS0FJZ1J4c2dBRUVnUnhzZ0JTZ0NNQ0FGS0FJMFJ4c2dDVUVnUnhzZ0JTZ0NSQ0FGS0FKSVJ4c2hDUXdKQ3dBTEFBc0FDd0FMQUFzQUN3QUxBQXRCYkNFSkN5QUZRZEFBYWlRQUlBa0w3QkFCSG44akFFSFFBR3NpQlNRQVFXd2hDUUpBSUFOQkNra05BQUpBSUFNZ0FpOEFCQ0lHSUFJdkFBQWlCeUFDTHdBQ0lnaHFha0VHYWlJT1NRMEFJQVF2QVFJaER5QUZRVHhxSUFKQkJtb2lBaUFIRUEwaUNVR0lmMHNOQVNBRlFTaHFJQUlnQjJvaUFpQUlFQTBpQ1VHSWYwc05BU0FGUVJScUlBSWdDR29pQWlBR0VBMGlDVUdJZjBzTkFTQUZJQUlnQm1vZ0F5QU9heEFOSWdsQmlIOUxEUUVnQkVFRWFpRUtJQUFnQVdvaUhFRURheUVkUVFBZ0QydEJIM0VoQ3lBRktBSUlJUkVnQlNnQ0hDRVNJQVVvQWpBaEV5QUZLQUpFSVJRZ0JTZ0NCQ0VKSUFVb0FoZ2hCaUFGS0FJc0lRY2dCU2dDUUNFSUlBVW9BaEFoSGlBRktBSWtJUjhnQlNnQ09DRWdJQVVvQWt3aElTQUZLQUlBSVJVZ0JTZ0NGQ0VXSUFVb0FpZ2hGeUFGS0FJOElSaEJBU0VOSUFBZ0FVRURha0VDZGlJQ2FpSU9JQUpxSWc4Z0Ftb2lHU0VFSUE4aEFpQU9JUU1EUUNBTlJTQUVJQjFQY2tVRVFDQUtJQmdnQ0hRZ0MzWkJBWFJxSWd3dEFBRWhEU0FBSUF3dEFBQTZBQUFnQ2lBWElBZDBJQXQyUVFGMGFpSU1MUUFCSVJBZ0F5QU1MUUFBT2dBQUlBb2dGaUFHZENBTGRrRUJkR29pREMwQUFTRWFJQUlnREMwQUFEb0FBQ0FLSUJVZ0NYUWdDM1pCQVhScUlnd3RBQUVoR3lBRUlBd3RBQUE2QUFBZ0NpQVlJQWdnRFdvaUNIUWdDM1pCQVhScUlnd3RBQUVoRFNBQUlBd3RBQUE2QUFFZ0NpQVhJQWNnRUdvaUIzUWdDM1pCQVhScUlnd3RBQUVoRUNBRElBd3RBQUE2QUFFZ0NpQVdJQVlnR21vaURIUWdDM1pCQVhScUlnWXRBQUVoR2lBQ0lBWXRBQUE2QUFFZ0NpQVZJQWtnRzJvaUczUWdDM1pCQVhScUlna3RBQUVoSWlBRUlBa3RBQUE2QUFFZ0NDQU5haUVHUVFNaENRSi9JQlFnSVVrRVFFRURJUTBnQmd3QkN5QVVJQVpCQTNackloUW9BQUFoR0VFQUlRMGdCa0VIY1FzaENDQUhJQkJxSVFZZ0V5QWdTUVIvSUFZRklCTWdCa0VEZG1zaUV5Z0FBQ0VYUVFBaENTQUdRUWR4Q3lFSElBd2dHbW9oRENBSklBMXlJUkJCQXlFTkFuOGdFaUFmU1FSQUlBd2hCa0VEREFFTElBeEJCM0VoQmlBU0lBeEJBM1pySWhJb0FBQWhGa0VBQ3lBYklDSnFJUXdnRUhJaEVDQVJJQjVKQkg4Z0RBVWdFU0FNUVFOMmF5SVJLQUFBSVJWQkFDRU5JQXhCQjNFTElRa2dCRUVDYWlFRUlBSkJBbW9oQWlBRFFRSnFJUU1nQUVFQ2FpRUFJQTBnRUhKRklRME1BUXNMSUFVZ0J6WUNMQ0FGSUFnMkFrQWdCU0FHTmdJWUlBVWdDVFlDQkNBRklCUTJBa1FnQlNBVE5nSXdJQVVnRWpZQ0hDQUZJQkUyQWdnZ0JTQVlOZ0k4SUFVZ0Z6WUNLQ0FGSUJZMkFoUWdCU0FWTmdJQUlBQWdEa3NnQXlBUFMzSU5BRUZzSVFrZ0FpQVpTdzBCSUE1QkEyc2hDUU5BSUFWQlBHb1FEeUFBSUFsUGNrVUVRQ0FLSUFVb0Fqd2lCaUFGS0FKQUlnZDBJQXQyUVFGMGFpSUlMUUFCSVF3Z0FDQUlMUUFBT2dBQUlBb2dCaUFISUF4cUlnWjBJQXQyUVFGMGFpSUhMUUFBSVFnZ0JTQUdJQWN0QUFGcU5nSkFJQUFnQ0RvQUFTQUFRUUpxSVFBTUFRc0xBMEFnQlVFOGFoQVBJUWNnQlNnQ1BDRUdJQVVvQWtBaENTQUFJQTVQSUFkeVJRUkFJQW9nQmlBSmRDQUxka0VCZEdvaUJpMEFBQ0VISUFVZ0NTQUdMUUFCYWpZQ1FDQUFJQWM2QUFBZ0FFRUJhaUVBREFFTEN3TkFJQUFnRGs5RkJFQWdDaUFHSUFsMElBdDJRUUYwYWlJSExRQUJJQUFnQnkwQUFEb0FBQ0FBUVFGcUlRQWdDV29oQ1F3QkN3c2dEMEVEYXlFQUEwQWdCVUVvYWhBUElBQWdBMDF5UlFSQUlBb2dCU2dDS0NJR0lBVW9BaXdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFESUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWl3Z0F5QUlPZ0FCSUFOQkFtb2hBd3dCQ3dzRFFDQUZRU2hxRUE4aEJ5QUZLQUlvSVFZZ0JTZ0NMQ0VBSUFNZ0QwOGdCM0pGQkVBZ0NpQUdJQUIwSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FBSUFZdEFBRnFOZ0lzSUFNZ0J6b0FBQ0FEUVFGcUlRTU1BUXNMQTBBZ0F5QVBUMFVFUUNBS0lBWWdBSFFnQzNaQkFYUnFJZ2N0QUFFaENDQURJQWN0QUFBNkFBQWdBMEVCYWlFRElBQWdDR29oQUF3QkN3c2dHVUVEYXlFREEwQWdCVUVVYWhBUElBSWdBMDl5UlFSQUlBb2dCU2dDRkNJR0lBVW9BaGdpQjNRZ0MzWkJBWFJxSWdndEFBRWhEaUFDSUFndEFBQTZBQUFnQ2lBR0lBY2dEbW9pQm5RZ0MzWkJBWFJxSWdjdEFBQWhDQ0FGSUFZZ0J5MEFBV28yQWhnZ0FpQUlPZ0FCSUFKQkFtb2hBZ3dCQ3dzRFFDQUZRUlJxRUE4aEJ5QUZLQUlVSVFZZ0JTZ0NHQ0VESUFJZ0dVOGdCM0pGQkVBZ0NpQUdJQU4wSUF0MlFRRjBhaUlHTFFBQUlRY2dCU0FESUFZdEFBRnFOZ0lZSUFJZ0J6b0FBQ0FDUVFGcUlRSU1BUXNMQTBBZ0FpQVpUMFVFUUNBS0lBWWdBM1FnQzNaQkFYUnFJZ2N0QUFFaENDQUNJQWN0QUFBNkFBQWdBa0VCYWlFQ0lBTWdDR29oQXd3QkN3c0RRQ0FGRUE4Z0JDQWRUM0pGQkVBZ0NpQUZLQUlBSWdJZ0JTZ0NCQ0lHZENBTGRrRUJkR29pQnkwQUFTRUlJQVFnQnkwQUFEb0FBQ0FLSUFJZ0JpQUlhaUlDZENBTGRrRUJkR29pQmkwQUFDRUhJQVVnQWlBR0xRQUJhallDQkNBRUlBYzZBQUVnQkVFQ2FpRUVEQUVMQ3dOQUlBVVFEeUVISUFVb0FnQWhCaUFGS0FJRUlRSWdCQ0FjVHlBSGNrVUVRQ0FLSUFZZ0FuUWdDM1pCQVhScUlnWXRBQUFoQnlBRklBSWdCaTBBQVdvMkFnUWdCQ0FIT2dBQUlBUkJBV29oQkF3QkN3c0RRQ0FFSUJ4UFJRUkFJQW9nQmlBQ2RDQUxka0VCZEdvaUJ5MEFBU0VJSUFRZ0J5MEFBRG9BQUNBRVFRRnFJUVFnQWlBSWFpRUNEQUVMQzBGc1FXeEJiRUZzUVd4QmJFRnNRV3dnQVNBQ1FTQkhHeUFGS0FJSUlBVW9BZ3hIR3lBRFFTQkhHeUFGS0FJY0lBVW9BaUJIR3lBQVFTQkhHeUFGS0FJd0lBVW9BalJIR3lBSlFTQkhHeUFGS0FKRUlBVW9Ba2hIR3lFSkRBRUxRV3doQ1FzZ0JVSFFBR29rQUNBSkMxZ0JBMzhDUUNBQUtBS1E2d0VpQVVVTkFDQUJLQUlBSUFGQnROVUJhaWdDQUNJQ0lBRkJ1TlVCYWlnQ0FDSURFQk1nQWdSQUlBTWdBU0FDRVFJQURBRUxJQUVRQmdzZ0FFRUFOZ0tnNndFZ0FFSUFOd09RNndFTDZRTUNCSDhDZmlBQVFRQkJLQkFESVFRZ0FrRUJRUVVnQXhzaUFFa0VRQ0FBRHdzZ0FVVUVRRUYvRHd0QkFTRUdBa0FDUUNBRFFRRkdEUUFnQXlFR0lBRW9BQUFpQlVHbzZyNXBSZzBBUVhZaEF5QUZRWEJ4UWREVXRNSUJSdzBCUVFnaEF5QUNRUWhKRFFFZ0FUVUFCQ0VJSUFSQkFUWUNGQ0FFSUFnM0F3QkJBQThMSUFFZ0FpQUdFQm9pQXlBQ1N3MEFJQVFnQXpZQ0dFRnlJUU1nQUNBQmFpSUZRUUZyTFFBQUlnSkJDSEVOQUNBQ1FTQnhJZ1pGQkVCQmNDRURJQVV0QUFBaUJVR25BVXNOQVNBRlFRZHhyVUlCSUFWQkEzWkJDbXF0aGlJSVFnT0lmaUFJZkNFSklBQkJBV29oQUFzZ0FrRUdkaUVGSUFKQkFuWkJBQ0VEQWtBQ1FBSkFBa0FnQWtFRGNVRUJhdzREQUFFQ0F3c2dBQ0FCYWkwQUFDRURJQUJCQVdvaEFBd0NDeUFBSUFGcUx3QUFJUU1nQUVFQ2FpRUFEQUVMSUFBZ0FXb29BQUFoQXlBQVFRUnFJUUFMUVFGeElRSUNmZ0pBQWtBQ1FBSkFJQVZCQVdzT0F3RUNBd0FMUW44Z0JrVU5BeG9nQUNBQmFqRUFBQXdEQ3lBQUlBRnFNd0FBUW9BQ2ZBd0NDeUFBSUFGcU5RQUFEQUVMSUFBZ0FXb3BBQUFMSVFnZ0JDQUNOZ0lnSUFRZ0F6WUNIQ0FFSUFnM0F3QkJBQ0VESUFSQkFEWUNGQ0FFSUFnZ0NTQUdHeUlJTndNSUlBUkNnSUFJSUFnZ0NFS0FnQWhhR3o0Q0VBc2dBd3RmQVFGL1FiaC9JUU1nQVVFQlFRVWdBaHNpQWs4RWZ5QUFJQUpxUVFGckxRQUFJZ0JCQTNGQkFuUkJvQjVxS0FJQUlBSnFJQUJCQkhaQkRIRkJzQjVxS0FJQWFpQUFRU0J4SWdGRmFpQUJRUVYySUFCQndBQkpjV29GUWJoL0N3c01BQ0FBSUFFZ0FrRUFFQmtMbHdNQ0JYOENmaU1BUVVCcUlnUWtBQUpBQTBBZ0FVRUZUd1JBQWtBZ0FDZ0FBRUZ3Y1VIUTFMVENBVVlFUUVKK0lRY2dBVUVJU1EwRUlBQW9BQVFpQWtGM1N3MEVJQUpCQ0dvaUF5QUJTdzBFSUFKQmdYOUpEUUVNQkFzZ0JFRVlhaUFBSUFFUUd5RUNRbjRnQkNrREdFSUFJQVFvQWl4QkFVY2JJQUliSWdkQ2ZWWU5BeUFISUFoOElnZ2dCMVJDZmlFSERRTUNRQUpBSUFGQkNFa05BQ0FBS0FBQVFYQnhRZERVdE1JQlJ3MEFJQUFvQUFRaUFrRjNTdzBGUWJoL0lBSkJDR29pQWlBQklBSkpHeUVEREFFTElBUkJHR29nQUNBQkVCc2lBa0dJZjBzRVFDQUNJUU1NQVF0QnVIOGhBeUFDRFFBZ0FTQUVLQUl3SWdKcklRVWdBQ0FDYWlFR0EwQWdCaUFGSUFSQkRHb1FIU0lEUVloL1N3MEJJQU5CQTJvaUFpQUZTd1JBUWJoL0lRTU1BZ3NnQlNBQ2F5RUZJQUlnQm1vaEJpQUVLQUlRUlEwQUN5QUVLQUk0Qkg5QnVIOGhBeUFGUVFSSkRRRWdCa0VFYWdVZ0Jnc2dBR3NoQXdzZ0EwR0lmMHNOQXdzZ0FTQURheUVCSUFBZ0Eyb2hBQXdCQ3d0Q2ZpQUlJQUViSVFjTElBUkJRR3NrQUNBSEMyUUJBWDlCdUg4aEF3SkFJQUZCQTBrTkFDQUFMUUFDSVFFZ0FpQUFMd0FBSWdCQkFYRTJBZ1FnQWlBQVFRRjJRUU54SWdNMkFnQWdBaUFBSUFGQkVIUnlRUU4ySWdBMkFnZ0NRQUpBSUFOQkFXc09Bd0lCQUFFTFFXd1BDeUFBSVFNTElBTUxSQUVDZnlBQklBSW9BZ1FpQXlBQktBSUVhaUlFTmdJRUlBQWdBMEVDZEVHZ0hXb29BZ0FnQVNnQ0FFRUFJQVJyZG5FMkFnQWdBUkFQR2lBQUlBSkJDR28yQWdRTHpnRUJCbjlCdW44aENnSkFJQUlvQWdRaUNDQUNLQUlBSWdscUlnMGdBU0FBYTBzTkFFRnNJUW9nQ1NBRUlBTW9BZ0FpQzJ0TERRQWdBQ0FKYWlJRUlBSW9BZ2dpREdzaEFpQUFJQUZCSUdzaUFDQUxJQWxCQUJBZ0lBTWdDU0FMYWpZQ0FBSkFBa0FnQkNBRmF5QU1Ud1JBSUFJaEJRd0JDeUFNSUFRZ0JtdExEUUlnQnlBSElBSWdCV3NpQW1vaUFTQUlhazhFUUNBRUlBRWdDQkFLR2d3Q0N5QUNJQWhxSVFnZ0JDQUJRUUFnQW1zUUNpQUNheUVFQ3lBRUlBQWdCU0FJUVFFUUlBc2dEU0VLQ3lBS0M4Y0VBUUovSUFBZ0Eyb2hCZ0pBSUFOQkIwd0VRQU5BSUFBZ0JrOE5BaUFBSUFJdEFBQTZBQUFnQUVFQmFpRUFJQUpCQVdvaEFnd0FDd0FMSUFSQkFVWUVRQUpBSUFBZ0Ftc2lCVUVIVFFSQUlBQWdBaTBBQURvQUFDQUFJQUl0QUFFNkFBRWdBQ0FDTFFBQ09nQUNJQUFnQWkwQUF6b0FBeUFBSUFJZ0JVRUNkQ0lGUWNBZWFpZ0NBR29pQWlnQUFEWUFCQ0FDSUFWQjRCNXFLQUlBYXlFQ0RBRUxJQUFnQWlrQUFEY0FBQXNnQWtFSWFpRUNJQUJCQ0dvaEFBc2dBU0FHVHdSQUlBQWdBMm9oQVNBRVFRRkhJQUFnQW10QkQwcHlSUVJBQTBBZ0FDQUNLUUFBTndBQUlBSkJDR29oQWlBQVFRaHFJZ0FnQVVrTkFBd0RDd0FMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0EwRVJTUTBCSUFCQkVHb2hBQU5BSUFBZ0Fpa0FFRGNBQUNBQUlBSXBBQmczQUFnZ0FDQUNLUUFnTndBUUlBQWdBaWtBS0RjQUdDQUNRU0JxSVFJZ0FFRWdhaUlBSUFGSkRRQUxEQUVMQWtBZ0FDQUJTd1JBSUFBaEFRd0JDeUFCSUFCcklRVUNRQ0FFUVFGSElBQWdBbXRCRDBweVJRUkFJQUloQXdOQUlBQWdBeWtBQURjQUFDQURRUWhxSVFNZ0FFRUlhaUlBSUFGSkRRQUxEQUVMSUFBZ0Fpa0FBRGNBQUNBQUlBSXBBQWczQUFnZ0JVRVJTQTBBSUFCQkVHb2hBQ0FDSVFNRFFDQUFJQU1wQUJBM0FBQWdBQ0FES1FBWU53QUlJQUFnQXlrQUlEY0FFQ0FBSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUJCSUdvaUFDQUJTUTBBQ3dzZ0FpQUZhaUVDQ3dOQUlBRWdCazhOQVNBQklBSXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2hBZ3dBQ3dBTEM2NEhBZ1YvQVg0akFFR0FBV3NpRVNRQUlCRWdBellDZkVGL0lROENRQUpBQWtBQ1FBSkFJQUlPQkFFQUF3SUVDeUFHUlFSQVFiaC9JUThNQkF0QmJDRVBJQVV0QUFBaUFpQURTdzBESUFnZ0FrRUNkQ0lDYWlnQ0FDRURJQUlnQjJvb0FnQWhBaUFBUVFBNkFBc2dBRUlBTndJQUlBQWdBallDRENBQUlBTTZBQW9nQUVFQU93RUlJQUVnQURZQ0FFRUJJUThNQXdzZ0FTQUpOZ0lBUVFBaER3d0NDeUFLUlFSQVFXd2hEd3dDQzBFQUlROGdDMFVnREVFWlNISU5BVUVJSUFSMFFRaHFJUUJCQUNFREEwQWdBQ0FEVFEwQ0lBTkJRR3NoQXd3QUN3QUxRV3doRHlBUklCRkIvQUJxSUJGQitBQnFJQVVnQmhBTUlnTkJpSDlMRFFBZ0VTZ0NlQ0lDSUFSTERRQWdFU2dDZkVFQmFpRUpJQUJCQ0dvaEMwR0FnQUlnQW5SQkVIVWhCVUVCSVJCQkFTQUNkQ0lQUVFGcklnb2hFZ05BSUFrZ0RrY0VRQUpBSUJFZ0RrRUJkQ0lFYWk4QkFDSU1RZi8vQTBZRVFDQUxJQkpCQTNScUlBNDJBZ1FnRWtFQmF5RVNRUUVoREF3QkN5QVFRUUFnQlNBTXdVb2JJUkFMSUFRZ0RXb2dERHNCQUNBT1FRRnFJUTRNQVFzTElBQWdBallDQkNBQUlCQTJBZ0FDUUNBS0lCSkdCRUFnRFVIcUFHb2hCa0VBSVJCQkFDRU1BMEFnQ1NBUVJnUkFJQTlCQTNZZ0QwRUJkbXBCQTJvaUJVRUJkQ0VFUVFBaERFRUFJUklEUUVFQUlRNGdEeUFTVFEwRUEwQWdEa0VDUndSQUlBc2dCU0FPYkNBTWFpQUtjVUVEZEdvZ0JpQU9JQkpxYWkwQUFEWUNCQ0FPUVFGcUlRNE1BUXNMSUJKQkFtb2hFaUFFSUF4cUlBcHhJUXdNQUFzQUJTQVJJQkJCQVhScUxnRUFJUVVnQmlBTWFpSUVJQk0zQUFCQkNDRU9BMEFnQlNBT1NnUkFJQVFnRG1vZ0V6Y0FBQ0FPUVFocUlRNE1BUXNMSUJOQ2dZS0VpSkNnd0lBQmZDRVRJQkJCQVdvaEVDQUZJQXhxSVF3TUFRc0FDd0FMSUE5QkEzWWdEMEVCZG1wQkEyb2hCVUVBSVJCQkFDRU9BMEFnQ1NBUVJnMEJRUUFoRENBUklCQkJBWFJxTGdFQUlnUkJBQ0FFUVFCS0d5RUVBMEFnQkNBTVJ3UkFJQXNnRGtFRGRHb2dFRFlDQkFOQUlBVWdEbW9nQ25FaURpQVNTdzBBQ3lBTVFRRnFJUXdNQVFzTElCQkJBV29oRUF3QUN3QUxJQUpCQVdvaEJVRUFJUXdEUUNBTUlBOUhCRUFnRFNBTElBeEJBM1JxSWdrb0FnUWlCRUVCZEdvaUFpQUNMd0VBSWdaQkFXbzdBUUFnQ1NBRklBWm5RV0J6YWlJQ09nQURJQWtnQmlBQ2RDQVBhenNCQUNBSklBZ2dCRUVDZENJQ2FpZ0NBRG9BQWlBSklBSWdCMm9vQWdBMkFnUWdERUVCYWlFTURBRUxDeUFCSUFBMkFnQWdBeUVQQ3lBUlFZQUJhaVFBSUE4TDdWb0NPMzhHZmlNQVFlQUJheUlFSkFBQ1FFR3c3QWtRQlNJRlJRUkFRVUFoQnd3QkN5QUZRZ0EzQXZUcUFTQUZRUUEyQXNUckFTQUZRUUEyQXJUckFTQUZRZ0EzQXB6ckFTQUZRUUEyQXJqcEFTQUZRUUEyQXF6c0NTQUZRZ0EzQXRUckFTQUZRZ0EzQXF6ckFTQUZRZ0EzQTRqckFTQUZRZ0EzQXVUcUFTQUZRZ0EzQXVUckFTQUZRWUdBZ01BQU5nSzg2d0VnQlVJQU53S2s2d0VnQlVIODZnRnFRUUEyQWdBZ0JVR1E2d0ZxUWdBM0F3QWdCUkFZSUFWQnJOVUJhaUVVSUFWQitPc0JhaUVjSUFWQnNPb0JhaUVpSUFWQm9EQnFJU29nQlVHWUlHb2hLeUFGUWFqUUFHb2hIaUFGUVJCcUlTd2dCVUVJYWlFb0lBVkJCR29oTFNBRlFjRHBBV29oS1NBRlFZanJBV29nQkVHVUFXb2hMeUFFUVl3QmFpRXdJQVJCaEFGcUlURWdCRUhjQUdvaE1pQUVRZFFBYWlFeklBUkJ6QUJxSVRRZ0FDRWRBa0FDUUFKQUFrQUNRQU5BUVFGQkJTQUZLQUxrNmdFYklRWUNRQU5BSUFNZ0Jra05BU0FDS0FBQVFYQnhRZERVdE1JQlJnUkFRYmgvSVFjZ0EwRUlTUTBJSUFJb0FBUWlEa0YzU3dSQVFYSWhCd3dKQ3lBRElBNUJDR29pQ1VrTkNDQU9RWUIvU3dSQUlBa2hCd3dKQ3lBRElBbHJJUU1nQWlBSmFpRUNEQUVMQ3lBRlFnQTNBcXpwQVNBRlFnQTNBK2pwQVNBRlFRQTJBcGpyQVNBRlFnQTNBNERxQVNBRlFnTTNBL2pwQVNBRlFiVHBBV3BDQURjQ0FDQUZRZkRwQVdwQ0FEY0RBQ0FGUWFqUUFHb2lDVUdNZ0lEZ0FEWUNBQ0FGUWF6UUFXcEI0QklwQWdBM0FnQWdCVUcwMEFGcVFlZ1NLQUlBTmdJQUlBVWdCVUVRYWpZQ0FDQUZJQVZCb0RCcU5nSUVJQVVnQlVHWUlHbzJBZ2dnQlNBSk5nSU1JQVZCQVVFRklBVW9BdVRxQVJzMkFyenBBUUpBSUFGRkRRQWdCU2dDck9rQklna2dIVVlOQUNBRklBazJBcmpwQVNBRklCMDJBcXpwQVNBRktBS3c2UUVoRGlBRklCMDJBckRwQVNBRklCMGdEaUFKYTJvMkFyVHBBUXRCdUg4aENTQURRUVZCQ1NBRktBTGs2Z0VpQmh0SkRRVWdBa0VCUVFVZ0Joc2dCaEFhSWc1QmlIOUxCRUFnRGlFSkRBVUxJQU1nRGtFRGFra05CU0FwSUFJZ0RpQUdFQmtpQmtHSWYwc0VRQ0FHSVFrTUJRc2dCZzBGQWtBQ1FDQUZLQUtvNndGQkFVY05BQ0FGS0FLazZ3RWlDVVVOQUNBRktBS1U2d0ZGRFFBZ0NTZ0NCRUVCYXlJSElBVW9BdHpwQVNJS3JVS0hsYSt2bUxiZW01NS9ma0xKejlteThlVzY2aWVGUWhlSlFzL1cwNzdTeDZ2WlFuNUMrZlBkOFpuMm1hc1dmQ0kvUWlHSUlEK0ZRcy9XMDc3U3g2dlpRbjRpUDBJZGlDQS9oVUw1ODkzeG1mYVpxeForSWo5Q0lJZ2dQNFduY1NFR0lBa29BZ0FoRlFOQVFRQWhDQUpBSUJVZ0JrRUNkR29vQWdBaUNVVU5BQ0FKS0FJSVFRaEpEUUFnQ1NnQ0JDSVNLQUFBUWJmSXd1RitSdzBBSUJJb0FBUWhDQXNnQ0NBS1J3UkFJQVlnQjNGQkFXb2hCaUFJRFFFTEN5QUpSUTBBSUFVUUdDQUZRWDgyQXFEckFTQUZJQWsyQXBUckFTQUZJQVVvQXR6cEFTSUlOZ0tZNndFTUFRc2dCU2dDM09rQklRZ0xBa0FnQ0VVTkFDQUZLQUtZNndFZ0NFWU5BRUZnSVFrTUJnc0NRQ0FGS0FMZzZRRUVRQ0FGSUFVb0F1anFBU0lKUlRZQzdPb0JJQWtOQVNBRlF2bnEwTkRueWFIazRRQTNBNmpxQVNBRlFnQTNBNkRxQVNBRlFzL1cwNzdTeDZ2WlFqY0RtT29CSUFWQzF1dUM3dXI5aWZYZ0FEY0RrT29CSUFWQ0FEY0RpT29CSUNKQkFFRW9FQU1hREFFTElBVkJBRFlDN09vQkN5QUJJQjFxSVNVZ0JTQUZLUVBvNlFFZ0RxMThOd1BvNlFFZ0F5QU9heUVESUFJZ0Rtb2hBaUFkSVE0RFFDQUNJQU1nQkVFc2FoQWRJaFZCaUg5TEJFQWdGU0VKREFZTElBTkJBMnNpTlNBVlNRMEVJQUpCQTJvaEcwRnNJUWtDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVLQUlzRGdNQ0FRQVZDeUFWUWYvL0Iwc05FeUFWUVFOSkRSSWdCU2tEeU9rQklUOENRQUpBSUJzdEFBQWlDVUVEY1NJYVFRRnJEZ01HQVFBSEN5QUZLQUtBNmdFTkFFRmlJUWtNRlFzZ0ZVRUZTUTBTSUJzb0FBQWhBd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRWlDVUVDYXc0Q0FRSUFDeUFKUVFCSElRY2dBMEVFZGtIL0IzRWhDMEVESVFZZ0EwRU9ka0gvQjNFTUFndEJCQ0VHSUFOQkJIWkIvLzhBY1NFTFFRRWhCeUFEUVJKMkRBRUxJQU5CQkhaQi8vOFBjU0lMUVlDQUNFc05FMEVCSVFkQkJTRUdJQUl0QUFkQkNuUWdBMEVXZG5JTElnZ2dCbW9pQ1NBVlN3MFNBa0FnQzBHQkJra05BQ0FGS0FLYzZ3RkZEUUJCQUNFREEwQWdBMEdEZ0FGTERRRWdBMEZBYXlFRERBQUxBQXNnQmlBYmFpRVBJQnBCQTBjTkJpQUZLQUlNSWdJdEFBRkJDSFFoQXlBSERRY2dBMFVOQ0NBRVFmQUFhaUFQSUFnUURTSURRWWgvU3cwSklBSkJCR29oQmlBTElCeHFJaEpCQTJzaENrRUFJQUl2QVFKclFSOXhJUWNnSENFREEwQWdCRUh3QUdvUUQwVWdBeUFLU1hFRVFDQURJQVlnQkNnQ2NDSUlJQVFvQW5RaUQzUWdCM1pCQW5ScUlnSXZBUUE3QUFBZ0F5QUNMUUFEYWlJRElBWWdDQ0FQSUFJdEFBSnFJZ2gwSUFkMlFRSjBhaUlDTHdFQU93QUFJQVFnQ0NBQ0xRQUNhallDZENBRElBSXRBQU5xSVFNTUFRVWdFa0VDYXlFSUEwQWdCRUh3QUdvUUR5RVBJQVFvQW5BaENpQUVLQUowSVFJZ0F5QUlTeUFQY2tVRVFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUNpOEJBRHNBQUNBRUlBSWdDaTBBQW1vMkFuUWdBeUFLTFFBRGFpRUREQUVMQ3dOQUlBTWdDRTBFUUNBRElBWWdDaUFDZENBSGRrRUNkR29pRHk4QkFEc0FBQ0FESUE4dEFBTnFJUU1nQWlBUExRQUNhaUVDREFFTEN3SkFJQU1nRWs4TkFDQURJQVlnQ2lBQ2RDQUhka0VDZEdvaUF5MEFBRG9BQUNBRExRQURRUUZHQkVBZ0FpQURMUUFDYWlFQ0RBRUxJQUpCSDBzTkFFRWdJQUlnQXkwQUFtb2lBaUFDUVNCUEd5RUNDMEZzUVd3Z0N5QUVLQUo0SUFRb0FueEhHeUFDUVNCSEd5RUREQXNMQUFzQUN5QUVLQUkwSWdJZ0pTQU9hMHNOQ2lBT1JRUkFRUUFoQ1NBQ0RRSU1EZ3NnRGlBYkxRQUFJQUlRQXhvZ0FpRUpEQXdMSUJVZ0pTQU9hMHNOQ1NBT0RRRkJBQ0VKSUJWRkRRd0xRYlovSVFrTUVRc2dEaUFiSUJVUUFob2dGU0VKREFvTElCd2dHd0ovQWtBQ1FBSkFJQWxCQW5aQkEzRkJBV3NPQXdFQUFnQUxJQWxCQTNZaEEwRUJEQUlMSUJzdkFBQkJCSFloQTBFQ0RBRUxJQlZCQkVrTkRpQUNMd0FESUFJdEFBVkJFSFJ5SWdKQmo0Q0FBVXNORGlBQ1FRUjJJUU5CQXdzaUFtb3RBQUFnQTBFZ2FoQURJUWtnQlNBRE5nS0E2d0VnQlNBSk5nTHc2Z0VnQWtFQmFpRUpEQVVMSUJVQ2Z3SkFBa0FDUUNBSlFRSjJRUU54UVFGckRnTUJBQUlBQ3lBSlFRTjJJUU5CQVF3Q0N5QWJMd0FBUVFSMklRTkJBZ3dCQ3lBQ0x3QURJQUl0QUFWQkVIUnlRUVIySVFOQkF3c2lBaUFEYWlJSlFTQnFTUVJBSUFrZ0ZVc05EU0FjSUFJZ0cyb2dBeEFDSVFJZ0JTQUROZ0tBNndFZ0JTQUNOZ0x3NmdFZ0FpQURhaUlDUWdBM0FCZ2dBa0lBTndBUUlBSkNBRGNBQ0NBQ1FnQTNBQUFNQlFzZ0JTQUROZ0tBNndFZ0JTQUNJQnRxTmdMdzZnRU1CQXNnQjBVRVFDQWVJQThnQ0NBVUVCUWlBa0dJZjBzZ0FpQUlUM0lORENBY0lBc2dBaUFQYWlBSUlBSnJJQjRRRlNFRERBTUxJQXRGSUFoRmNnMExJQXRCQ0hZaUF5QUlJQXRKQkg4Z0NFRUVkQ0FMYmdWQkR3dEJHR3dpQWtHTUNHb29BZ0JzSUFKQmlBaHFLQUlBYWlJR1FRTjJJQVpxSUFKQmdBaHFLQUlBSUFKQmhBaHFLQUlBSUFOc2Fra0VRQ01BUVJCckloQWtBQ0FlS0FJQUlRTWdGRUh3QkdwQkFFSHNBQkFESVFaQlZDRUNBa0FnQTBIL0FYRWlERUVNU3cwQUFrQWdGRUhjQ1dvZ0JpQVFRUWhxSUJCQkRHb2dEeUFJSUJSQjNBdHFJaGNRQ3lJU1FZaC9TdzBBSUJBb0Fnd2lCaUFNU3cwQklCUkJxQVZxSVEwZ0ZFR2tCV29oTmlBZVFRUnFJUkVnQTBHQWdJQjRjU0UzSUFaQkFXb2lFeUVDSUFZaEF3TkFJQUlpQjBFQmF5RUNJQU1pQ2tFQmF5RURJQlFnQ2tFQ2RHb29BdkFFUlEwQUMwRUJJQWNnQjBFQlRSc2hGa0VBSVFkQkFTRUNBMEFnQWlBV1J3UkFJQlFnQWtFQ2RDSURhaWdDOEFRaEdDQURJQTFxSUFjMkFnQWdBa0VCYWlFQ0lBY2dHR29oQnd3QkN3c2dEU0FITmdJQVFRQWhBaUFRS0FJSUlRTURRQ0FDSUFOSEJFQWdEU0FDSUJScVFkd0phaTBBQUNJWVFRSjBhaUlaSUJrb0FnQWlHVUVCYWpZQ0FDQVVJQmxCQVhScUloa2dHRG9BM1FVZ0dTQUNPZ0RjQlNBQ1FRRnFJUUlNQVFzTFFRQWhBeUFOUVFBMkFnQWdEQ0FHUVg5emFpRUdRUUVoQWdOQUlBSWdGa2NFUUNBVUlBSkJBblJxSWcwZ0F6WUNBQ0FOS0FMd0JDQUNJQVpxZENBRGFpRURJQUpCQVdvaEFnd0JDd3NnRENBVElBcHJJZ1pyUVFGcUlRb2dCaUVEQTBBZ0F5QUtTUVJBSUJRZ0EwRTBiR29oRFVFQklRSURRQ0FDSUJaSEJFQWdEU0FDUVFKMEloaHFJQlFnR0dvb0FnQWdBM1kyQWdBZ0FrRUJhaUVDREFFTEN5QURRUUZxSVFNTUFRc0xJQmNnRkVFMEVBSWhPQ0FVUVpBTWFpRTVJQk1nREdzaE9pQVVRZHdGYWlFWFFRQWhDZ05BQWtBQ1FDQUhJQXBIQkVCQkFTQU1JQk1nRnlBS1FRRjBhaUlDTFFBQklnMXJJZ05ySWhoMElSa2dBaTBBQUNFV0lEZ2dEVUVDZEdvaUh5Z0NBQ0VDSUFZZ0dFMEVRQ0EyUVFFZ0F5QTZhaUlOSUExQkFVd2JJaUJCQW5RaUpHb29BZ0FoRFNBNUlCUWdBMEUwYkdwQk5CQUNJU0VnRFVFQmRDRW1JQkVnQWtFQ2RHb2hJeUFnUVFGTkRRSWdBMEVRZEVHQWdQd0hjU0FXY2tHQWdJQUljaUVnSUNFZ0pHb29BZ0FoSkVFQUlRSURRQ0FDSUNSR0RRTWdJeUFDUVFKMGFpQWdOZ0VBSUFKQkFXb2hBZ3dBQ3dBTElBSWdBaUFaYWlJTklBSWdEVXNiSVEwZ0EwRVFkRUdBZ1B3SGNTQVdja0dBZ0lBSWNpRURBMEFnQWlBTlJnMERJQkVnQWtFQ2RHb2dBellCQUNBQ1FRRnFJUUlNQUFzQUN5QWVJQXhCRUhRZ04zSWdESEpCZ0FKeU5nSUFEQU1MSUFjZ0RXc2hKQ0FYSUNacUlTWkJBQ0VOQTBBZ0RTQWtSZzBCUVFFZ0dDQVRJQ1lnRFVFQmRHb2lKeTBBQVNJQ2F5STdhM1FpUENBaElBSkJBblJxSWlBb0FnQWlBbW9oUFNBRElEdHFRUkIwUVlDQS9BZHhJQ2N0QUFCQkNIUnlJQlp5UVlDQWdCQnlJU2NEUUNBaklBSkJBblJxSUNjMkFRQWdBa0VCYWlJQ0lEMUpEUUFMSUNBZ0lDZ0NBQ0E4YWpZQ0FDQU5RUUZxSVEwTUFBc0FDeUFmSUI4b0FnQWdHV28yQWdBZ0NrRUJhaUVLREFBTEFBc2dFaUVDQ3lBUVFSQnFKQUFnQWtHSWYwc2dBaUFJVDNJTkRDQWNJQXNnQWlBUGFpQUlJQUpySUI0UUZpRUREQU1MSUI0Z0R5QUlJQlFRRkNJQ1FZaC9TeUFDSUFoUGNnMExJQndnQ3lBQ0lBOXFJQWdnQW1zZ0hoQVhJUU1NQWdzZ0F3UkFJQndnQ3lBUElBZ2dBaEFXSVFNTUFnc2dIQ0FMSUE4Z0NDQUNFQmNoQXd3QkN5QWNJQXNnRHlBSUlBSVFGU0VEQ3lBRFFZaC9TdzBJSUFVZ0N6WUNnT3NCSUFVZ0hEWUM4T29CSUFWQkFUWUNnT29CSUJwQkFrWUVRQ0FGSUI0MkFnd0xJQXNnSEdvaUFrSUFOd0FBSUFKQ0FEY0FHQ0FDUWdBM0FCQWdBa0lBTndBSUlBbEJpSDlMRFFvTElBa2dGVVlOQ0NBVklBbHJJUVlnQlNnQ25Pc0JJUW9DUUNBSklCdHFJZ010QUFBaUQwVUVRRUVCSVFKQkFDRVBRYmgvSVFrZ0JrRUJSZzBCREFzTEFuOGdBMEVCYWlBUHdDSUNRUUJPRFFBYUlBSkJmMFlFUUNBR1FRTklEUXNnQXk4QUFVR0EvZ0ZxSVE4Z0EwRURhZ3dCQ3lBR1FRSklEUW9nQXkwQUFTQVBRUWgwY2tHQWdBSnJJUThnQTBFQ2Fnc2hFa0c0ZnlFSklCSkJBV29pQWlBVklCdHFJZ2RMRFFvZ0xDQUZJQkl0QUFBaUVrRUdka0VqUVFrZ0FpQUhJQUpyUWNBUVFkQVJRZkFTSUFVb0FvVHFBU0FLSUE4Z0ZCQWhJZ2xCaUg5TERRZ2dLeUFvSUJKQkJIWkJBM0ZCSDBFSUlBSWdDV29pQWlBSElBSnJRWUFMUVlBTVFZQVhJQVVvQW9UcUFTQUZLQUtjNndFZ0R5QVVFQ0VpQ0VHSWYwc05DRUZzSVFrZ0tpQXRJQkpCQW5aQkEzRkJORUVKSUFJZ0NHb2lBaUFISUFKclFZQU5RZUFPUVpBWklBVW9Bb1RxQVNBRktBS2M2d0VnRHlBVUVDRWlCMEdJZjBzTkNpQUNJQWRxSUFOcklnSWhDU0FDUVloL1N3MEtDeUFPSUE5QkFFeHlEUUVMUWJwL0lRa01DQXNnSlNBT2F5RUpJQVlnQW1zaEJpQUNJQU5xSVFjQ1FBSkFBa0FnQ2tVRVFDQVBRUWxJSUFVcEE4anBBVUtCZ0lBSVZISU5BaUFvS0FJQUlnSkJDR29oRWlBQ0tBSUVJUXBCQUNFRFFRQWhBZ05BSUFNZ0NuWkZCRUFnQWlBU0lBTkJBM1JxTFFBQ1FSWkxhaUVDSUFOQkFXb2hBd3dCQ3dzZ0JVRUFOZ0tjNndFZ0FrRUlJQXByZEVFVVR3MEJEQU1MSUFWQkFEWUNuT3NCQ3lBRUlBVW9BdkRxQVNJRE5nTGNBU0FKSUE1cUlSWWdBeUFGS0FLQTZ3RnFJUmNDUUNBUFJRUkFJQTRoQnd3QkN5QUZLQUs0NlFFaEdpQUZLQUswNlFFaEdDQUZLQUt3NlFFaEVpQUZRUUUyQW9UcUFVRUFJUU1EUUNBRFFRTkhCRUFnQkNBRFFRSjBJZ0pxSUFJZ0JXcEJyTkFCYWlnQ0FEWUNaQ0FEUVFGcUlRTU1BUXNMUVd3aENTQUVRVGhxSWdJZ0J5QUdFQTFCaUg5TERRTkJDQ0FQSUE5QkNFNGJJUjhnTkNBQ0lBVW9BZ0FRSGlBeklBSWdCU2dDQ0JBZUlESWdBaUFGS0FJRUVCNGdEaUFTYXlFWlFRQWhDQU5BSUFSQk9Hb1FEMEVEUmlBSUlCOU9ja1VFUUNBRUtBSlFJQVFvQWt4QkEzUnFLUUlBSWtDbklnZEJFSFlpRVVIL0FYRWhDeUFFS0FKZ0lBUW9BbHhCQTNScUtRSUFJa0duSWd4QkVIWWlJVUgvQVhFaEVDQUVLQUpZSUFRb0FsUkJBM1JxS1FJQUlrSkNJSWluSVFZZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDa0gvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDUENJS2F5SU5JQUlnQWlBTlN4c2lFeUFLYWpZQ1BDQUdJQVFvQWpnZ0NuUkJBQ0FUYTNZZ0FpQVRheUlUZEdvaENpQUVRVGhxRUE4YUlBSWdEVTBOQVNBRUlBUW9BandpQWlBVGFqWUNQQ0FFS0FJNElBSjBRUUFnRTJ0MklBcHFJUW9NQVFzZ0JDQUNJQVFvQWp3aURXbzJBandnQkNnQ09DQU5kRUVBSUFwcmRpQUdhaUVLSUFSQk9Hb1FEeG9MSUFRcEFtUWhSQ0FFSUFvMkFtUWdCQ0JFTndKb0RBRUxBa0FnQWtVRVFDQURCRUFnQkNnQ1pDRUtEQU1MSUFRb0FtZ2hDZ3dCQ3lBRUlBUW9BandpQWtFQmFqWUNQQUovSUFZZ0EwVnFJQVFvQWpnZ0FuUkJIM1pxSWdKQkEwWUVRQ0FFS0FKa1FRRnJEQUVMSUFKQkFuUWdCR29vQW1RTElnWkZJQVpxSVFvZ0FrRUJSd1JBSUFRZ0JDZ0NhRFlDYkFzTElBUWdCQ2dDWkRZQ2FDQUVJQW8yQW1RTHB5RUNJRUZDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NQQ0lHSUJCcU5nSThJQVFvQWpnZ0JuUkJBQ0FoYTNZZ0Ftb2hBZ3NnQ3lBUWFrRVVUd1JBSUFSQk9Hb1FEeG9MSUVCQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJR0lBdHFOZ0k4SUFRb0FqZ2dCblJCQUNBUmEzWWdBMm9oQXdzZ0JFRTRhaEFQR2lBRUlBUW9BamdpQmtFQUlBZEJHSFlpQ3lBRUtBSThhaUlRYTNZZ0MwRUNkRUdnSFdvb0FnQnhJQWRCLy84RGNXbzJBa3dnQkNBUUlBeEJHSFlpQjJvaUN6WUNQQ0FFSUFkQkFuUkJvQjFxS0FJQUlBWkJBQ0FMYTNaeElBeEIvLzhEY1dvMkFsd2dCRUU0YWhBUEdpQUVJRUtuSWdaQkdIWWlCeUFFS0FJOGFpSUxOZ0k4SUFRZ0IwRUNkRUdnSFdvb0FnQWdCQ2dDT0VFQUlBdHJkbkVnQmtILy93TnhhallDVkNBRVFmQUFhaUFJUVF4c2FpSUdJQW8yQWdnZ0JpQUNOZ0lFSUFZZ0F6WUNBQ0FJUVFGcUlRZ2dBeUFaYWlBQ2FpRVpEQUVMQ3lBSUlCOUlEUU1nRmtFZ2F5RWhJQTRoQndOQUlBUkJPR29RRDBFRFJpQUlJQTlPY2tVRVFDQUVLQUpRSUFRb0FreEJBM1JxS1FJQUlrQ25JZ1pCRUhZaUkwSC9BWEVoQ2lBRUtBSmdJQVFvQWx4QkEzUnFLUUlBSWtHbklnMUJFSFlpSUVIL0FYRWhFeUFFS0FKWUlBUW9BbFJCQTNScUtRSUFJa0pDSUlpbklRTWdRVUlnaUNCQVFpQ0lweUVMQWtBZ1FrSVFpS2NpREVIL0FYRWlBa0VDVHdSQUFrQWdBa0VaU1NBL1FvR0FnQkJVY2tVRVFDQUVRU0FnQkNnQ1BDSU1heUlSSUFJZ0FpQVJTeHNpRUNBTWFqWUNQQ0FESUFRb0FqZ2dESFJCQUNBUWEzWWdBaUFRYXlJTWRHb2hFQ0FFUVRocUVBOGFJQUlnRVUwTkFTQUVJQVFvQWp3aUFpQU1hallDUENBRUtBSTRJQUowUVFBZ0RHdDJJQkJxSVJBTUFRc2dCQ0FDSUFRb0Fqd2lFR28yQWp3Z0JDZ0NPQ0FRZEVFQUlBeHJkaUFEYWlFUUlBUkJPR29RRHhvTElBUXBBbVFoUkNBRUlCQTJBbVFnQkNCRU53Sm9EQUVMQWtBZ0FrVUVRQ0FMQkVBZ0JDZ0NaQ0VRREFNTElBUW9BbWdoRUF3QkN5QUVJQVFvQWp3aUFrRUJhallDUEFKL0lBTWdDMFZxSUFRb0FqZ2dBblJCSDNacUlnSkJBMFlFUUNBRUtBSmtRUUZyREFFTElBSkJBblFnQkdvb0FtUUxJZ05GSUFOcUlSQWdBa0VCUndSQUlBUWdCQ2dDYURZQ2JBc0xJQVFnQkNnQ1pEWUNhQ0FFSUJBMkFtUUxweUVNSUVGQ2dJRDhCNE5RUlFSQUlBUWdCQ2dDUENJQ0lCTnFOZ0k4SUFRb0FqZ2dBblJCQUNBZ2EzWWdER29oREFzZ0NpQVRha0VVVHdSQUlBUkJPR29RRHhvTElFQkNnSUQ4QjROUVJRUkFJQVFnQkNnQ1BDSUNJQXBxTmdJOElBUW9BamdnQW5SQkFDQWphM1lnQzJvaEN3c2dCRUU0YWhBUEdpQUVJQVFvQWpnaUFrRUFJQVpCR0hZaUF5QUVLQUk4YWlJS2EzWWdBMEVDZEVHZ0hXb29BZ0J4SUFaQi8vOERjV28yQWt3Z0JDQUtJQTFCR0hZaUEyb2lCallDUENBRUlBTkJBblJCb0IxcUtBSUFJQUpCQUNBR2EzWnhJQTFCLy84RGNXbzJBbHdnQkVFNGFoQVBHaUFFSUVLbklnSkJHSFlpQXlBRUtBSThhaUlHTmdJOElBUWdBMEVDZEVHZ0hXb29BZ0FnQkNnQ09FRUFJQVpyZG5FZ0FrSC8vd054YWpZQ1ZBSkFBa0FDUUNBRUtBTGNBU0lESUFSQjhBQnFJQWhCQjNGQkRHeHFJaE1vQWdBaUVXb2lJeUFYU3cwQUlBY2dFeWdDQkNJTklCRnFJZ3BxSUNGTERRQWdDa0VnYWlBV0lBZHJUUTBCQ3lBRUlCTW9BZ2cyQWhnZ0JDQVRLUUlBTndNUUlBY2dGaUFFUVJCcUlBUkIzQUZxSUJjZ0VpQVlJQm9RSHlFS0RBRUxJQWNnRVdvaEFpQVRLQUlJSVFZZ0J5QURLUUFBTndBQUlBY2dBeWtBQ0RjQUNBSkFJQkZCRVVrTkFDQUhJQU1wQUJBM0FCQWdCeUFES1FBWU53QVlJQkZCRUd0QkVVZ05BQ0FEUVJCcUlRTWdCMEVnYWlFUkEwQWdFU0FES1FBUU53QUFJQkVnQXlrQUdEY0FDQ0FSSUFNcEFDQTNBQkFnRVNBREtRQW9Od0FZSUFOQklHb2hBeUFSUVNCcUloRWdBa2tOQUFzTElBSWdCbXNoQXlBRUlDTTJBdHdCSUFJZ0Vtc2dCa2tFUUNBR0lBSWdHR3RMRFFjZ0dpQWFJQU1nRW1zaUEyb2lFU0FOYWs4RVFDQUNJQkVnRFJBS0dnd0NDeUFESUExcUlRMGdBaUFSUVFBZ0Eyc1FDaUFEYXlFQ0lCSWhBd3NnQmtFUVR3UkFJQUlnQXlrQUFEY0FBQ0FDSUFNcEFBZzNBQWdnRFVFUlNBMEJJQUlnRFdvaEJpQUNRUkJxSVFJRFFDQUNJQU1wQUJBM0FBQWdBaUFES1FBWU53QUlJQUlnQXlrQUlEY0FFQ0FDSUFNcEFDZzNBQmdnQTBFZ2FpRURJQUpCSUdvaUFpQUdTUTBBQ3d3QkN3SkFJQVpCQjAwRVFDQUNJQU10QUFBNkFBQWdBaUFETFFBQk9nQUJJQUlnQXkwQUFqb0FBaUFDSUFNdEFBTTZBQU1nQWlBRElBWkJBblFpQmtIQUhtb29BZ0JxSWdNb0FBQTJBQVFnQXlBR1FlQWVhaWdDQUdzaEF3d0JDeUFDSUFNcEFBQTNBQUFMSUExQkNVa05BQ0FDSUExcUlSRWdBa0VJYWlJR0lBTkJDR29pQTJ0QkQwd0VRQU5BSUFZZ0F5a0FBRGNBQUNBRFFRaHFJUU1nQmtFSWFpSUdJQkZKRFFBTUFnc0FDeUFHSUFNcEFBQTNBQUFnQmlBREtRQUlOd0FJSUExQkdVZ05BQ0FDUVJocUlRSURRQ0FDSUFNcEFCQTNBQUFnQWlBREtRQVlOd0FJSUFJZ0F5a0FJRGNBRUNBQ0lBTXBBQ2czQUJnZ0EwRWdhaUVESUFKQklHb2lBaUFSU1EwQUN3c2dDa0dJZjBzRVFDQUtJUWtNQmdVZ0V5QVFOZ0lJSUJNZ0REWUNCQ0FUSUFzMkFnQWdDRUVCYWlFSUlBY2dDbW9oQnlBTElCbHFJQXhxSVJrTUFnc0FDd3NnQ0NBUFNBMERJQWdnSDJzaEJnTkFBa0FnQmlBUFRnUkFRUUFoQXdOQUlBTkJBMFlOQWlBRklBTkJBblFpQW1wQnJOQUJhaUFDSUFScUtBSmtOZ0lBSUFOQkFXb2hBd3dBQ3dBTEFrQUNRQUpBSUFRb0F0d0JJZ01nQkVId0FHb2dCa0VIY1VFTWJHb2lDQ2dDQUNJTWFpSVFJQmRMRFFBZ0J5QUlLQUlFSWdzZ0RHb2lDbW9nSVVzTkFDQUtRU0JxSUJZZ0IydE5EUUVMSUFRZ0NDZ0NDRFlDS0NBRUlBZ3BBZ0EzQXlBZ0J5QVdJQVJCSUdvZ0JFSGNBV29nRnlBU0lCZ2dHaEFmSVFvTUFRc2dCeUFNYWlFQ0lBZ29BZ2doQ0NBSElBTXBBQUEzQUFBZ0J5QURLUUFJTndBSUFrQWdERUVSU1EwQUlBY2dBeWtBRURjQUVDQUhJQU1wQUJnM0FCZ2dERUVRYTBFUlNBMEFJQU5CRUdvaEF5QUhRU0JxSVF3RFFDQU1JQU1wQUJBM0FBQWdEQ0FES1FBWU53QUlJQXdnQXlrQUlEY0FFQ0FNSUFNcEFDZzNBQmdnQTBFZ2FpRURJQXhCSUdvaURDQUNTUTBBQ3dzZ0FpQUlheUVESUFRZ0VEWUMzQUVnQWlBU2F5QUlTUVJBSUFnZ0FpQVlhMHNOQnlBYUlCb2dBeUFTYXlJRGFpSU1JQXRxVHdSQUlBSWdEQ0FMRUFvYURBSUxJQU1nQzJvaEN5QUNJQXhCQUNBRGF4QUtJQU5ySVFJZ0VpRURDeUFJUVJCUEJFQWdBaUFES1FBQU53QUFJQUlnQXlrQUNEY0FDQ0FMUVJGSURRRWdBaUFMYWlFSUlBSkJFR29oQWdOQUlBSWdBeWtBRURjQUFDQUNJQU1wQUJnM0FBZ2dBaUFES1FBZ053QVFJQUlnQXlrQUtEY0FHQ0FEUVNCcUlRTWdBa0VnYWlJQ0lBaEpEUUFMREFFTEFrQWdDRUVIVFFSQUlBSWdBeTBBQURvQUFDQUNJQU10QUFFNkFBRWdBaUFETFFBQ09nQUNJQUlnQXkwQUF6b0FBeUFDSUFNZ0NFRUNkQ0lJUWNBZWFpZ0NBR29pQXlnQUFEWUFCQ0FESUFoQjRCNXFLQUlBYXlFRERBRUxJQUlnQXlrQUFEY0FBQXNnQzBFSlNRMEFJQUlnQzJvaERDQUNRUWhxSWdnZ0EwRUlhaUlEYTBFUFRBUkFBMEFnQ0NBREtRQUFOd0FBSUFOQkNHb2hBeUFJUVFocUlnZ2dERWtOQUF3Q0N3QUxJQWdnQXlrQUFEY0FBQ0FJSUFNcEFBZzNBQWdnQzBFWlNBMEFJQUpCR0dvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQXhKRFFBTEN5QUtRWWgvU3dSQUlBb2hDUXdHQlNBR1FRRnFJUVlnQnlBS2FpRUhEQUlMQUFzTElBUW9BdHdCSVFNTFFicC9JUWtnRnlBRGF5SUNJQllnQjJ0TERRSWdCd1IvSUFjZ0F5QUNFQUlnQW1vRlFRQUxJQTVySVFrTUFnc2dCVUVBTmdLYzZ3RUxJQVFnQlNnQzhPb0JJZ00yQXR3QklBa2dEbW9oRENBRElBVW9Bb0RyQVdvaEVBSkFJQTlGQkVBZ0RpRUdEQUVMSUFVb0FyanBBU0VOSUFVb0FyVHBBU0VUSUFVb0FyRHBBU0VTSUFWQkFUWUNoT29CUVFBaEF3TkFJQU5CQTBjRVFDQUVJQU5CQW5RaUFtb2dBaUFGYWtHczBBRnFLQUlBTmdLY0FTQURRUUZxSVFNTUFRc0xRV3doQ1NBRVFmQUFhaUlDSUFjZ0JoQU5RWWgvU3cwQklERWdBaUFGS0FJQUVCNGdNQ0FDSUFVb0FnZ1FIaUF2SUFJZ0JTZ0NCQkFlSUF4QklHc2hHQ0FPSVFZRFFDQUVLQUtJQVNBRUtBS0VBVUVEZEdvcEFnQWlRS2NpQ2tFUWRpSVpRZjhCY1NFTElBUW9BcGdCSUFRb0FwUUJRUU4wYWlrQ0FDSkJweUlXUVJCMkloOUIvd0Z4SVJvZ0JDZ0NrQUVnQkNnQ2pBRkJBM1JxS1FJQUlrSkNJSWluSVFjZ1FVSWdpQ0JBUWlDSXB5RURBa0FnUWtJUWlLY2lDRUgvQVhFaUFrRUNUd1JBQWtBZ0FrRVpTU0EvUW9HQWdCQlVja1VFUUNBRVFTQWdCQ2dDZENJSWF5SVJJQUlnQWlBUlN4c2lGeUFJYWpZQ2RDQUhJQVFvQW5BZ0NIUkJBQ0FYYTNZZ0FpQVhheUlYZEdvaENDQUVRZkFBYWhBUEdpQUNJQkZORFFFZ0JDQUVLQUowSWdJZ0YybzJBblFnQkNnQ2NDQUNkRUVBSUJkcmRpQUlhaUVJREFFTElBUWdBaUFFS0FKMEloRnFOZ0owSUFRb0FuQWdFWFJCQUNBSWEzWWdCMm9oQ0NBRVFmQUFhaEFQR2dzZ0JDa0NuQUVoUkNBRUlBZzJBcHdCSUFRZ1JEY0NvQUVNQVFzQ1FDQUNSUVJBSUFNRVFDQUVLQUtjQVNFSURBTUxJQVFvQXFBQklRZ01BUXNnQkNBRUtBSjBJZ0pCQVdvMkFuUUNmeUFISUFORmFpQUVLQUp3SUFKMFFSOTJhaUlDUVFOR0JFQWdCQ2dDbkFGQkFXc01BUXNnQWtFQ2RDQUVhaWdDbkFFTElnZEZJQWRxSVFnZ0FrRUJSd1JBSUFRZ0JDZ0NvQUUyQXFRQkN3c2dCQ0FFS0FLY0FUWUNvQUVnQkNBSU5nS2NBUXVuSVFJZ1FVS0FnUHdIZzFCRkJFQWdCQ0FFS0FKMElnY2dHbW8yQW5RZ0JDZ0NjQ0FIZEVFQUlCOXJkaUFDYWlFQ0N5QUxJQnBxUVJSUEJFQWdCRUh3QUdvUUR4b0xJRUJDZ0lEOEI0TlFSUVJBSUFRZ0JDZ0NkQ0lISUF0cU5nSjBJQVFvQW5BZ0IzUkJBQ0FaYTNZZ0Eyb2hBd3NnQkVId0FHb1FEeG9nQkNBRUtBSndJZ2RCQUNBS1FSaDJJZ3NnQkNnQ2RHb2lHbXQySUF0QkFuUkJvQjFxS0FJQWNTQUtRZi8vQTNGcU5nS0VBU0FFSUJvZ0ZrRVlkaUlLYWlJTE5nSjBJQVFnQ2tFQ2RFR2dIV29vQWdBZ0IwRUFJQXRyZG5FZ0ZrSC8vd054YWpZQ2xBRWdCRUh3QUdvUUR4b2dCQ0JDcHlJSFFSaDJJZ29nQkNnQ2RHb2lDellDZENBRUlBcEJBblJCb0IxcUtBSUFJQVFvQW5CQkFDQUxhM1p4SUFkQi8vOERjV28yQW93QklBUWdBellDT0NBRUlBSTJBandnQkNBSU5nSkFBa0FDUUFKQUlBUW9BdHdCSWdzZ0Eyb2lGaUFRU3cwQUlBWWdBaUFEYWlJS2FpQVlTdzBBSUFwQklHb2dEQ0FHYTAwTkFRc2dCQ0FFUVVCcktBSUFOZ0lJSUFRZ0JDa0RPRGNEQUNBR0lBd2dCQ0FFUWR3QmFpQVFJQklnRXlBTkVCOGhDZ3dCQ3lBRElBWnFJUWNnQmlBTEtRQUFOd0FBSUFZZ0N5a0FDRGNBQ0FKQUlBTkJFVWtOQUNBR0lBc3BBQkEzQUJBZ0JpQUxLUUFZTndBWUlBTkJFR3RCRVVnTkFDQUxRUkJxSVFNZ0JrRWdhaUVMQTBBZ0N5QURLUUFRTndBQUlBc2dBeWtBR0RjQUNDQUxJQU1wQUNBM0FCQWdDeUFES1FBb053QVlJQU5CSUdvaEF5QUxRU0JxSWdzZ0Iwa05BQXNMSUFjZ0NHc2hBeUFFSUJZMkF0d0JJQWNnRW1zZ0NFa0VRQ0FJSUFjZ0UydExEUVFnRFNBTklBTWdFbXNpQTJvaUN5QUNhazhFUUNBSElBc2dBaEFLR2d3Q0N5QUhJQXRCQUNBRGF4QUtJQVFnQWlBRGFpSUNOZ0k4SUFOcklRY2dFaUVEQ3lBSVFSQlBCRUFnQnlBREtRQUFOd0FBSUFjZ0F5a0FDRGNBQ0NBQ1FSRklEUUVnQWlBSGFpRUlJQWRCRUdvaEFnTkFJQUlnQXlrQUVEY0FBQ0FDSUFNcEFCZzNBQWdnQWlBREtRQWdOd0FRSUFJZ0F5a0FLRGNBR0NBRFFTQnFJUU1nQWtFZ2FpSUNJQWhKRFFBTERBRUxBa0FnQ0VFSFRRUkFJQWNnQXkwQUFEb0FBQ0FISUFNdEFBRTZBQUVnQnlBRExRQUNPZ0FDSUFjZ0F5MEFBem9BQXlBSElBTWdDRUVDZENJSVFjQWVhaWdDQUdvaUF5Z0FBRFlBQkNBRElBaEI0QjVxS0FJQWF5RUREQUVMSUFjZ0F5a0FBRGNBQUFzZ0FrRUpTUTBBSUFJZ0Iyb2hDeUFIUVFocUlnZ2dBMEVJYWlJRGEwRVBUQVJBQTBBZ0NDQURLUUFBTndBQUlBTkJDR29oQXlBSVFRaHFJZ2dnQzBrTkFBd0NDd0FMSUFnZ0F5a0FBRGNBQUNBSUlBTXBBQWczQUFnZ0FrRVpTQTBBSUFkQkdHb2hBZ05BSUFJZ0F5a0FFRGNBQUNBQ0lBTXBBQmczQUFnZ0FpQURLUUFnTndBUUlBSWdBeWtBS0RjQUdDQURRU0JxSVFNZ0FrRWdhaUlDSUF0SkRRQUxDeUFLUVloL1N3UkFJQW9oQ1F3REN5QUdJQXBxSVFZZ0JFSHdBR29RRHlFRElBOUJBV3NpRHcwQUMwRUFJUUlnQTBFQ1NRMEJBMEFnQWtFRFJ3UkFJQVVnQWtFQ2RDSURha0dzMEFGcUlBTWdCR29vQXB3Qk5nSUFJQUpCQVdvaEFnd0JDd3NnQkNnQzNBRWhBd3RCdW44aENTQVFJQU5ySWdJZ0RDQUdhMHNOQUNBR0JIOGdCaUFESUFJUUFpQUNhZ1ZCQUFzZ0Rtc2hDUXNnQ1VHSWYwc05CZ3NDUUNBRktBTHM2Z0ZGRFFBZ0JTQUZLUU9JNmdFZ0NhMThOd09JNmdFQ1FDQUZLQUxRNmdFaUFpQUphaUlJUVI5TkJFQWdEa1VOQVNBQ0lDSnFJQTRnQ1JBQ0dpQUZLQUxRNmdFZ0NXb2hDQXdCQ3lBT0lRTWdBZ1JBSUFJZ0ltb2dBMEVnSUFKckVBSWFJQVVvQXREcUFTRUNJQVZCQURZQzBPb0JJQVVnQlNrRGtPb0JJQVVwQUxEcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RrT29CSUFVZ0JTa0RtT29CSUFVcEFManFBVUxQMXRPKzBzZXIyVUorZkVJZmlVS0hsYSt2bUxiZW01NS9mamNEbU9vQklBVWdCU2tEb09vQklBVXBBTURxQVVMUDF0Tyswc2VyMlVKK2ZFSWZpVUtIbGErdm1MYmVtNTUvZmpjRG9Pb0JJQVVnQlNrRHFPb0JJQVVwQU1qcUFVTFAxdE8rMHNlcjJVSitmRUlmaVVLSGxhK3ZtTGJlbTU1L2ZqY0RxT29CSUFNZ0FtdEJJR29oQXdzZ0NTQU9haUlDSUFOQklHcFBCRUFnQWtFZ2F5RUdJQVVwQTZqcUFTRS9JQVVwQTZEcUFTRkFJQVVwQTVqcUFTRkJJQVVwQTVEcUFTRkNBMEFnQXlrQUdFTFAxdE8rMHNlcjJVSitJRDk4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVDhnQXlrQUVFTFAxdE8rMHNlcjJVSitJRUI4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUFnQXlrQUNFTFAxdE8rMHNlcjJVSitJRUY4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUVnQXlrQUFFTFAxdE8rMHNlcjJVSitJRUo4UWgrSlFvZVZyNitZdHQ2Ym5uOStJVUlnQTBFZ2FpSURJQVpORFFBTElBVWdQemNEcU9vQklBVWdRRGNEb09vQklBVWdRVGNEbU9vQklBVWdRamNEa09vQkN5QUNJQU5ORFFFZ0lpQURJQUlnQTJzaUNCQUNHZ3NnQlNBSU5nTFE2Z0VMSURVZ0ZXc2hBeUFWSUJ0cUlRSWdDU0FPYWlFT0lBUW9BakJGRFFBTElDa3BBd0FpUDBKL1VTQS9JQTRnSFd1c1VYSkZCRUJCYkNFSkRBWUxJQVVvQXVEcEFRUkFRV29oQ1NBRFFRUkpEUVlnQlNnQzZPb0JSUVJBSUNJZ0JTZ0MwT29CYWlFS0FuNGdCU2tEaU9vQklqOUNJRm9FUUNBRktRT1k2Z0VpUUVJSGlTQUZLUU9RNmdFaVFVSUJpWHdnQlNrRG9Pb0JJa0pDRElsOElBVXBBNmpxQVNKRFFoS0pmQ0JCUXMvVzA3N1N4NnZaUW41Q0g0bENoNVd2cjVpMjNwdWVmMzZGUW9lVnI2K1l0dDZibm45K1FwMmp0ZXFEc1kySytnQjlJRUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9mb1ZDaDVXdnI1aTIzcHVlZjM1Q25hTzE2b094allyNkFIMGdRa0xQMXRPKzBzZXIyVUorUWgrSlFvZVZyNitZdHQ2Ym5uOStoVUtIbGErdm1MYmVtNTUvZmtLZG83WHFnN0dOaXZvQWZTQkRRcy9XMDc3U3g2dlpRbjVDSDRsQ2g1V3ZyNWkyM3B1ZWYzNkZRb2VWcjYrWXR0NmJubjkrUXAyanRlcURzWTJLK2dCOURBRUxJQVVwQTZEcUFVTEZ6OW15OGVXNjZpZDhDeUEvZkNFL0lDSWhCZ05BSUFvZ0JrRUlhaUlIVHdSQUlBWXBBQUJDejliVHZ0TEhxOWxDZmtJZmlVS0hsYSt2bUxiZW01NS9maUEvaFVJYmlVS0hsYSt2bUxiZW01NS9ma0tkbzdYcWc3R05pdm9BZlNFL0lBY2hCZ3dCQ3dzQ1FDQUtJQVpCQkdvaUNFa0VRQ0FHSVFnTUFRc2dCalVBQUVLSGxhK3ZtTGJlbTU1L2ZpQS9oVUlYaVVMUDF0Tyswc2VyMlVKK1F2bnozZkdaOXBtckZud2hQd3NEUUNBSUlBcEpCRUFnQ0RFQUFFTEZ6OW15OGVXNjZpZCtJRCtGUWd1SlFvZVZyNitZdHQ2Ym5uOStJVDhnQ0VFQmFpRUlEQUVMQ3lBQ0tBQUFJRDlDSVlnZ1A0VkN6OWJUdnRMSHE5bENmaUkvUWgySUlEK0ZRdm56M2ZHWjlwbXJGbjRpUDBJZ2lDQS9oYWRIRFFjTElBTkJCR3NoQXlBQ1FRUnFJUUlMSUE0Z0hXc2lDVUdKZjA4TkJDQUJJQWxySVFFZ0NTQWRhaUVkUVFFaFBnd0JDd3RCdUg4aEJ5QUREUVFnSFNBQWF5RUhEQVFMUVd3aENRd0JDMEc0ZnlFSkMwRzRmeUVISUFsQmRrWWdQbkVOQVFzZ0NTRUhDeWdDQUEwQUlBVkIvT29CYWlnQ0FDRUJJQVZCK09vQmFpZ0NBQ0VBSUFVUUdDQUZLQUt3NndFZ0FDQUJFQk1nQlVFQU5nS3c2d0VnQlNnQ3BPc0JJZ0lFUUFKQUFrQUNRQUpBSUFJb0FnQWlBd1JBSUFCRkRRSWdBU0FESUFBUkFnQU1BUXNnQUVVTkFnc2dBU0FDSUFBUkFnQU1BZ3NnQXhBR0N5QUNFQVlMSUFWQkFEWUNwT3NCQ3lBQUJFQWdBU0FGSUFBUkFnQU1BUXNnQlJBR0N5QUVRZUFCYWlRQUlBY0xDNmdWQ1FCQmlBZ0xEUUVBQUFBQkFBQUFBZ0FBQUFJQVFhQUlDN01HQVFBQUFBRUFBQUFDQUFBQUFnQUFBQ1lBQUFDQ0FBQUFJUVVBQUVvQUFBQm5DQUFBSmdBQUFNQUJBQUNBQUFBQVNRVUFBRW9BQUFDK0NBQUFLUUFBQUN3Q0FBQ0FBQUFBU1FVQUFFb0FBQUMrQ0FBQUx3QUFBTW9DQUFDQUFBQUFpZ1VBQUVvQUFBQ0VDUUFBTlFBQUFITURBQUNBQUFBQW5RVUFBRW9BQUFDZ0NRQUFQUUFBQUlFREFBQ0FBQUFBNndVQUFFc0FBQUErQ2dBQVJBQUFBSjREQUFDQUFBQUFUUVlBQUVzQUFBQ3FDZ0FBU3dBQUFMTURBQUNBQUFBQXdRWUFBRTBBQUFBZkRRQUFUUUFBQUZNRUFBQ0FBQUFBSXdnQUFGRUFBQUNtRHdBQVZBQUFBSmtFQUFDQUFBQUFTd2tBQUZjQUFBQ3hFZ0FBV0FBQUFOb0VBQUNBQUFBQWJ3a0FBRjBBQUFBakZBQUFWQUFBQUVVRkFBQ0FBQUFBVkFvQUFHb0FBQUNNRkFBQWFnQUFBSzhGQUFDQUFBQUFkZ2tBQUh3QUFBQk9FQUFBZkFBQUFOSUNBQUNBQUFBQVl3Y0FBSkVBQUFDUUJ3QUFrZ0FBQUFBQUFBQUJBQUFBQVFBQUFBVUFBQUFOQUFBQUhRQUFBRDBBQUFCOUFBQUEvUUFBQVAwQkFBRDlBd0FBL1FjQUFQMFBBQUQ5SHdBQS9UOEFBUDEvQUFEOS93QUEvZjhCQVAzL0F3RDkvd2NBL2Y4UEFQMy9Id0Q5L3o4QS9mOS9BUDMvL3dEOS8vOEIvZi8vQS8zLy93ZjkvLzhQL2YvL0gvMy8vei85Ly85L0FBQUFBQUVBQUFBQ0FBQUFBd0FBQUFRQUFBQUZBQUFBQmdBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFBQUFEQUFBQUEwQUFBQU9BQUFBRHdBQUFCQUFBQUFSQUFBQUVnQUFBQk1BQUFBVUFBQUFGUUFBQUJZQUFBQVhBQUFBR0FBQUFCa0FBQUFhQUFBQUd3QUFBQndBQUFBZEFBQUFIZ0FBQUI4QUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQkVBQUFBU0FBQUFFd0FBQUJRQUFBQVZBQUFBRmdBQUFCY0FBQUFZQUFBQUdRQUFBQm9BQUFBYkFBQUFIQUFBQUIwQUFBQWVBQUFBSHdBQUFDQUFBQUFoQUFBQUlnQUFBQ01BQUFBbEFBQUFKd0FBQUNrQUFBQXJBQUFBTHdBQUFETUFBQUE3QUFBQVF3QUFBRk1BQUFCakFBQUFnd0FBQUFNQkFBQURBZ0FBQXdRQUFBTUlBQUFERUFBQUF5QUFBQU5BQUFBRGdBQUFBd0FCQUVIZ0R3dFJBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFVQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QUFBQXdBQUFBTkFBQUFEZ0FBQUE4QUFBQVFBRUhFRUF1TEFRRUFBQUFDQUFBQUF3QUFBQVFBQUFBRkFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQVNBQUFBRkFBQUFCWUFBQUFZQUFBQUhBQUFBQ0FBQUFBb0FBQUFNQUFBQUVBQUFBQ0FBQUFBQUFFQUFBQUNBQUFBQkFBQUFBZ0FBQUFRQUFBQUlBQUFBRUFBQUFDQUFBQUFBQUVBUVpBU0MrWUVBUUFBQUFFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBRUFBQUFCZ0FBQUFjQUFBQUlBQUFBQ1FBQUFBb0FBQUFMQUFBQURBQUFBQTBBQUFBT0FBQUFEd0FBQUJBQUFBQUJBQUFBQkFBQUFBZ0FBQUFBQUFBQUFRQUJBUVlBQUFBQUFBQUVBQUFBQUJBQUFBUUFBQUFBSUFBQUJRRUFBQUFBQUFBRkF3QUFBQUFBQUFVRUFBQUFBQUFBQlFZQUFBQUFBQUFGQndBQUFBQUFBQVVKQUFBQUFBQUFCUW9BQUFBQUFBQUZEQUFBQUFBQUFBWU9BQUFBQUFBQkJSQUFBQUFBQUFFRkZBQUFBQUFBQVFVV0FBQUFBQUFDQlJ3QUFBQUFBQU1GSUFBQUFBQUFCQVV3QUFBQUlBQUdCVUFBQUFBQUFBY0ZnQUFBQUFBQUNBWUFBUUFBQUFBS0JnQUVBQUFBQUF3R0FCQUFBQ0FBQUFRQUFBQUFBQUFBQkFFQUFBQUFBQUFGQWdBQUFDQUFBQVVFQUFBQUFBQUFCUVVBQUFBZ0FBQUZCd0FBQUFBQUFBVUlBQUFBSUFBQUJRb0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFJQUFCQlJBQUFBQUFBQUVGRWdBQUFDQUFBUVVXQUFBQUFBQUNCUmdBQUFBZ0FBTUZJQUFBQUFBQUF3VW9BQUFBQUFBR0JFQUFBQUFRQUFZRVFBQUFBQ0FBQndXQUFBQUFBQUFKQmdBQ0FBQUFBQXNHQUFnQUFEQUFBQVFBQUFBQUVBQUFCQUVBQUFBZ0FBQUZBZ0FBQUNBQUFBVURBQUFBSUFBQUJRVUFBQUFnQUFBRkJnQUFBQ0FBQUFVSUFBQUFJQUFBQlFrQUFBQWdBQUFGQ3dBQUFDQUFBQVVNQUFBQUFBQUFCZzhBQUFBZ0FBRUZFZ0FBQUNBQUFRVVVBQUFBSUFBQ0JSZ0FBQUFnQUFJRkhBQUFBQ0FBQXdVb0FBQUFJQUFFQlRBQUFBQUFBQkFHQUFBQkFBQUFEd1lBZ0FBQUFBQU9CZ0JBQUFBQUFBMEdBQ0FBUVlBWEM0Y0NBUUFCQVFVQUFBQUFBQUFGQUFBQUFBQUFCZ1E5QUFBQUFBQUpCZjBCQUFBQUFBOEYvWDhBQUFBQUZRWDkveDhBQUFBREJRVUFBQUFBQUFjRWZRQUFBQUFBREFYOUR3QUFBQUFTQmYzL0F3QUFBQmNGL2Y5L0FBQUFCUVVkQUFBQUFBQUlCUDBBQUFBQUFBNEYvVDhBQUFBQUZBWDkvdzhBQUFBQ0JRRUFBQUFRQUFjRWZRQUFBQUFBQ3dYOUJ3QUFBQUFSQmYzL0FRQUFBQllGL2Y4L0FBQUFCQVVOQUFBQUVBQUlCUDBBQUFBQUFBMEYvUjhBQUFBQUV3WDkvd2NBQUFBQkJRRUFBQUFRQUFZRVBRQUFBQUFBQ2dYOUF3QUFBQUFRQmYzL0FBQUFBQndGL2YvL0R3QUFHd1g5Ly84SEFBQWFCZjMvL3dNQUFCa0YvZi8vQVFBQUdBWDkvLzhBUVpBWkM0WUVBUUFCQVFZQUFBQUFBQUFHQXdBQUFBQUFBQVFFQUFBQUlBQUFCUVVBQUFBQUFBQUZCZ0FBQUFBQUFBVUlBQUFBQUFBQUJRa0FBQUFBQUFBRkN3QUFBQUFBQUFZTkFBQUFBQUFBQmhBQUFBQUFBQUFHRXdBQUFBQUFBQVlXQUFBQUFBQUFCaGtBQUFBQUFBQUdIQUFBQUFBQUFBWWZBQUFBQUFBQUJpSUFBQUFBQUFFR0pRQUFBQUFBQVFZcEFBQUFBQUFDQmk4QUFBQUFBQU1HT3dBQUFBQUFCQVpUQUFBQUFBQUhCb01BQUFBQUFBa0dBd0lBQUJBQUFBUUVBQUFBQUFBQUJBVUFBQUFnQUFBRkJnQUFBQUFBQUFVSEFBQUFJQUFBQlFrQUFBQUFBQUFGQ2dBQUFBQUFBQVlNQUFBQUFBQUFCZzhBQUFBQUFBQUdFZ0FBQUFBQUFBWVZBQUFBQUFBQUJoZ0FBQUFBQUFBR0d3QUFBQUFBQUFZZUFBQUFBQUFBQmlFQUFBQUFBQUVHSXdBQUFBQUFBUVluQUFBQUFBQUNCaXNBQUFBQUFBTUdNd0FBQUFBQUJBWkRBQUFBQUFBRkJtTUFBQUFBQUFnR0F3RUFBQ0FBQUFRRUFBQUFNQUFBQkFRQUFBQVFBQUFFQlFBQUFDQUFBQVVIQUFBQUlBQUFCUWdBQUFBZ0FBQUZDZ0FBQUNBQUFBVUxBQUFBQUFBQUJnNEFBQUFBQUFBR0VRQUFBQUFBQUFZVUFBQUFBQUFBQmhjQUFBQUFBQUFHR2dBQUFBQUFBQVlkQUFBQUFBQUFCaUFBQUFBQUFCQUdBd0FCQUFBQUR3WURnQUFBQUFBT0JnTkFBQUFBQUEwR0F5QUFBQUFBREFZREVBQUFBQUFMQmdNSUFBQUFBQW9HQXdRQVFhUWRDOWtCQVFBQUFBTUFBQUFIQUFBQUR3QUFBQjhBQUFBL0FBQUFmd0FBQVA4QUFBRC9BUUFBL3dNQUFQOEhBQUQvRHdBQS94OEFBUDgvQUFEL2Z3QUEvLzhBQVAvL0FRRC8vd01BLy84SEFQLy9Ed0QvL3g4QS8vOC9BUC8vZndELy8vOEEvLy8vQWYvLy93UC8vLzhILy8vL0QvLy8veC8vLy84Ly8vLy9md0FBQUFBQkFBQUFBZ0FBQUFRQUFBQUFBQUFBQWdBQUFBUUFBQUFJQUFBQUFBQUFBQUVBQUFBQ0FBQUFBUUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFJQUFBQUNBQUFBQWdBQUFBSEFBQUFDQUFBQUFrQUFBQUtBQUFBQ3dCQmdCOExBNEFSQVE9PSI7dmFyIExlPW5ldyB0dCxiZT0hMTthc3luYyBmdW5jdGlvbiBISShBLHQsZSl7bGV0IHI9bnVsbDt0eXBlb2YgQSE9InN0cmluZyI/cj1BLmhyZWY6QS5zdGFydHNXaXRoKCJodHRwIik/cj1BOnI9YCR7dH0vJHtBfWAsci5lbmRzV2l0aCgiLmpzIikmJihyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtMykpLHIuZW5kc1dpdGgoIi53YXNtIikmJihyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtNSkpLHIuZW5kc1dpdGgoIi53YXNtLnpzdCIpJiYocj1yLnN1YnN0cmluZygwLHIubGVuZ3RoLTkpKTtsZXQgST1gJHtyfS53YXNtYCxvPWF3YWl0IEF0LmdldChgJHtJfS56c3RgLHtyZXNwb25zZVR5cGU6ImFycmF5YnVmZmVyIixwYXJhbXM6ZX0pO2JlfHwoYXdhaXQgTGUuaW5pdCgpLGJlPSEwKTtsZXQgZz1MZS5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoby5kYXRhKSkuYnVmZmVyO3JldHVybihhd2FpdCBpbXBvcnQoYCR7cn0uanNgKSkuZGVmYXVsdCh7d2FzbUJpbmFyeTpnfSl9dmFyIEplPUhJO3ZhciBldD1uZXcgTWFwO2FzeW5jIGZ1bmN0aW9uIE9JKEEsdCxlKXtsZXQgcj1BLEk9QSxvPW51bGw7cmV0dXJuIHR5cGVvZiBBIT0ic3RyaW5nIiYmKHI9bmV3IFVSTChBLmhyZWYpLEk9ci5ocmVmKSxldC5oYXMoSSk/bz1hd2FpdCBldC5nZXQoSSk6KGV0LnNldChJLEplKHIsdCxlKSksbz1hd2FpdCBldC5nZXQoSSkpLG99dmFyIEhlPU9JO3ZhciBZST17VGV4dEZpbGU6IlRleHRGaWxlIixCaW5hcnlGaWxlOiJCaW5hcnlGaWxlIixUZXh0U3RyZWFtOiJUZXh0U3RyZWFtIixCaW5hcnlTdHJlYW06IkJpbmFyeVN0cmVhbSIsSW1hZ2U6IkltYWdlIixQb2ludFNldDoiUG9pbnRTZXQiLE1lc2g6Ik1lc2giLFBvbHlEYXRhOiJQb2x5RGF0YSIsVHJhbnNmb3JtTGlzdDoiVHJhbnNmb3JtTGlzdCIsSnNvbkNvbXBhdGlibGU6Ikpzb25Db21wYXRpYmxlIn0scD1ZSTt2YXIgcUk9e0ludDg6ImludDgiLFVJbnQ4OiJ1aW50OCIsSW50MTY6ImludDE2IixVSW50MTY6InVpbnQxNiIsSW50MzI6ImludDMyIixVSW50MzI6InVpbnQzMiIsSW50NjQ6ImludDY0IixVSW50NjQ6InVpbnQ2NCIsU2l6ZVZhbHVlVHlwZToidWludDY0IixJZGVudGlmaWVyVHlwZToidWludDY0IixJbmRleFZhbHVlVHlwZToiaW50NjQiLE9mZnNldFZhbHVlVHlwZToiaW50NjQifSxMPXFJO3ZhciBNST17RmxvYXQzMjoiZmxvYXQzMiIsRmxvYXQ2NDoiZmxvYXQ2NCIsU3BhY2VQcmVjaXNpb25UeXBlOiJmbG9hdDY0In0sdEE9TUk7ZnVuY3Rpb24gVEkoQSx0KXtsZXQgZT1udWxsO3N3aXRjaChBKXtjYXNlIEwuVUludDg6e2U9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBMLkludDg6e2U9bmV3IEludDhBcnJheSh0KTticmVha31jYXNlIEwuVUludDE2OntlPW5ldyBVaW50MTZBcnJheSh0KTticmVha31jYXNlIEwuSW50MTY6e2U9bmV3IEludDE2QXJyYXkodCk7YnJlYWt9Y2FzZSBMLlVJbnQzMjp7ZT1uZXcgVWludDMyQXJyYXkodCk7YnJlYWt9Y2FzZSBMLkludDMyOntlPW5ldyBJbnQzMkFycmF5KHQpO2JyZWFrfWNhc2UgTC5VSW50NjQ6e3R5cGVvZiBnbG9iYWxUaGlzLkJpZ1VpbnQ2NEFycmF5PT0iZnVuY3Rpb24iP2U9bmV3IEJpZ1VpbnQ2NEFycmF5KHQpOmU9bmV3IFVpbnQ4QXJyYXkodCk7YnJlYWt9Y2FzZSBMLkludDY0Ont0eXBlb2YgZ2xvYmFsVGhpcy5CaWdJbnQ2NEFycmF5PT0iZnVuY3Rpb24iP2U9bmV3IEJpZ0ludDY0QXJyYXkodCk6ZT1uZXcgVWludDhBcnJheSh0KTticmVha31jYXNlIHRBLkZsb2F0MzI6e2U9bmV3IEZsb2F0MzJBcnJheSh0KTticmVha31jYXNlIHRBLkZsb2F0NjQ6e2U9bmV3IEZsb2F0NjRBcnJheSh0KTticmVha31jYXNlIm51bGwiOntlPW51bGw7YnJlYWt9Y2FzZSBudWxsOntlPW51bGw7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlR5cGUgaXMgbm90IHN1cHBvcnRlZCBhcyBhIFR5cGVkQXJyYXkiKX1yZXR1cm4gZX12YXIgeD1USTt2YXIgcWU9dHlwZW9mIGdsb2JhbFRoaXMuU2hhcmVkQXJyYXlCdWZmZXI9PSJmdW5jdGlvbiIsT2U9bmV3IFRleHRFbmNvZGVyLFllPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiKTtmdW5jdGlvbiB4SShBLHQpe2xldCBlPXtmbGFnczoiciIsZW5jb2Rpbmc6ImJpbmFyeSJ9LHI9QS5mc19vcGVuKHQsZS5mbGFncyksbz1BLmZzX3N0YXQodCkuc2l6ZSxpPW51bGw7cWU/aT1uZXcgU2hhcmVkQXJyYXlCdWZmZXIobyk6aT1uZXcgQXJyYXlCdWZmZXIobyk7bGV0IGc9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIEEuZnNfcmVhZChyLGcsMCxvLDApLEEuZnNfY2xvc2UociksZ31mdW5jdGlvbiBNZShBLHQsZSl7bGV0IHI9bnVsbDtxZT9yPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKTpyPW5ldyBBcnJheUJ1ZmZlcihlKTtsZXQgST1uZXcgVWludDhBcnJheShyKSxvPW5ldyBVaW50OEFycmF5KEEuSEVBUFU4LmJ1ZmZlcix0LGUpO3JldHVybiBJLnNldChvKSxJfWZ1bmN0aW9uIEYoQSx0LGUscil7bGV0IEk9MDtyZXR1cm4gdCE9PW51bGwmJihJPUEuY2NhbGwoIml0a193YXNtX2lucHV0X2FycmF5X2FsbG9jIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLGUscix0LmJ1ZmZlci5ieXRlTGVuZ3RoXSk+Pj4wLEEuSEVBUFU4LnNldChuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksSSkpLEl9ZnVuY3Rpb24gVihBLHQsZSl7bGV0IHI9SlNPTi5zdHJpbmdpZnkodCksST1BLmxlbmd0aEJ5dGVzVVRGOChyKSsxLG89QS5jY2FsbCgiaXRrX3dhc21faW5wdXRfanNvbl9hbGxvYyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxlLEldKT4+PjA7QS5zdHJpbmdUb1VURjgocixvLEkpfWZ1bmN0aW9uIFUoQSx0LGUscil7bGV0IEk9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxlXSk+Pj4wLG89QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAsdCxlXSksaT1NZShBLEksbyk7cmV0dXJuIHgocixpLmJ1ZmZlcil9ZnVuY3Rpb24gTkEoQSx0KXtsZXQgZT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfanNvbl9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciJdLFswLHRdKT4+PjAscj1BLlVURjhUb1N0cmluZyhlKTtyZXR1cm4gSlNPTi5wYXJzZShyKX1mdW5jdGlvbiBLSShBLHQsZSxyKXtyIT1udWxsJiZyLmxlbmd0aD4wJiZyLmZvckVhY2goZnVuY3Rpb24oQyxzKXtzd2l0Y2goQy50eXBlKXtjYXNlIHAuVGV4dFN0cmVhbTp7bGV0IEI9T2UuZW5jb2RlKEMuZGF0YS5kYXRhKSxmPUYoQSxCLHMsMCksYT17c2l6ZTpCLmJ1ZmZlci5ieXRlTGVuZ3RoLGRhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWB9O1YoQSxhLHMpO2JyZWFrfWNhc2UgcC5Kc29uQ29tcGF0aWJsZTp7bGV0IEI9T2UuZW5jb2RlKEpTT04uc3RyaW5naWZ5KEMuZGF0YSkpLGY9RihBLEIscywwKSxhPXtzaXplOkIuYnVmZmVyLmJ5dGVMZW5ndGgsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YH07VihBLGEscyk7YnJlYWt9Y2FzZSBwLkJpbmFyeVN0cmVhbTp7bGV0IEI9Qy5kYXRhLmRhdGEsZj1GKEEsQixzLDApLGE9e3NpemU6Qi5idWZmZXIuYnl0ZUxlbmd0aCxkYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gfTtWKEEsYSxzKTticmVha31jYXNlIHAuVGV4dEZpbGU6e0EuZnNfd3JpdGVGaWxlKEMuZGF0YS5wYXRoLEMuZGF0YS5kYXRhKTticmVha31jYXNlIHAuQmluYXJ5RmlsZTp7QS5mc193cml0ZUZpbGUoQy5kYXRhLnBhdGgsQy5kYXRhLmRhdGEpO2JyZWFrfWNhc2UgcC5JbWFnZTp7bGV0IEI9Qy5kYXRhLGY9RihBLEIuZGF0YSxzLDApLGE9RihBLEIuZGlyZWN0aW9uLHMsMSksbD10eXBlb2YgQi5tZXRhZGF0YT8uZW50cmllczwidSI/QXJyYXkuZnJvbShCLm1ldGFkYXRhLmVudHJpZXMoKSk6W10sYz17aW1hZ2VUeXBlOkIuaW1hZ2VUeXBlLG5hbWU6Qi5uYW1lLG9yaWdpbjpCLm9yaWdpbixzcGFjaW5nOkIuc3BhY2luZyxkaXJlY3Rpb246YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHthfWAsc2l6ZTpCLnNpemUsZGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2Z9YCxtZXRhZGF0YTpsfTtWKEEsYyxzKTticmVha31jYXNlIHAuTWVzaDp7bGV0IEI9Qy5kYXRhLGY9RihBLEIucG9pbnRzLHMsMCksYT1GKEEsQi5jZWxscyxzLDEpLGw9RihBLEIucG9pbnREYXRhLHMsMiksYz1GKEEsQi5jZWxsRGF0YSxzLDMpLEU9e21lc2hUeXBlOkIubWVzaFR5cGUsbmFtZTpCLm5hbWUsbnVtYmVyT2ZQb2ludHM6Qi5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsbnVtYmVyT2ZDZWxsczpCLm51bWJlck9mQ2VsbHMsY2VsbHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHthfWAsY2VsbEJ1ZmZlclNpemU6Qi5jZWxsQnVmZmVyU2l6ZSxudW1iZXJPZlBvaW50UGl4ZWxzOkIubnVtYmVyT2ZQb2ludFBpeGVscyxwb2ludERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtsfWAsbnVtYmVyT2ZDZWxsUGl4ZWxzOkIubnVtYmVyT2ZDZWxsUGl4ZWxzLGNlbGxEYXRhOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Y31gfTtWKEEsRSxzKTticmVha31jYXNlIHAuUG9pbnRTZXQ6e2xldCBCPUMuZGF0YSxmPUYoQSxCLnBvaW50cyxzLDApLGE9RihBLEIucG9pbnREYXRhLHMsMSksbD17cG9pbnRTZXRUeXBlOkIucG9pbnRTZXRUeXBlLG5hbWU6Qi5uYW1lLG51bWJlck9mUG9pbnRzOkIubnVtYmVyT2ZQb2ludHMscG9pbnRzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7Zn1gLG51bWJlck9mUG9pbnRQaXhlbHM6Qi5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2F9YH07VihBLGwscyk7YnJlYWt9Y2FzZSBwLlRyYW5zZm9ybUxpc3Q6e2xldCBCPUMuZGF0YSxmPVtdLGE9MDtCLmZvckVhY2gobD0+e2xldCBjPSIiLEU9IiI7bC50cmFuc2Zvcm1UeXBlLnRyYW5zZm9ybVBhcmFtZXRlcml6YXRpb24hPT0iQ29tcG9zaXRlIiYmKGM9YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtGKEEsbC5maXhlZFBhcmFtZXRlcnMscyxhKX1gLGErPTEsRT1gZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke0YoQSxsLnBhcmFtZXRlcnMscyxhKX1gLGErPTEpO2xldCB1PXt0cmFuc2Zvcm1UeXBlOmwudHJhbnNmb3JtVHlwZSxudW1iZXJPZkZpeGVkUGFyYW1ldGVyczpsLm51bWJlck9mRml4ZWRQYXJhbWV0ZXJzLG51bWJlck9mUGFyYW1ldGVyczpsLm51bWJlck9mUGFyYW1ldGVycyxuYW1lOmwubmFtZSxpbnB1dFNwYWNlTmFtZTpsLmlucHV0U3BhY2VOYW1lLG91dHB1dFNwYWNlTmFtZTpsLm91dHB1dFNwYWNlTmFtZSxwYXJhbWV0ZXJzOkUsZml4ZWRQYXJhbWV0ZXJzOmN9O2YucHVzaCh1KX0pLFYoQSxmLHMpO2JyZWFrfWNhc2UgcC5Qb2x5RGF0YTp7bGV0IEI9Qy5kYXRhLGY9RihBLEIucG9pbnRzLHMsMCksYT1GKEEsQi52ZXJ0aWNlcyxzLDEpLGw9RihBLEIubGluZXMscywyKSxjPUYoQSxCLnBvbHlnb25zLHMsMyksRT1GKEEsQi50cmlhbmdsZVN0cmlwcyxzLDQpLHU9RihBLEIucG9pbnREYXRhLHMsNSkseT1GKEEsQi5wb2ludERhdGEscyw2KSxoPXtwb2x5RGF0YVR5cGU6Qi5wb2x5RGF0YVR5cGUsbmFtZTpCLm5hbWUsbnVtYmVyT2ZQb2ludHM6Qi5udW1iZXJPZlBvaW50cyxwb2ludHM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtmfWAsdmVydGljZXNCdWZmZXJTaXplOkIudmVydGljZXNCdWZmZXJTaXplLHZlcnRpY2VzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7YX1gLGxpbmVzQnVmZmVyU2l6ZTpCLmxpbmVzQnVmZmVyU2l6ZSxsaW5lczpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke2x9YCxwb2x5Z29uc0J1ZmZlclNpemU6Qi5wb2x5Z29uc0J1ZmZlclNpemUscG9seWdvbnM6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHtjfWAsdHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplOkIudHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplLHRyaWFuZ2xlU3RyaXBzOmBkYXRhOmFwcGxpY2F0aW9uL3ZuZC5pdGsuYWRkcmVzcywwOiR7RX1gLG51bWJlck9mUG9pbnRQaXhlbHM6Qi5udW1iZXJPZlBvaW50UGl4ZWxzLHBvaW50RGF0YTpgZGF0YTphcHBsaWNhdGlvbi92bmQuaXRrLmFkZHJlc3MsMDoke3V9YCxudW1iZXJPZkNlbGxQaXhlbHM6Qi5udW1iZXJPZkNlbGxQaXhlbHMsY2VsbERhdGE6YGRhdGE6YXBwbGljYXRpb24vdm5kLml0ay5hZGRyZXNzLDA6JHt5fWB9O1YoQSxoLHMpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGlucHV0IEludGVyZmFjZVR5cGUiKX19KSxBLnJlc2V0TW9kdWxlU3Rkb3V0KCksQS5yZXNldE1vZHVsZVN0ZGVycigpO2xldCBJPUEuc3RhY2tTYXZlKCksbz0wO3RyeXtvPUEuY2FsbE1haW4odC5zbGljZSgpKX1jYXRjaChDKXt0aHJvdyB0eXBlb2YgQz09Im51bWJlciImJihjb25zb2xlLmxvZygiRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgcGlwZWxpbmU6IiksY29uc29sZS5sb2coInN0ZG91dDoiLEEuZ2V0TW9kdWxlU3Rkb3V0KCkpLGNvbnNvbGUuZXJyb3IoInN0ZGVycjoiLEEuZ2V0TW9kdWxlU3RkZXJyKCkpLHR5cGVvZiBBLmdldEV4Y2VwdGlvbk1lc3NhZ2U8InUiP2NvbnNvbGUuZXJyb3IoImV4Y2VwdGlvbjoiLEEuZ2V0RXhjZXB0aW9uTWVzc2FnZShDKSk6Y29uc29sZS5lcnJvcigiQnVpbGQgbW9kdWxlIGluIERlYnVnIG1vZGUgZm9yIGV4Y2VwdGlvbiBtZXNzYWdlIGluZm9ybWF0aW9uLiIpKSxDfWZpbmFsbHl7QS5zdGFja1Jlc3RvcmUoSSl9bGV0IGk9QS5nZXRNb2R1bGVTdGRvdXQoKSxnPUEuZ2V0TW9kdWxlU3RkZXJyKCksUT1bXTtyZXR1cm4gZSE9bnVsbCYmZS5sZW5ndGg+MCYmbz09PTAmJmUuZm9yRWFjaChmdW5jdGlvbihDLHMpe2xldCBCPW51bGw7c3dpdGNoKEMudHlwZSl7Y2FzZSBwLlRleHRTdHJlYW06e2xldCBhPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9hZGRyZXNzIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pPj4+MCxsPUEuY2NhbGwoIml0a193YXNtX291dHB1dF9hcnJheV9zaXplIiwibnVtYmVyIixbIm51bWJlciIsIm51bWJlciIsIm51bWJlciJdLFswLHMsMF0pLGM9bmV3IFVpbnQ4QXJyYXkoQS5IRUFQVTguYnVmZmVyLGEsbCk7Qj17ZGF0YTpZZS5kZWNvZGUoYyl9O2JyZWFrfWNhc2UgcC5Kc29uQ29tcGF0aWJsZTp7bGV0IGE9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X2FkZHJlc3MiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSk+Pj4wLGw9QS5jY2FsbCgiaXRrX3dhc21fb3V0cHV0X2FycmF5X3NpemUiLCJudW1iZXIiLFsibnVtYmVyIiwibnVtYmVyIiwibnVtYmVyIl0sWzAscywwXSksYz1uZXcgVWludDhBcnJheShBLkhFQVBVOC5idWZmZXIsYSxsKTtCPUpTT04ucGFyc2UoWWUuZGVjb2RlKGMpKTticmVha31jYXNlIHAuQmluYXJ5U3RyZWFtOntsZXQgYT1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfYWRkcmVzcyIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKT4+PjAsbD1BLmNjYWxsKCJpdGtfd2FzbV9vdXRwdXRfYXJyYXlfc2l6ZSIsIm51bWJlciIsWyJudW1iZXIiLCJudW1iZXIiLCJudW1iZXIiXSxbMCxzLDBdKTtCPXtkYXRhOk1lKEEsYSxsKX07YnJlYWt9Y2FzZSBwLlRleHRGaWxlOntCPXtwYXRoOkMuZGF0YS5wYXRoLGRhdGE6QS5mc19yZWFkRmlsZShDLmRhdGEucGF0aCx7ZW5jb2Rpbmc6InV0ZjgifSl9O2JyZWFrfWNhc2UgcC5CaW5hcnlGaWxlOntCPXtwYXRoOkMuZGF0YS5wYXRoLGRhdGE6eEkoQSxDLmRhdGEucGF0aCl9O2JyZWFrfWNhc2UgcC5JbWFnZTp7bGV0IGE9TkEoQSxzKTthLmRhdGE9VShBLHMsMCxhLmltYWdlVHlwZS5jb21wb25lbnRUeXBlKSxhLmRpcmVjdGlvbj1VKEEscywxLHRBLkZsb2F0NjQpLGEubWV0YWRhdGE9bmV3IE1hcChhLm1ldGFkYXRhKSxCPWE7YnJlYWt9Y2FzZSBwLk1lc2g6e2xldCBhPU5BKEEscyk7YS5udW1iZXJPZlBvaW50cz4wP2EucG9pbnRzPVUoQSxzLDAsYS5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUpOmEucG9pbnRzPXgoYS5tZXNoVHlwZS5wb2ludENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhLm51bWJlck9mQ2VsbHM+MD9hLmNlbGxzPVUoQSxzLDEsYS5tZXNoVHlwZS5jZWxsQ29tcG9uZW50VHlwZSk6YS5jZWxscz14KGEubWVzaFR5cGUuY2VsbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxhLm51bWJlck9mUG9pbnRQaXhlbHM+MD9hLnBvaW50RGF0YT1VKEEscywyLGEubWVzaFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOmEucG9pbnREYXRhPXgoYS5tZXNoVHlwZS5wb2ludFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGEubnVtYmVyT2ZDZWxsUGl4ZWxzPjA/YS5jZWxsRGF0YT1VKEEscywzLGEubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6YS5jZWxsRGF0YT14KGEubWVzaFR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLEI9YTticmVha31jYXNlIHAuUG9pbnRTZXQ6e2xldCBhPU5BKEEscyk7YS5udW1iZXJPZlBvaW50cz4wP2EucG9pbnRzPVUoQSxzLDAsYS5wb2ludFNldFR5cGUucG9pbnRDb21wb25lbnRUeXBlKTphLnBvaW50cz14KGEucG9pbnRTZXRUeXBlLnBvaW50Q29tcG9uZW50VHlwZSxuZXcgQXJyYXlCdWZmZXIoMCkpLGEubnVtYmVyT2ZQb2ludFBpeGVscz4wP2EucG9pbnREYXRhPVUoQSxzLDEsYS5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUpOmEucG9pbnREYXRhPXgoYS5wb2ludFNldFR5cGUucG9pbnRQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCPWE7YnJlYWt9Y2FzZSBwLlRyYW5zZm9ybUxpc3Q6e2xldCBhPU5BKEEscyksbD0wO2EuZm9yRWFjaCgoYyxFKT0+e2MudHJhbnNmb3JtVHlwZS50cmFuc2Zvcm1QYXJhbWV0ZXJpemF0aW9uIT09IkNvbXBvc2l0ZSImJihjLm51bWJlck9mRml4ZWRQYXJhbWV0ZXJzPjAmJihhW0VdLmZpeGVkUGFyYW1ldGVycz1VKEEscyxsLHRBLkZsb2F0NjQpKSxsKz0xLGMubnVtYmVyT2ZQYXJhbWV0ZXJzPjAmJihhW0VdLnBhcmFtZXRlcnM9VShBLHMsbCxjLnRyYW5zZm9ybVR5cGUucGFyYW1ldGVyc1ZhbHVlVHlwZSkpLGwrPTEpfSksQj1hO2JyZWFrfWNhc2UgcC5Qb2x5RGF0YTp7bGV0IGE9TkEoQSxzKTthLm51bWJlck9mUG9pbnRzPjA/YS5wb2ludHM9VShBLHMsMCx0QS5GbG9hdDMyKTphLnBvaW50cz1uZXcgRmxvYXQzMkFycmF5LGEudmVydGljZXNCdWZmZXJTaXplPjA/YS52ZXJ0aWNlcz1VKEEscywxLEwuVUludDMyKTphLnZlcnRpY2VzPW5ldyBVaW50MzJBcnJheSxhLmxpbmVzQnVmZmVyU2l6ZT4wP2EubGluZXM9VShBLHMsMixMLlVJbnQzMik6YS5saW5lcz1uZXcgVWludDMyQXJyYXksYS5wb2x5Z29uc0J1ZmZlclNpemU+MD9hLnBvbHlnb25zPVUoQSxzLDMsTC5VSW50MzIpOmEucG9seWdvbnM9bmV3IFVpbnQzMkFycmF5LGEudHJpYW5nbGVTdHJpcHNCdWZmZXJTaXplPjA/YS50cmlhbmdsZVN0cmlwcz1VKEEscyw0LEwuVUludDMyKTphLnRyaWFuZ2xlU3RyaXBzPW5ldyBVaW50MzJBcnJheSxhLm51bWJlck9mUG9pbnRQaXhlbHM+MD9hLnBvaW50RGF0YT1VKEEscyw1LGEucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlKTphLnBvaW50RGF0YT14KGEucG9seURhdGFUeXBlLnBvaW50UGl4ZWxDb21wb25lbnRUeXBlLG5ldyBBcnJheUJ1ZmZlcigwKSksYS5udW1iZXJPZkNlbGxQaXhlbHM+MD9hLmNlbGxEYXRhPVUoQSxzLDYsYS5wb2x5RGF0YVR5cGUuY2VsbFBpeGVsQ29tcG9uZW50VHlwZSk6YS5jZWxsRGF0YT14KGEucG9seURhdGFUeXBlLmNlbGxQaXhlbENvbXBvbmVudFR5cGUsbmV3IEFycmF5QnVmZmVyKDApKSxCPWE7YnJlYWt9ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgb3V0cHV0IEludGVyZmFjZVR5cGUiKX1sZXQgZj17dHlwZTpDLnR5cGUsZGF0YTpCfTtRLnB1c2goZil9KSx7cmV0dXJuVmFsdWU6byxzdGRvdXQ6aSxzdGRlcnI6ZyxvdXRwdXRzOlF9fXZhciBUZT1LSTt2YXIgUEk9dHlwZW9mIGdsb2JhbFRoaXMuU2hhcmVkQXJyYXlCdWZmZXI8InUiO2Z1bmN0aW9uIF9JKEEsdCl7aWYoQT09bnVsbClyZXR1cm5bXTtsZXQgZT1bXTtmb3IobGV0IHI9MDtyPEEubGVuZ3RoO3IrKyl7bGV0IEk9akkoQVtyXSx0KTtJIT09bnVsbCYmZS5wdXNoKEkpfXJldHVybiBlfWZ1bmN0aW9uIGpJKEEsdCl7aWYoQT09bnVsbClyZXR1cm4gbnVsbDtsZXQgZT1udWxsO3JldHVybiBBLmJ1ZmZlciE9PXZvaWQgMD9lPUEuYnVmZmVyOkEuYnl0ZUxlbmd0aCE9PXZvaWQgMCYmKGU9QSksUEkmJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcj9udWxsOnQ/ZTplLnNsaWNlKDApfXZhciB4ZT1fSTtmdW5jdGlvbiBXSShBKXtyZXR1cm5bQS5kYXRhLEEuZGlyZWN0aW9uXX12YXIgS2U9V0k7ZnVuY3Rpb24gWkkoQSl7cmV0dXJuW0EucG9pbnRzLEEucG9pbnREYXRhLEEuY2VsbHMsQS5jZWxsRGF0YV19dmFyIFBlPVpJO2Z1bmN0aW9uIFZJKEEpe3JldHVybltBLnBvaW50cyxBLnZlcnRpY2VzLEEubGluZXMsQS5wb2x5Z29ucyxBLnRyaWFuZ2xlU3RyaXBzLEEucG9pbnREYXRhLEEuY2VsbERhdGFdfXZhciBfZT1WSTthc3luYyBmdW5jdGlvbiB6SShBLHQsZSxyKXtsZXQgST1UZShBLHQsZSxyKSxvPVtdO3JldHVybiBJLm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbihpKXtpZihpLnR5cGU9PT1wLkJpbmFyeVN0cmVhbXx8aS50eXBlPT09cC5CaW5hcnlGaWxlKXtsZXQgZz1pLmRhdGE7by5wdXNoKGcpfWVsc2UgaWYoaS50eXBlPT09cC5JbWFnZSl7bGV0IGc9aS5kYXRhO28ucHVzaCguLi5LZShnKSl9ZWxzZSBpZihpLnR5cGU9PT1wLk1lc2gpe2xldCBnPWkuZGF0YTtvLnB1c2goLi4uUGUoZykpfWVsc2UgaWYoaS50eXBlPT09cC5Qb2x5RGF0YSl7bGV0IGc9aS5kYXRhO28ucHVzaCguLi5fZShnKSl9fSksZ3QoSSx4ZShvLCEwKSl9dmFyIGplPXpJO3ZhciBYST17cnVuUGlwZWxpbmU6YXN5bmMgZnVuY3Rpb24oQSx0LGUscixJLG8pe2xldCBpPWF3YWl0IEhlKEEsdCxvKTtyZXR1cm4gYXdhaXQgamUoaSxlLHIsSSl9fTtZQShYSSk7JTBBLyohIEJ1bmRsZWQgbGljZW5zZSBpbmZvcm1hdGlvbjolMEElMEFjb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzOiUwQSAgKCoqJTBBICAgKiBAbGljZW5zZSUwQSAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQyUwQSAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAlMEEgICAqKSUwQSovJTBBJztDcihRcik7ZXhwb3J0e2JpIGFzIGRvd25zYW1wbGUsU2kgYXMgZG93bnNhbXBsZUJpblNocmluayxOaSBhcyBkb3duc2FtcGxlTGFiZWxJbWFnZSxVaSBhcyBkb3duc2FtcGxlU2lnbWEsSmkgYXMgZ2F1c3NpYW5LZXJuZWxSYWRpdXMsSCBhcyBnZXREZWZhdWx0V2ViV29ya2VyLEcgYXMgZ2V0UGlwZWxpbmVXb3JrZXJVcmwsTyBhcyBnZXRQaXBlbGluZXNCYXNlVXJsLEhpIGFzIHJlc2FtcGxlQm91bmRpbmdCb3gsWWkgYXMgcmVzYW1wbGVUb1JlZmVyZW5jZSxtcyBhcyBzZXREZWZhdWx0V2ViV29ya2VyLENyIGFzIHNldFBpcGVsaW5lV29ya2VyVXJsLHVzIGFzIHNldFBpcGVsaW5lc0Jhc2VVcmwsUWUgYXMgdmVyc2lvbn07Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246Cgpjb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzOgogICgqKgogICAqIEBsaWNlbnNlCiAgICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQwogICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAgICopCiovCg==""" default_config = JsPackageConfig(default_js_module) js_package = JsPackage(default_config) diff --git a/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/resample_to_reference_async.py b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/resample_to_reference_async.py new file mode 100644 index 000000000..1fee9f8e8 --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample-emscripten/itkwasm_downsample_emscripten/resample_to_reference_async.py @@ -0,0 +1,73 @@ +# 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, + TransformList, +) + +async def resample_to_reference_async( + input: Image, + reference_image: Image, + transform: Optional[TransformList] = None, + interpolator: str = "linear", + default_value: float = 0, +) -> Image: + """Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + + :param input: The moving image to resample. + :type input: Image + + :param reference_image: Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + :type reference_image: Image + + :param transform: Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. + :type transform: TransformList + + :param interpolator: Interpolation method used to sample the moving image. + :type interpolator: str + + :param default_value: Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. + :type default_value: float + + :return: The resampled output image. + :rtype: Image + """ + js_module = await js_package.js_module + web_worker = js_resources.web_worker + + kwargs = {} + if transform is not None: + kwargs["transform"] = to_js(transform) + if interpolator: + kwargs["interpolator"] = to_js(interpolator) + if default_value is not None: + kwargs["defaultValue"] = to_js(default_value) + + outputs = await js_module.resampleToReference(to_js(input), to_js(reference_image), 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/packages/downsample/python/itkwasm-downsample-emscripten/pyproject.toml b/packages/downsample/python/itkwasm-downsample-emscripten/pyproject.toml index 13e1c6766..cab50e260 100644 --- a/packages/downsample/python/itkwasm-downsample-emscripten/pyproject.toml +++ b/packages/downsample/python/itkwasm-downsample-emscripten/pyproject.toml @@ -33,7 +33,7 @@ keywords = [ requires-python = ">=3.8" dependencies = [ - "itkwasm >= 1.0.b145", + "itkwasm >= 1.0.b185", ] [tool.hatch.version] diff --git a/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/__init__.py b/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/__init__.py index edc72849a..e4fb1fa03 100644 --- a/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/__init__.py +++ b/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/__init__.py @@ -8,5 +8,6 @@ from .downsample import downsample from .gaussian_kernel_radius import gaussian_kernel_radius from .resample_bounding_box import resample_bounding_box +from .resample_to_reference import resample_to_reference from ._version import __version__ diff --git a/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/resample_to_reference.py b/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/resample_to_reference.py new file mode 100644 index 000000000..110945737 --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample-wasi/itkwasm_downsample_wasi/resample_to_reference.py @@ -0,0 +1,91 @@ +# 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, + TransformList, +) + +def resample_to_reference( + input: Image, + reference_image: Image, + transform: Optional[TransformList] = None, + interpolator: str = "linear", + default_value: float = 0, +) -> Image: + """Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + + :param input: The moving image to resample. + :type input: Image + + :param reference_image: Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + :type reference_image: Image + + :param transform: Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. + :type transform: TransformList + + :param interpolator: Interpolation method used to sample the moving image. + :type interpolator: str + + :param default_value: Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. + :type default_value: float + + :return: The resampled output image. + :rtype: Image + """ + global _pipeline + if _pipeline is None: + _pipeline = Pipeline(file_resources('itkwasm_downsample_wasi').joinpath(Path('wasm_modules') / Path('resample-to-reference.wasi.wasm'))) + + pipeline_outputs: List[PipelineOutput] = [ + PipelineOutput(InterfaceTypes.Image), + ] + + pipeline_inputs: List[PipelineInput] = [ + PipelineInput(InterfaceTypes.Image, input), + PipelineInput(InterfaceTypes.Image, reference_image), + ] + + args: List[str] = ['--memory-io',] + # Inputs + args.append('0') + args.append('1') + # Outputs + output_name = '0' + args.append(output_name) + + # Options + input_count = len(pipeline_inputs) + if transform is not None: + pipeline_inputs.append(PipelineInput(InterfaceTypes.TransformList, transform)) + args.append('--transform') + args.append(str(input_count)) + input_count += 1 + + if interpolator: + if interpolator not in ('linear','nearest_neighbor','label_image','b_spline','windowed_sinc','gaussian'): + raise ValueError(f'interpolator must be one of linear, nearest_neighbor, label_image, b_spline, windowed_sinc, gaussian') + args.append('--interpolator') + args.append(str(interpolator)) + + if default_value is not None: + args.append('--default-value') + args.append(str(default_value)) + + + outputs = _pipeline.run(args, pipeline_outputs, pipeline_inputs) + + result = outputs[0].data + return result + diff --git a/packages/downsample/python/itkwasm-downsample-wasi/pyproject.toml b/packages/downsample/python/itkwasm-downsample-wasi/pyproject.toml index f3bb2ca1a..093b7ab8c 100644 --- a/packages/downsample/python/itkwasm-downsample-wasi/pyproject.toml +++ b/packages/downsample/python/itkwasm-downsample-wasi/pyproject.toml @@ -33,7 +33,7 @@ keywords = [ requires-python = ">=3.8" dependencies = [ - "itkwasm >= 1.0.b145", + "itkwasm >= 1.0.b185", "importlib_resources", ] diff --git a/packages/downsample/python/itkwasm-downsample-wasi/test/test_resample_to_reference.py b/packages/downsample/python/itkwasm-downsample-wasi/test/test_resample_to_reference.py new file mode 100644 index 000000000..85b4ffd9c --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample-wasi/test/test_resample_to_reference.py @@ -0,0 +1,298 @@ +import numpy as np +import pytest + +from itkwasm import ( + PixelTypes, + Transform, + TransformType, + TransformParameterizations, + FloatTypes, +) +from itkwasm_compare_images import compare_images +from itkwasm_image_io import read_image, write_image +from itkwasm_transform_io import transformread + +from itkwasm_downsample_wasi import resample_to_reference + +from .common import test_input_path, test_baseline_path, test_output_path + + +def translation_transform(offset): + """A single-entry TransformList holding a float64 TranslationTransform. + + A Translation is a distinct parameterization from Affine, with only ``dimension`` parameters (the offset) + and no fixed parameters; the pipeline reconstructs it generically rather than coercing it into an affine. + """ + dimension = len(offset) + transform_type = TransformType( + transformParameterization=TransformParameterizations.Translation, + parametersValueType=FloatTypes.Float64, + inputDimension=dimension, + outputDimension=dimension, + ) + transform = Transform( + transformType=transform_type, + numberOfFixedParameters=0, + numberOfParameters=dimension, + fixedParameters=np.empty((0,), dtype=np.float64), + parameters=np.asarray(offset, dtype=np.float64), + name="TranslationTransform", + ) + return [transform] + + +def affine_transform(matrix_row_major, translation, center): + """A single-entry TransformList holding a float64 AffineTransform. + + ITK's MatrixOffsetTransformBase packs its parameters as the row-major matrix followed by the translation, and + its fixed parameters as the center of rotation: parameters = [*matrix_row_major, *translation], + fixedParameters = center. + """ + dimension = len(translation) + transform_type = TransformType( + transformParameterization=TransformParameterizations.Affine, + parametersValueType=FloatTypes.Float64, + inputDimension=dimension, + outputDimension=dimension, + ) + parameters = np.asarray(list(matrix_row_major) + list(translation), dtype=np.float64) + transform = Transform( + transformType=transform_type, + numberOfFixedParameters=len(center), + numberOfParameters=len(parameters), + fixedParameters=np.asarray(center, dtype=np.float64), + parameters=parameters, + name="AffineTransform", + ) + return [transform] + + +def test_resample_to_reference(): + """Linear interpolation with a non-identity affine transform. + + Resample cthead1 onto a reference grid whose size/spacing/origin all differ + from the moving image, applying the affine transform (rotation about the + centre + translation) read from the packed ``.h5``. The baseline was produced + independently with the native itk ``ResampleImageFilter`` (Phase 04), so the + comparison is not self-referential. + """ + test_moving_file_path = test_input_path / 'cthead1.png' + test_reference_file_path = test_input_path / 'cthead1-resample-reference.nrrd' + test_transform_file_path = test_input_path / 'cthead1-resample-transform.h5' + test_output_file_path = test_output_path / 'resample-test-cthead1-linear.mha' + test_baseline_file_path = test_baseline_path / 'cthead1-resample-linear.nrrd' + + moving = read_image(test_moving_file_path) + reference = read_image(test_reference_file_path) + transform = transformread(test_transform_file_path) + + output = resample_to_reference(moving, reference, transform=transform, interpolator='linear') + write_image(output, test_output_file_path) + + baseline = read_image(test_baseline_file_path) + metrics, _, _ = compare_images(output, [baseline,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_nearest_neighbor(): + """Nearest-neighbor interpolation with the same affine transform.""" + test_moving_file_path = test_input_path / 'cthead1.png' + test_reference_file_path = test_input_path / 'cthead1-resample-reference.nrrd' + test_transform_file_path = test_input_path / 'cthead1-resample-transform.h5' + test_output_file_path = test_output_path / 'resample-test-cthead1-nearest-neighbor.mha' + test_baseline_file_path = test_baseline_path / 'cthead1-resample-nearest-neighbor.nrrd' + + moving = read_image(test_moving_file_path) + reference = read_image(test_reference_file_path) + transform = transformread(test_transform_file_path) + + output = resample_to_reference(moving, reference, transform=transform, interpolator='nearest_neighbor') + write_image(output, test_output_file_path) + + baseline = read_image(test_baseline_file_path) + metrics, _, _ = compare_images(output, [baseline,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_label_image(): + """label_image interpolator. + + ITK's GenericLabelInterpolator (the ``label_image`` backend) is not in the + ``itk`` Python wheel, so Phase 04 produced no independent baseline. Instead, + mirror the C++ ``resample-to-reference-label-image`` ctest: resample the multi-label image + ``2th_cthead1.png`` onto its own geometry with the identity transform. A + grid-aligned identity resample samples each output point at an exact input + pixel centre, so the label interpolator reproduces the input labels exactly -- + the input image is therefore its own trusted baseline. + """ + test_label_file_path = test_input_path / '2th_cthead1.png' + test_output_file_path = test_output_path / 'resample-test-2th_cthead1-label-image.mha' + + label_image = read_image(test_label_file_path) + + output = resample_to_reference(label_image, label_image, interpolator='label_image') + write_image(output, test_output_file_path) + + baseline = read_image(test_label_file_path) + metrics, _, _ = compare_images(output, [baseline,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_vector_image(): + """VectorImage (multi-component) path. + + itkwasm reads apple.jpg as ``RGB`` and the reference ``.mha`` as ``Vector``, + but resample's SupportInputImageTypes dispatch only matches + ``VariableLengthVector``, so reassign the pixelType on both the moving and + reference images before calling resample (as ``test_downsample_vector_image`` + does). The independent baseline uses the identity transform (grid change only). + """ + test_moving_file_path = test_input_path / 'apple.jpg' + test_reference_file_path = test_input_path / 'apple-resample-reference.mha' + test_output_file_path = test_output_path / 'resample-test-apple-linear.mha' + test_baseline_file_path = test_baseline_path / 'apple-resample-linear.mha' + + moving = read_image(test_moving_file_path) + moving.imageType.pixelType = PixelTypes.VariableLengthVector + reference = read_image(test_reference_file_path) + reference.imageType.pixelType = PixelTypes.VariableLengthVector + + output = resample_to_reference(moving, reference, interpolator='linear') + write_image(output, test_output_file_path) + + baseline = read_image(test_baseline_file_path) + metrics, _, _ = compare_images(output, [baseline,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_generic_translation(): + """Generic (non-affine) parameterization support. + + A Translation transform must be applied as a real translation, not coerced into an affine. It maps the output + grid by x -> x + offset, identical to an affine with the identity matrix and the same translation -- so both + resamples produce the same image. (The previous affine-only reader copied the two translation parameters into + the affine's first two matrix slots, silently producing a shear.) + """ + moving = read_image(test_input_path / 'cthead1.png') + + offset = [12, -7] + via_translation = resample_to_reference( + moving, moving, transform=translation_transform(offset), interpolator='linear') + via_affine = resample_to_reference( + moving, moving, transform=affine_transform([1, 0, 0, 1], offset, [0, 0]), interpolator='linear') + + metrics, _, _ = compare_images(via_translation, [via_affine,]) + assert metrics['almostEqual'] + + +def composite_marker(dimension): + """A single-entry TransformList holding the Composite marker itkwasm uses to serialize an + itk::CompositeTransform: the marker carries no parameters of its own; the components follow it.""" + transform_type = TransformType( + transformParameterization=TransformParameterizations.Composite, + parametersValueType=FloatTypes.Float64, + inputDimension=dimension, + outputDimension=dimension, + ) + transform = Transform( + transformType=transform_type, + numberOfFixedParameters=0, + numberOfParameters=0, + fixedParameters=np.empty((0,), dtype=np.float64), + parameters=np.empty((0,), dtype=np.float64), + name="CompositeTransform", + ) + return [transform] + + +def test_resample_to_reference_composes_transform_chain(): + """Chained transforms: the list [A, B] is composed with itk::CompositeTransform semantics -- the LAST entry + is applied to the point first, so the mapping is A(B(x)). + + Here A = scale-by-2 about the origin and B = translate(10, 6): A(B(x)) = 2*(x + (10, 6)) = 2x + (20, 12). + Every value is exactly representable in floating point and the arithmetic is exact, so the chained resample + is identical to the single equivalent affine (matrix [2,0;0,2], translation (20,12)). The wrong composition + order, B(A(x)) = 2x + (10, 6), is a 10-pixel shift away -- asserting it does NOT match locks the order + semantics.""" + moving = read_image(test_input_path / 'cthead1.png') + + chain = affine_transform([2, 0, 0, 2], [0, 0], [0, 0]) + translation_transform([10, 6]) + via_chain = resample_to_reference(moving, moving, transform=chain, interpolator='linear') + + via_single = resample_to_reference( + moving, moving, transform=affine_transform([2, 0, 0, 2], [20, 12], [0, 0]), interpolator='linear') + metrics, _, _ = compare_images(via_chain, [via_single,]) + assert metrics['almostEqual'] + + via_wrong_order = resample_to_reference( + moving, moving, transform=affine_transform([2, 0, 0, 2], [10, 6], [0, 0]), interpolator='linear') + metrics_wrong, _, _ = compare_images(via_chain, [via_wrong_order,]) + assert not metrics_wrong['almostEqual'] + + +def test_resample_to_reference_composite_marker_list(): + """The same chain serialized the way transform-io serializes an itk::CompositeTransform (a Composite marker + entry followed by the component transforms) must compose identically to the bare chain.""" + moving = read_image(test_input_path / 'cthead1.png') + + composite = (composite_marker(2) + + affine_transform([2, 0, 0, 2], [0, 0], [0, 0]) + + translation_transform([10, 6])) + via_composite = resample_to_reference(moving, moving, transform=composite, interpolator='linear') + + via_single = resample_to_reference( + moving, moving, transform=affine_transform([2, 0, 0, 2], [20, 12], [0, 0]), interpolator='linear') + metrics, _, _ = compare_images(via_composite, [via_single,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_composite_h5_round_trip(): + """End-to-end interop: write the composite chain to .h5 with transform-io, read it back, and resample. + + This validates the hand-built Composite marker convention against transform-io's real serialization -- the + round-tripped TransformList must compose identically to the single equivalent affine.""" + from itkwasm_transform_io import transformwrite + + moving = read_image(test_input_path / 'cthead1.png') + + composite = (composite_marker(2) + + affine_transform([2, 0, 0, 2], [0, 0], [0, 0]) + + translation_transform([10, 6])) + composite_path = test_output_path / 'resample-to-reference-chain-composite.h5' + transformwrite(composite, composite_path) + round_tripped = transformread(composite_path) + + via_round_trip = resample_to_reference(moving, moving, transform=round_tripped, interpolator='linear') + + via_single = resample_to_reference( + moving, moving, transform=affine_transform([2, 0, 0, 2], [20, 12], [0, 0]), interpolator='linear') + metrics, _, _ = compare_images(via_round_trip, [via_single,]) + assert metrics['almostEqual'] + + +def test_resample_to_reference_rejects_component_free_composite(): + """A Composite marker with no component transforms has no defined mapping; the reader raises (surfaced as a + pipeline abort) rather than resampling with an empty composite.""" + moving = read_image(test_input_path / 'cthead1.png') + + with pytest.raises(Exception): + resample_to_reference(moving, moving, transform=composite_marker(2), interpolator='linear') + + +def test_resample_to_reference_background_value(): + """Background value: output samples that map outside the moving image get the default pixel value. + + A large translation pushes the entire output grid outside the moving image, so with nearest-neighbor + sampling every output pixel becomes exactly the background value -- 200 when set, and the ITK default of 0 + when unset.""" + import numpy as np + + moving = read_image(test_input_path / 'cthead1.png') + far_outside = translation_transform([100000, 100000]) + + background = resample_to_reference( + moving, moving, transform=far_outside, interpolator='nearest_neighbor', default_value=200) + assert np.all(background.data == 200) + + zeroed = resample_to_reference(moving, moving, transform=far_outside, interpolator='nearest_neighbor') + assert np.all(zeroed.data == 0) diff --git a/packages/downsample/python/itkwasm-downsample-wasi/tests/test_resample_to_reference.py b/packages/downsample/python/itkwasm-downsample-wasi/tests/test_resample_to_reference.py new file mode 100644 index 000000000..ac505d279 --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample-wasi/tests/test_resample_to_reference.py @@ -0,0 +1,8 @@ +# Generated file. To retain edits, remove this comment. + +from itkwasm_downsample_wasi import resample_to_reference + +from .common import test_input_path, test_output_path + +def test_resample_to_reference(): + pass diff --git a/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/__init__.py b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/__init__.py index 07887db57..099e992e3 100644 --- a/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/__init__.py +++ b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/__init__.py @@ -14,5 +14,7 @@ from .gaussian_kernel_radius import gaussian_kernel_radius from .resample_bounding_box_async import resample_bounding_box_async from .resample_bounding_box import resample_bounding_box +from .resample_to_reference_async import resample_to_reference_async +from .resample_to_reference import resample_to_reference from ._version import __version__ diff --git a/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference.py b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference.py new file mode 100644 index 000000000..1d780dc23 --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference.py @@ -0,0 +1,41 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Image, + TransformList, +) + +def resample_to_reference( + input: Image, + reference_image: Image, + transform: Optional[TransformList] = None, + interpolator: str = "linear", + default_value: float = 0, +) -> Image: + """Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + + :param input: The moving image to resample. + :type input: Image + + :param reference_image: Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + :type reference_image: Image + + :param transform: Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. + :type transform: TransformList + + :param interpolator: Interpolation method used to sample the moving image. + :type interpolator: str + + :param default_value: Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. + :type default_value: float + + :return: The resampled output image. + :rtype: Image + """ + func = environment_dispatch("itkwasm_downsample", "resample_to_reference") + output = func(input, reference_image, transform=transform, interpolator=interpolator, default_value=default_value) + return output diff --git a/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference_async.py b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference_async.py new file mode 100644 index 000000000..3fb3f07a3 --- /dev/null +++ b/packages/downsample/python/itkwasm-downsample/itkwasm_downsample/resample_to_reference_async.py @@ -0,0 +1,41 @@ +# Generated file. Do not edit. + +import os +from typing import Dict, Tuple, Optional, List, Any + +from itkwasm import ( + environment_dispatch, + Image, + TransformList, +) + +async def resample_to_reference_async( + input: Image, + reference_image: Image, + transform: Optional[TransformList] = None, + interpolator: str = "linear", + default_value: float = 0, +) -> Image: + """Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + + :param input: The moving image to resample. + :type input: Image + + :param reference_image: Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + :type reference_image: Image + + :param transform: Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. + :type transform: TransformList + + :param interpolator: Interpolation method used to sample the moving image. + :type interpolator: str + + :param default_value: Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. + :type default_value: float + + :return: The resampled output image. + :rtype: Image + """ + func = environment_dispatch("itkwasm_downsample", "resample_to_reference_async") + output = await func(input, reference_image, transform=transform, interpolator=interpolator, default_value=default_value) + return output diff --git a/packages/downsample/python/itkwasm-downsample/pyproject.toml b/packages/downsample/python/itkwasm-downsample/pyproject.toml index d6a57f66c..595d98632 100644 --- a/packages/downsample/python/itkwasm-downsample/pyproject.toml +++ b/packages/downsample/python/itkwasm-downsample/pyproject.toml @@ -34,7 +34,7 @@ keywords = [ requires-python = ">=3.8" dependencies = [ - "itkwasm >= 1.0.b145", + "itkwasm >= 1.0.b185", "itkwasm-downsample-wasi; sys_platform != \"emscripten\"", "itkwasm-downsample-emscripten; sys_platform == \"emscripten\"", ] diff --git a/packages/downsample/resample-to-reference.cxx b/packages/downsample/resample-to-reference.cxx new file mode 100644 index 000000000..95cbe249c --- /dev/null +++ b/packages/downsample/resample-to-reference.cxx @@ -0,0 +1,364 @@ +/*========================================================================= + * + * 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 "itkPipeline.h" +#include "itkInputImage.h" +#include "itkOutputImage.h" +#include "itkSupportInputImageTypes.h" + +#include "itkImage.h" +#include "itkImageBase.h" +#include "itkVectorImage.h" +#include "itkVariableLengthVector.h" + +#include "itkResampleImageFilter.h" +#include "itkTransform.h" + +// Generic single-transform reader (any parameterization -> abstract itk::Transform base). +#include "resampleReadInputTransform.h" + +// Per-component extract/compose for the itk::VectorImage specialization. +#include "itkVectorIndexSelectionCastImageFilter.h" +#include "itkComposeImageFilter.h" + +#include "itkInterpolateImageFunction.h" +#include "itkLinearInterpolateImageFunction.h" +#include "itkNearestNeighborInterpolateImageFunction.h" +#include "itkBSplineInterpolateImageFunction.h" +#include "itkGaussianInterpolateImageFunction.h" +#include "itkWindowedSincInterpolateImageFunction.h" +#include "itkLabelImageGenericInterpolateImageFunction.h" + +#include +#include + +namespace +{ + +// Shared interpolator-selection helper. +// +// Returns the requested interpolator as the common base pointer +// itk::InterpolateImageFunction::Pointer, which feeds +// itk::ResampleImageFilter::SetInterpolator directly (the filter's +// InterpolatorType is InterpolateImageFunction). +// The caller constrains `interpolator` to one of the six names below via +// CLI::IsMember, so an unknown name should be unreachable. Rather than silently +// substituting a default, an unknown name throws: any future drift between the +// CLI option list and this helper then fails loudly instead of resampling with +// the wrong kernel. +template +typename itk::InterpolateImageFunction::Pointer +SelectInterpolator(const std::string & interpolator) +{ + using ImageType = TImage; + using InterpolatorBaseType = itk::InterpolateImageFunction; + + typename InterpolatorBaseType::Pointer selected; + if (interpolator == "linear") + { + selected = itk::LinearInterpolateImageFunction::New(); + } + else if (interpolator == "nearest_neighbor") + { + selected = itk::NearestNeighborInterpolateImageFunction::New(); + } + else if (interpolator == "label_image") + { + selected = itk::LabelImageGenericInterpolateImageFunction::New(); + } + else if (interpolator == "b_spline") + { + selected = itk::BSplineInterpolateImageFunction::New(); + } + else if (interpolator == "windowed_sinc") + { + // Radius 3, default Hamming window and ZeroFluxNeumann boundary condition. + selected = itk::WindowedSincInterpolateImageFunction::New(); + } + else if (interpolator == "gaussian") + { + selected = itk::GaussianInterpolateImageFunction::New(); + } + else + { + itkGenericExceptionMacro("Unknown interpolator '" << interpolator << "'."); + } + return selected; +} + +// Shared resample wiring used by both the scalar pipeline and each component of +// the vector pipeline, so the reference-geometry / transform / interpolator +// setup lives in exactly one place. +// +// Builds an itk::ResampleImageFilter that maps `movingImage` +// onto the reference image's geometry (origin, spacing, direction, size, start +// index) using the selected interpolator and, when provided, the optional +// transform (otherwise the filter's default identity transform is kept). Output +// samples that map outside the moving image are filled with `defaultPixelValue` +// (the background value), cast to the image's pixel type. The reference is taken +// as an itk::ImageBase pointer because the filter reads only its geometry -- this +// lets the vector path pass the moving VectorImage's own geometry to each +// single-component (itk::Image) resample. The filter is returned un-executed so +// the caller controls when it updates (the vector path defers to a single +// ComposeImageFilter update across all components). +template +typename itk::ResampleImageFilter::Pointer +MakeResampleFilter(const TImage * movingImage, + const itk::ImageBase * referenceGeometry, + const itk::Transform * transform, + const std::string & interpolator, + double defaultPixelValue) +{ + using ImageType = TImage; + using ResampleFilterType = itk::ResampleImageFilter; + + auto resampleFilter = ResampleFilterType::New(); + resampleFilter->SetInput(movingImage); + resampleFilter->SetReferenceImage(referenceGeometry); + resampleFilter->UseReferenceImageOn(); + resampleFilter->SetInterpolator(SelectInterpolator(interpolator)); + resampleFilter->SetDefaultPixelValue(static_cast(defaultPixelValue)); + + // Only override the filter's default identity transform when one was provided. + if (transform != nullptr) + { + resampleFilter->SetTransform(transform); + } + + return resampleFilter; +} + +// Groups the CLI options shared by the scalar and vector resample paths so both declare exactly one +// option surface -- identical names, order, type_names, help text, and interpolator constraint. The +// option-target members must outlive ITK_WASM_PARSE (CLI11 binds them by reference), so the caller owns +// this struct on its own stack and passes it to addResampleOptions() before parsing. +template +struct ResampleOptions +{ + itk::wasm::InputImage inputImage; + itk::wasm::InputImage referenceImage; + std::string transformArg; + std::string interpolator{ "linear" }; + double defaultPixelValue{ 0.0 }; + itk::wasm::OutputImage outputImage; +}; + +// Declares the shared resample option surface into `pipeline`, binding each option to the corresponding +// member of `options`. Kept in lockstep with the scalar and vector functors' post-parse reads below. +template +void +addResampleOptions(itk::wasm::Pipeline & pipeline, ResampleOptions & options) +{ + // The moving image. This is the image SupportInputImageTypes dispatches on, so it must be the first + // positional option added. + pipeline.add_option("input", options.inputImage, "The moving image to resample.") + ->required() + ->type_name("INPUT_IMAGE"); + + // The reference image whose geometry (origin, spacing, direction, size) defines the output grid. Only + // the metadata is read, so a metadata-only / empty pixel buffer is acceptable. + pipeline + .add_option("reference-image", + options.referenceImage, + "Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, " + "direction, size) is used; the pixel values are ignored.") + ->required() + ->type_name("INPUT_IMAGE"); + + // Optional transform mapping output-grid points into the moving-image space. Bound to a plain string + // (the memory-store index under --memory-io, or the filesystem path otherwise); readInputTransform() + // reconstructs any transform parameterization -- composing a multi-entry or composite list into an + // itk::CompositeTransform -- into the abstract itk::Transform base, which + // itk::ResampleImageFilter::SetTransform accepts polymorphically. + pipeline + .add_option("-t,--transform", + options.transformArg, + "Optional transform mapping output-grid points into the moving-image space. A multi-entry or " + "composite list is composed with itk::CompositeTransform semantics: the last entry is applied to " + "the point first. Defaults to identity.") + ->type_name("INPUT_TRANSFORM"); + + pipeline + .add_option("-i,--interpolator", options.interpolator, "Interpolation method used to sample the moving image.") + ->check(CLI::IsMember({ "linear", "nearest_neighbor", "label_image", "b_spline", "windowed_sinc", "gaussian" })); + + // Background value: output samples that map outside the moving image get this value (cast to the pixel + // type). Defaults to 0; e.g. -1024 (air) is the natural background for CT. + pipeline.add_option("-d,--default-value", + options.defaultPixelValue, + "Pixel value assigned to output samples that map outside the moving image (the background " + "value), cast to the output pixel type. Defaults to 0."); + + pipeline.add_option("output", options.outputImage, "The resampled output image.") + ->required() + ->type_name("OUTPUT_IMAGE"); +} + +} // namespace + +template +class PipelineFunctor +{ +public: + int + operator()(itk::wasm::Pipeline & pipeline) + { + using ImageType = TImage; + constexpr unsigned int ImageDimension = ImageType::ImageDimension; + + ResampleOptions options; + addResampleOptions(pipeline, options); + + ITK_WASM_PARSE(pipeline); + + typename ImageType::ConstPointer movingImage = options.inputImage.Get(); + typename ImageType::ConstPointer referenceGeometry = options.referenceImage.Get(); + + // Read the optional transform generically into the abstract itk::Transform base. + // Left null when unset, so MakeResampleFilter keeps the filter's identity transform. + using BaseTransformType = itk::Transform; + typename BaseTransformType::ConstPointer transform; + if (!options.transformArg.empty()) + { + ITK_WASM_CATCH_EXCEPTION(pipeline, transform = readInputTransform(options.transformArg)); + } + + // Shared reference-geometry / transform / interpolator / background-value wiring. + auto resampleFilter = MakeResampleFilter(movingImage.GetPointer(), + referenceGeometry.GetPointer(), + transform.GetPointer(), + options.interpolator, + options.defaultPixelValue); + + ITK_WASM_CATCH_EXCEPTION(pipeline, resampleFilter->UpdateLargestPossibleRegion()); + + typename ImageType::ConstPointer result = resampleFilter->GetOutput(); + options.outputImage.Set(result); + + return EXIT_SUCCESS; + } +}; + +// Specialization for itk::VectorImage (multi-component) pixel types. +// +// itk::ResampleImageFilter has no native multi-component path, so -- mirroring +// downsample.cxx -- each component is extracted to a scalar image, resampled +// independently through the shared MakeResampleFilter wiring, then recomposed. +// Every interpolator therefore works with vector pixels. +template +class PipelineFunctor> +{ +public: + int + operator()(itk::wasm::Pipeline & pipeline) + { + constexpr unsigned int Dimension = VDimension; + using PixelType = TPixel; + using VectorImageType = itk::VectorImage; + using ScalarImageType = itk::Image; + + // Same option surface as the scalar path -- the InputImage/OutputImage are just typed on the + // VectorImage -- so the bindings stay uniform across pixel types. + ResampleOptions options; + addResampleOptions(pipeline, options); + + ITK_WASM_PARSE(pipeline); + + typename VectorImageType::ConstPointer movingImage = options.inputImage.Get(); + typename VectorImageType::ConstPointer referenceGeometry = options.referenceImage.Get(); + + // Read the optional transform generically into the abstract itk::Transform base + // (null when unset -> each per-component filter keeps the identity transform). + using BaseTransformType = itk::Transform; + typename BaseTransformType::ConstPointer transform; + if (!options.transformArg.empty()) + { + ITK_WASM_CATCH_EXCEPTION(pipeline, transform = readInputTransform(options.transformArg)); + } + + const unsigned int numberOfComponents = movingImage->GetNumberOfComponentsPerPixel(); + + using ExtractFilterType = itk::VectorIndexSelectionCastImageFilter; + using ResampleFilterType = itk::ResampleImageFilter; + using ComposeFilterType = itk::ComposeImageFilter; + + auto composeFilter = ComposeFilterType::New(); + + // itk::DataObject holds only a WeakPointer back to its producing filter, so + // every per-component filter must stay alive until the single, final compose + // update below pulls the data through the whole pipeline. + std::vector extractFilters; + std::vector resampleFilters; + extractFilters.reserve(numberOfComponents); + resampleFilters.reserve(numberOfComponents); + + for (unsigned int component = 0; component < numberOfComponents; ++component) + { + auto extractFilter = ExtractFilterType::New(); + extractFilter->SetInput(movingImage); + extractFilter->SetIndex(component); + extractFilters.push_back(extractFilter); + + // Reuse the shared scalar wiring; the moving VectorImage's own geometry is + // a valid itk::ImageBase reference for each single-component output grid. + auto resampleFilter = MakeResampleFilter(extractFilter->GetOutput(), + referenceGeometry.GetPointer(), + transform.GetPointer(), + options.interpolator, + options.defaultPixelValue); + resampleFilters.push_back(resampleFilter); + + composeFilter->SetInput(component, resampleFilter->GetOutput()); + } + + ITK_WASM_CATCH_EXCEPTION(pipeline, composeFilter->UpdateLargestPossibleRegion()); + + typename VectorImageType::ConstPointer result = composeFilter->GetOutput(); + options.outputImage.Set(result); + + return EXIT_SUCCESS; + } +}; + +int +main(int argc, char * argv[]) +{ + itk::wasm::Pipeline pipeline( + "resample-to-reference", + "Resample an image onto a reference image's grid with an optional transform and a selectable interpolator.", + argc, + argv); + + return itk::wasm::SupportInputImageTypes, + itk::VariableLengthVector, + itk::VariableLengthVector, + itk::VariableLengthVector, + itk::VariableLengthVector>::Dimensions<2U, 3U, 4U>("input", + pipeline); +} diff --git a/packages/downsample/resampleReadInputTransform.h b/packages/downsample/resampleReadInputTransform.h index 10f7e3fe3..b80a29729 100644 --- a/packages/downsample/resampleReadInputTransform.h +++ b/packages/downsample/resampleReadInputTransform.h @@ -18,19 +18,34 @@ #ifndef resampleReadInputTransform_h #define resampleReadInputTransform_h -// Read a spatial transform input into the abstract itk::Transform base. +// Read a spatial transform input -- a single transform, a transform chain, or a composite transform -- +// into the abstract itk::Transform base. // -// itk-wasm's SupportInputTransformTypes dispatches the ABSTRACT base transform type so the bounding -// box math can call TransformPoint() polymorphically over any parameterization. itk::wasm::InputTransform -// cannot be used with that base (its reconstruction filter calls T::New(), which does not compile for the -// abstract base), so we reconstruct the concrete transform ourselves -- via the ITK object factory, exactly -// as itkWasmTransformToTransformFilter does for composite components -- and return it upcast to the base. +// itk::ResampleImageFilter::SetTransform() takes the abstract base, so the resample pipeline can apply any +// transform parameterization (translation, rigid, affine, B-spline, ...) polymorphically. itk::wasm:: +// InputTransform cannot read a generic transform: it hard-codes a concrete T (e.g. AffineTransform) and, on +// the in-memory path, copies the JSON's parameter array into that T after checking only precision and +// dimension -- never the parameterization. So a non-affine transform is silently mis-parameterized, and a +// transform with more parameters than the affine (e.g. a B-spline) overruns the fixed-size affine parameter +// buffer. We instead reconstruct each concrete transform ourselves -- via the ITK object factory, exactly as +// itkWasmTransformToTransformFilter does for composite components -- and return it upcast to the base. +// +// Multi-transform lists are composed into an itk::CompositeTransform. Following itkwasm's TransformList +// serialization convention, a Composite entry is a marker that carries no parameters of its own (the +// components follow it in the list), so Composite entries are skipped and every non-composite entry becomes a +// component. Composition follows itk::CompositeTransform semantics: components are added in list order +// [T0, T1, ..., TN-1] and the point is mapped by the queue in reverse, T0(T1(...TN-1(x))) -- i.e. the LAST +// list entry is applied to the point first, matching function-composition notation [A, B] == A o B and +// exactly matching what itkWasmTransformToTransformFilter produces for the same composite JSON. // // Two transport paths: // * --memory-io (TypeScript / Python bindings): the transform arrives in the wasm memory store; the CLI -// argument is its store index. We deserialize the TransformListJSON, build the concrete transform by +// argument is its store index. We deserialize the TransformListJSON, build each concrete transform by // name, and copy the parameter arrays (whose addresses the JSON encodes) out of the store. // * filesystem (native / WASI CTest): the argument is a real .iwt/.h5 path read with the transform reader. +// For a file holding a composite transform, ITK's reader returns the fully-populated CompositeTransform +// as the list front (its components repeat behind it), so the front is used directly; a multi-transform +// file without a composite wrapper is composed in list order as above. // // The math is always performed at double precision. This is lossless for float32 and float64 inputs and keeps // the filesystem path robust to itk-wasm's .iwt scalar-type detection, which can misreport a float64 transform @@ -41,6 +56,7 @@ #include #include +#include "itkCompositeTransform.h" #include "itkPipeline.h" #include "itkTransform.h" #include "itkTransformFileReader.h" @@ -60,6 +76,8 @@ namespace // Peek the input transform's dimension without fully reconstructing it, so the pipeline can dispatch to a // dimension-specialized functor. Reads from the wasm memory store under --memory-io, or the filesystem otherwise. +// (Used by resample-bounding-box, which dispatches on the transform dimension; resample-to-reference dispatches +// on the image and does not need it.) inline unsigned int readInputTransformDimension(const std::string & transformArg) { @@ -101,11 +119,84 @@ readInputTransformDimension(const std::string & transformArg) return transformList->front()->GetInputSpaceDimension(); } +#ifndef ITK_WASM_NO_MEMORY_IO +// Reconstruct one non-composite TransformListJSON entry into a concrete, double-precision transform, returned +// upcast to the abstract itk::Transform base. The concrete type is built by name via the ITK object factory; +// the parameter arrays are copied out of the wasm memory store at the addresses the JSON encodes, sized to the +// entry's own parameter counts. +template +typename itk::Transform::Pointer +reconstructTransformEntry(const itk::TransformJSON & transformJSON) +{ + using TransformType = itk::Transform; + + if (transformJSON.transformType.inputDimension != VDimension || + transformJSON.transformType.outputDimension != VDimension) + { + throw std::runtime_error("The input transform dimension does not match the pipeline dimension."); + } + + // Construct the concrete, double-precision transform by name via the ITK object factory. The factory is + // populated as a side effect of GetFactory(). We always build the double variant so the math stays at + // double precision regardless of the input's stored precision. + const std::string typeString = itk::transformParameterizationString(transformJSON.transformType) + + "Transform_double_" + std::to_string(VDimension) + "_" + std::to_string(VDimension); + itk::TransformFactoryBase::GetFactory(); + itk::LightObject::Pointer instance = itk::ObjectFactoryBase::CreateInstance(typeString.c_str()); + typename TransformType::Pointer transform = dynamic_cast(instance.GetPointer()); + if (transform.IsNull()) + { + throw std::runtime_error("Could not construct the input transform type: " + typeString); + } + instance->UnRegister(); // correct the extra reference from CreateInstance() + + // The JSON encodes the parameter arrays as wasm memory addresses: "data:application/vnd.itk.address,0:". + constexpr std::string::size_type addressPrefixLength = 35; + + // Fixed parameters are stored at double precision (itk::Transform::FixedParametersValueType is double). + if (transformJSON.numberOfFixedParameters > 0) + { + const double * fixedParametersPtr = reinterpret_cast( + std::strtoull(transformJSON.fixedParameters.substr(addressPrefixLength).c_str(), nullptr, 10)); + transform->CopyInFixedParameters(fixedParametersPtr, fixedParametersPtr + transformJSON.numberOfFixedParameters); + } + + // Parameters are stored at the transform's own precision; cast into a double buffer so the double-precision + // transform receives them losslessly whether the source is float32 or float64. + const std::size_t numberOfParameters = static_cast(transformJSON.numberOfParameters); + if (numberOfParameters > 0) + { + std::vector parameters(numberOfParameters); + const std::string parametersAddress = transformJSON.parameters.substr(addressPrefixLength); + if (transformJSON.transformType.parametersValueType == itk::JSONFloatTypesEnum::float32) + { + const float * source = reinterpret_cast(std::strtoull(parametersAddress.c_str(), nullptr, 10)); + for (std::size_t ii = 0; ii < numberOfParameters; ++ii) + { + parameters[ii] = static_cast(source[ii]); + } + } + else + { + const double * source = reinterpret_cast(std::strtoull(parametersAddress.c_str(), nullptr, 10)); + for (std::size_t ii = 0; ii < numberOfParameters; ++ii) + { + parameters[ii] = source[ii]; + } + } + transform->CopyInParameters(parameters.data(), parameters.data() + numberOfParameters); + } + + return transform; +} +#endif // !ITK_WASM_NO_MEMORY_IO + template typename itk::Transform::ConstPointer readInputTransform(const std::string & transformArg) { using TransformType = itk::Transform; + using CompositeTransformType = itk::CompositeTransform; if (transformArg.empty()) { @@ -129,68 +220,36 @@ readInputTransform(const std::string & transformArg) { throw std::runtime_error("The input transform list is empty."); } - const itk::TransformJSON & transformJSON = transformListJSON.front(); - if (transformListJSON.size() != 1 || - transformJSON.transformType.transformParameterization == itk::JSONTransformParameterizationEnum::Composite) + + // Composite entries are markers with no parameters of their own -- their components follow in the list -- + // so skip them and reconstruct every non-composite entry as a component (mirroring + // itkWasmTransformToTransformFilter). + std::vector components; + for (const auto & transformJSON : transformListJSON) { - throw std::runtime_error( - "Only a single, non-composite transform is currently supported through the in-memory interface."); + if (transformJSON.transformType.transformParameterization == itk::JSONTransformParameterizationEnum::Composite) + { + continue; + } + components.push_back(reconstructTransformEntry(transformJSON)); } - if (transformJSON.transformType.inputDimension != VDimension || - transformJSON.transformType.outputDimension != VDimension) + if (components.empty()) { - throw std::runtime_error("The input transform dimension does not match the pipeline dimension."); + throw std::runtime_error("The composite transform list contains no component transforms."); } - - // Construct the concrete, double-precision transform by name via the ITK object factory. The factory is - // populated as a side effect of GetFactory(). We always build the double variant so the math stays at - // double precision regardless of the input's stored precision. - const std::string typeString = itk::transformParameterizationString(transformJSON.transformType) + - "Transform_double_" + std::to_string(VDimension) + "_" + std::to_string(VDimension); - itk::TransformFactoryBase::GetFactory(); - itk::LightObject::Pointer instance = itk::ObjectFactoryBase::CreateInstance(typeString.c_str()); - typename TransformType::Pointer transform = dynamic_cast(instance.GetPointer()); - if (transform.IsNull()) + if (components.size() == 1) { - throw std::runtime_error("Could not construct the input transform type: " + typeString); + return components.front().GetPointer(); } - instance->UnRegister(); // correct the extra reference from CreateInstance() - - // The JSON encodes the parameter arrays as wasm memory addresses: "data:application/vnd.itk.address,0:". - constexpr std::string::size_type addressPrefixLength = 35; - // Fixed parameters are stored at double precision (itk::Transform::FixedParametersValueType is double). - if (transformJSON.numberOfFixedParameters > 0) + // Compose in list order; itk::CompositeTransform applies the queue in reverse, so the mapping is + // T0(T1(...TN-1(x))). + auto compositeTransform = CompositeTransformType::New(); + for (const auto & component : components) { - const double * fixedParametersPtr = reinterpret_cast( - std::strtoull(transformJSON.fixedParameters.substr(addressPrefixLength).c_str(), nullptr, 10)); - transform->CopyInFixedParameters(fixedParametersPtr, fixedParametersPtr + transformJSON.numberOfFixedParameters); + compositeTransform->AddTransform(component); } - - // Parameters are stored at the transform's own precision; cast into a double buffer so the double-precision - // transform receives them losslessly whether the source is float32 or float64. - const std::size_t numberOfParameters = static_cast(transformJSON.numberOfParameters); - std::vector parameters(numberOfParameters); - const std::string parametersAddress = transformJSON.parameters.substr(addressPrefixLength); - if (transformJSON.transformType.parametersValueType == itk::JSONFloatTypesEnum::float32) - { - const float * source = reinterpret_cast(std::strtoull(parametersAddress.c_str(), nullptr, 10)); - for (std::size_t ii = 0; ii < numberOfParameters; ++ii) - { - parameters[ii] = static_cast(source[ii]); - } - } - else - { - const double * source = reinterpret_cast(std::strtoull(parametersAddress.c_str(), nullptr, 10)); - for (std::size_t ii = 0; ii < numberOfParameters; ++ii) - { - parameters[ii] = source[ii]; - } - } - transform->CopyInParameters(parameters.data(), parameters.data() + numberOfParameters); - - return transform.GetPointer(); + return compositeTransform.GetPointer(); #else throw std::runtime_error("Memory IO support was not compiled into this pipeline."); #endif @@ -206,12 +265,39 @@ readInputTransform(const std::string & transformArg) { throw std::runtime_error("No transform found in the input transform file."); } - typename TransformType::ConstPointer transform = dynamic_cast(transformList->front().GetPointer()); - if (transform.IsNull()) + + // A file holding a composite transform is returned by ITK's reader as the fully-populated + // CompositeTransform at the list front, with its components repeated behind it -- use the front directly. + const auto * frontComposite = dynamic_cast(transformList->front().GetPointer()); + if (frontComposite != nullptr) { - throw std::runtime_error("The input transform dimension or scalar type is not supported."); + return frontComposite; } - return transform; + + if (transformList->size() == 1) + { + typename TransformType::ConstPointer transform = + dynamic_cast(transformList->front().GetPointer()); + if (transform.IsNull()) + { + throw std::runtime_error("The input transform dimension or scalar type is not supported."); + } + return transform; + } + + // Multiple independent transforms without a composite wrapper: compose them in list order, matching the + // in-memory chain semantics above. + auto compositeTransform = CompositeTransformType::New(); + for (const auto & entry : *transformList) + { + auto * component = dynamic_cast(entry.GetPointer()); + if (component == nullptr) + { + throw std::runtime_error("The input transform dimension or scalar type is not supported."); + } + compositeTransform->AddTransform(component); + } + return compositeTransform.GetPointer(); } } // namespace diff --git a/packages/downsample/typescript/README.md b/packages/downsample/typescript/README.md index 0bb6e131e..9dec42e76 100644 --- a/packages/downsample/typescript/README.md +++ b/packages/downsample/typescript/README.md @@ -185,6 +185,40 @@ async function gaussianKernelRadius( | `radius` | *JsonCompatible* | Output kernel radius. | | `webWorker` | *Worker* | WebWorker used for computation. | +#### resampleToReference + +*Resample an image onto a reference image's grid with an optional transform and a selectable interpolator.* + +```ts +async function resampleToReference( + input: Image, + referenceImage: Image, + options: ResampleToReferenceOptions = {} +) : Promise +``` + +| Parameter | Type | Description | +| :--------------: | :-----: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | +| `input` | *Image* | The moving image to resample. | +| `referenceImage` | *Image* | Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. | + +**`ResampleToReferenceOptions` interface:** + +| Property | Type | Description | +| :------------: | :-------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `transform` | *TransformList* | Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. | +| `interpolator` | *string* | Interpolation method used to sample the moving image. | +| `defaultValue` | *number* | Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. | +| `webWorker` | *null or Worker or boolean* | WebWorker for computation. Set to null to create a new worker. Or, pass an existing worker. Or, set to `false` to run in the current thread / worker. | +| `noCopy` | *boolean* | When SharedArrayBuffer's are not available, do not copy inputs. | + +**`ResampleToReferenceResult` interface:** + +| Property | Type | Description | +| :---------: | :------: | :------------------------------ | +| `output` | *Image* | The resampled output image. | +| `webWorker` | *Worker* | WebWorker used for computation. | + #### setPipelinesBaseUrl *Set base URL for WebAssembly assets when vendored.* @@ -354,3 +388,34 @@ async function gaussianKernelRadiusNode( | Property | Type | Description | | :------: | :--------------: | :-------------------- | | `radius` | *JsonCompatible* | Output kernel radius. | + +#### resampleToReferenceNode + +*Resample an image onto a reference image's grid with an optional transform and a selectable interpolator.* + +```ts +async function resampleToReferenceNode( + input: Image, + referenceImage: Image, + options: ResampleToReferenceNodeOptions = {} +) : Promise +``` + +| Parameter | Type | Description | +| :--------------: | :-----: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | +| `input` | *Image* | The moving image to resample. | +| `referenceImage` | *Image* | Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. | + +**`ResampleToReferenceNodeOptions` interface:** + +| Property | Type | Description | +| :------------: | :-------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `transform` | *TransformList* | Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. | +| `interpolator` | *string* | Interpolation method used to sample the moving image. | +| `defaultValue` | *number* | Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. | + +**`ResampleToReferenceNodeResult` interface:** + +| Property | Type | Description | +| :------: | :-----: | :-------------------------- | +| `output` | *Image* | The resampled output image. | diff --git a/packages/downsample/typescript/src/index-node-only.ts b/packages/downsample/typescript/src/index-node-only.ts index df9b02d8b..eee0045e4 100644 --- a/packages/downsample/typescript/src/index-node-only.ts +++ b/packages/downsample/typescript/src/index-node-only.ts @@ -60,3 +60,13 @@ export type { ResampleBoundingBoxNodeOptions } import resampleBoundingBoxNode from './resample-bounding-box-node.js' export { resampleBoundingBoxNode } + + +import ResampleToReferenceNodeResult from './resample-to-reference-node-result.js' +export type { ResampleToReferenceNodeResult } + +import ResampleToReferenceNodeOptions from './resample-to-reference-node-options.js' +export type { ResampleToReferenceNodeOptions } + +import resampleToReferenceNode from './resample-to-reference-node.js' +export { resampleToReferenceNode } diff --git a/packages/downsample/typescript/src/index-only.ts b/packages/downsample/typescript/src/index-only.ts index 618747498..6fd0003d8 100644 --- a/packages/downsample/typescript/src/index-only.ts +++ b/packages/downsample/typescript/src/index-only.ts @@ -63,3 +63,13 @@ export type { ResampleBoundingBoxOptions } import resampleBoundingBox from './resample-bounding-box.js' export { resampleBoundingBox } + + +import ResampleToReferenceResult from './resample-to-reference-result.js' +export type { ResampleToReferenceResult } + +import ResampleToReferenceOptions from './resample-to-reference-options.js' +export type { ResampleToReferenceOptions } + +import resampleToReference from './resample-to-reference.js' +export { resampleToReference } diff --git a/packages/downsample/typescript/src/resample-to-reference-node-options.ts b/packages/downsample/typescript/src/resample-to-reference-node-options.ts new file mode 100644 index 000000000..d831a43f7 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference-node-options.ts @@ -0,0 +1,17 @@ +// Generated file. To retain edits, remove this comment. + +import { TransformList } from 'itk-wasm' + +interface ResampleToReferenceNodeOptions { + /** Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. */ + transform?: TransformList + + /** Interpolation method used to sample the moving image. */ + interpolator?: string + + /** Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. */ + defaultValue?: number + +} + +export default ResampleToReferenceNodeOptions diff --git a/packages/downsample/typescript/src/resample-to-reference-node-result.ts b/packages/downsample/typescript/src/resample-to-reference-node-result.ts new file mode 100644 index 000000000..1e9bafa18 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference-node-result.ts @@ -0,0 +1,11 @@ +// Generated file. To retain edits, remove this comment. + +import { Image } from 'itk-wasm' + +interface ResampleToReferenceNodeResult { + /** The resampled output image. */ + output: Image + +} + +export default ResampleToReferenceNodeResult diff --git a/packages/downsample/typescript/src/resample-to-reference-node.ts b/packages/downsample/typescript/src/resample-to-reference-node.ts new file mode 100644 index 000000000..f56096ac4 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference-node.ts @@ -0,0 +1,91 @@ +// Generated file. To retain edits, remove this comment. + +import { + Image, + TransformList, + InterfaceTypes, + PipelineOutput, + PipelineInput, + runPipelineNode +} from 'itk-wasm' + +import ResampleToReferenceNodeOptions from './resample-to-reference-node-options.js' +import ResampleToReferenceNodeResult from './resample-to-reference-node-result.js' + +import path from 'path' +import { fileURLToPath } from 'url' + +/** + * Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + * + * @param {Image} input - The moving image to resample. + * @param {Image} referenceImage - Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + * @param {ResampleToReferenceNodeOptions} options - options object + * + * @returns {Promise} - result object + */ +async function resampleToReferenceNode( + input: Image, + referenceImage: Image, + options: ResampleToReferenceNodeOptions = {} +) : Promise { + + const desiredOutputs: Array = [ + { type: InterfaceTypes.Image }, + ] + + const inputs: Array = [ + { type: InterfaceTypes.Image, data: input }, + { type: InterfaceTypes.Image, data: referenceImage }, + ] + + const args = [] + // Inputs + const inputName = '0' + args.push(inputName) + + const referenceImageName = '1' + args.push(referenceImageName) + + // Outputs + const outputName = '0' + args.push(outputName) + + // Options + args.push('--memory-io') + if (typeof options.transform !== "undefined") { + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.TransformList, data: options.transform as TransformList }) + args.push('--transform', inputCountString) + + } + if (typeof options.interpolator !== "undefined") { + if (!['linear', 'nearest_neighbor', 'label_image', 'b_spline', 'windowed_sinc', 'gaussian'].includes(options.interpolator)) { + throw new Error('"interpolator" option must be one of linear, nearest_neighbor, label_image, b_spline, windowed_sinc, gaussian') + } + args.push('--interpolator', options.interpolator.toString()) + + } + if (typeof options.defaultValue !== "undefined") { + args.push('--default-value', options.defaultValue.toString()) + + } + + const pipelinePath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'pipelines', 'resample-to-reference') + + const { + returnValue, + stderr, + outputs + } = await runPipelineNode(pipelinePath, args, desiredOutputs, inputs) + if (returnValue !== 0 && stderr !== "") { + throw new Error(stderr) + } + + const result = { + output: outputs[0]?.data as Image, + } + return result +} + +export default resampleToReferenceNode diff --git a/packages/downsample/typescript/src/resample-to-reference-options.ts b/packages/downsample/typescript/src/resample-to-reference-options.ts new file mode 100644 index 000000000..52bca7b68 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference-options.ts @@ -0,0 +1,17 @@ +// Generated file. To retain edits, remove this comment. + +import { TransformList, WorkerPoolFunctionOption } from 'itk-wasm' + +interface ResampleToReferenceOptions extends WorkerPoolFunctionOption { + /** Optional transform mapping output-grid points into the moving-image space. A multi-entry or composite list is composed with itk::CompositeTransform semantics: the last entry is applied to the point first. Defaults to identity. */ + transform?: TransformList + + /** Interpolation method used to sample the moving image. */ + interpolator?: string + + /** Pixel value assigned to output samples that map outside the moving image (the background value), cast to the output pixel type. Defaults to 0. */ + defaultValue?: number + +} + +export default ResampleToReferenceOptions diff --git a/packages/downsample/typescript/src/resample-to-reference-result.ts b/packages/downsample/typescript/src/resample-to-reference-result.ts new file mode 100644 index 000000000..9a4314bb7 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference-result.ts @@ -0,0 +1,11 @@ +// Generated file. To retain edits, remove this comment. + +import { Image, WorkerPoolFunctionResult } from 'itk-wasm' + +interface ResampleToReferenceResult extends WorkerPoolFunctionResult { + /** The resampled output image. */ + output: Image + +} + +export default ResampleToReferenceResult diff --git a/packages/downsample/typescript/src/resample-to-reference.ts b/packages/downsample/typescript/src/resample-to-reference.ts new file mode 100644 index 000000000..08d0e0970 --- /dev/null +++ b/packages/downsample/typescript/src/resample-to-reference.ts @@ -0,0 +1,99 @@ +// Generated file. To retain edits, remove this comment. + +import { + Image, + TransformList, + InterfaceTypes, + PipelineOutput, + PipelineInput, + runPipeline +} from 'itk-wasm' + +import ResampleToReferenceOptions from './resample-to-reference-options.js' +import ResampleToReferenceResult from './resample-to-reference-result.js' + +import { getPipelinesBaseUrl } from './pipelines-base-url.js' +import { getPipelineWorkerUrl } from './pipeline-worker-url.js' + +import { getDefaultWebWorker } from './default-web-worker.js' + +/** + * Resample an image onto a reference image's grid with an optional transform and a selectable interpolator. + * + * @param {Image} input - The moving image to resample. + * @param {Image} referenceImage - Reference image whose geometry defines the output grid. Only the geometry (origin, spacing, direction, size) is used; the pixel values are ignored. + * @param {ResampleToReferenceOptions} options - options object + * + * @returns {Promise} - result object + */ +async function resampleToReference( + input: Image, + referenceImage: Image, + options: ResampleToReferenceOptions = {} +) : Promise { + + const desiredOutputs: Array = [ + { type: InterfaceTypes.Image }, + ] + + const inputs: Array = [ + { type: InterfaceTypes.Image, data: input }, + { type: InterfaceTypes.Image, data: referenceImage }, + ] + + const args = [] + // Inputs + const inputName = '0' + args.push(inputName) + + const referenceImageName = '1' + args.push(referenceImageName) + + // Outputs + const outputName = '0' + args.push(outputName) + + // Options + args.push('--memory-io') + if (typeof options.transform !== "undefined") { + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.TransformList, data: options.transform as TransformList }) + args.push('--transform', inputCountString) + + } + if (typeof options.interpolator !== "undefined") { + if (!['linear', 'nearest_neighbor', 'label_image', 'b_spline', 'windowed_sinc', 'gaussian'].includes(options.interpolator)) { + throw new Error('"interpolator" option must be one of linear, nearest_neighbor, label_image, b_spline, windowed_sinc, gaussian') + } + args.push('--interpolator', options.interpolator.toString()) + + } + if (typeof options.defaultValue !== "undefined") { + args.push('--default-value', options.defaultValue.toString()) + + } + + const pipelinePath = 'resample-to-reference' + + 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, + output: outputs[0]?.data as Image, + } + return result +} + +export default resampleToReference diff --git a/packages/downsample/typescript/test/browser/demo-app/index.html b/packages/downsample/typescript/test/browser/demo-app/index.html index 3a5e99352..1b0abdb70 100644 --- a/packages/downsample/typescript/test/browser/demo-app/index.html +++ b/packages/downsample/typescript/test/browser/demo-app/index.html @@ -36,6 +36,7 @@

👨‍💻 Live API Demo ✨

downsample gaussianKernelRadius resampleBoundingBox + resampleToReference @@ -275,6 +276,62 @@

👨‍💻 Live API Demo ✨

+ + + Resample an image onto a reference image's grid with an optional transform and a selectable interpolator.

+ +
+ + +

+ + +

+ + +

+ + +
+ +
Load sample inputs + Run

+ +
+ + +
+ + + bmp + dcm + gipl + hdf5 + jpg + lsm + mnc + mnc.gz + mgh + mha + mrc + nii + nii.gz + png + nrrd + png + pic + tif + isq + fdf + vtk + + Download +

+
+ +
+ + diff --git a/packages/downsample/typescript/test/browser/demo-app/index.ts b/packages/downsample/typescript/test/browser/demo-app/index.ts index 39b04c5ce..11587ad0f 100644 --- a/packages/downsample/typescript/test/browser/demo-app/index.ts +++ b/packages/downsample/typescript/test/browser/demo-app/index.ts @@ -23,4 +23,5 @@ import './downsample-sigma-controller.js' import './downsample-controller.js' import './gaussian-kernel-radius-controller.js' import './resample-bounding-box-controller.js' +import './resample-to-reference-controller.js' diff --git a/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-controller.ts b/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-controller.ts new file mode 100644 index 000000000..960e4d2a5 --- /dev/null +++ b/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-controller.ts @@ -0,0 +1,189 @@ +// Generated file. To retain edits, remove this comment. + +import { readImage } from '@itk-wasm/image-io' +import { readTransform } from '@itk-wasm/transform-io' +import { writeImage } from '@itk-wasm/image-io' +import * as downsample from '../../../dist/index.js' +import resampleToReferenceLoadSampleInputs, { usePreRun } from "./resample-to-reference-load-sample-inputs.js" + +class ResampleToReferenceModel { + inputs: Map + options: Map + outputs: Map + + constructor() { + this.inputs = new Map() + this.options = new Map() + this.outputs = new Map() + } +} + + +class ResampleToReferenceController { + + constructor(loadSampleInputs) { + this.loadSampleInputs = loadSampleInputs + + this.model = new ResampleToReferenceModel() + const model = this.model + + if (loadSampleInputs) { + const loadSampleInputsButton = document.querySelector("#resampleToReferenceInputs [name=loadSampleInputs]") + loadSampleInputsButton.setAttribute('style', 'display: block-inline;') + loadSampleInputsButton.addEventListener('click', async (event) => { + loadSampleInputsButton.loading = true + await loadSampleInputs(model) + loadSampleInputsButton.loading = false + }) + } + + // ---------------------------------------------- + // Inputs + const inputElement = document.querySelector('#resampleToReferenceInputs input[name=input-file]') + inputElement.addEventListener('change', async (event) => { + const dataTransfer = event.dataTransfer + const files = event.target.files || dataTransfer.files + + const { image, webWorker } = await readImage(files[0]) + webWorker.terminate() + model.inputs.set("input", image) + const details = document.getElementById("resampleToReference-input-details") + details.setImage(image) + details.disabled = false + }) + + const referenceImageElement = document.querySelector('#resampleToReferenceInputs input[name=reference-image-file]') + referenceImageElement.addEventListener('change', async (event) => { + const dataTransfer = event.dataTransfer + const files = event.target.files || dataTransfer.files + + const { image, webWorker } = await readImage(files[0]) + webWorker.terminate() + model.inputs.set("referenceImage", image) + const details = document.getElementById("resampleToReference-reference-image-details") + details.setImage(image) + details.disabled = false + }) + + // ---------------------------------------------- + // Options + const transformElement = document.querySelector('#resampleToReferenceInputs input[name=transform-file]') + transformElement.addEventListener('change', async (event) => { + const dataTransfer = event.dataTransfer + const files = event.target.files || dataTransfer.files + + const { transform, webWorker } = await readTransform(files[0]) + webWorker.terminate() + model.options.set("transform", transform) + const details = document.getElementById("resampleToReference-transform-details") + details.innerHTML = `
${globalThis.escapeHtml(JSON.stringify(transform, globalThis.interfaceTypeJsonReplacer, 2))}
` + details.disabled = false + }) + + const interpolatorElement = document.querySelector('#resampleToReferenceInputs sl-input[name=interpolator]') + interpolatorElement.addEventListener('sl-change', (event) => { + model.options.set("interpolator", interpolatorElement.value) + }) + + const defaultValueElement = document.querySelector('#resampleToReferenceInputs sl-input[name=default-value]') + defaultValueElement.addEventListener('sl-change', (event) => { + model.options.set("defaultValue", parseFloat(defaultValueElement.value)) + }) + + // ---------------------------------------------- + // Outputs + const outputOutputDownload = document.querySelector('#resampleToReferenceOutputs sl-button[name=output-download]') + outputOutputDownload.addEventListener('click', async (event) => { + event.preventDefault() + event.stopPropagation() + if (model.outputs.has("output")) { + const outputDownloadFormat = document.getElementById('resampleToReference-output-output-format') + const downloadFormat = outputDownloadFormat.value || 'nrrd' + const fileName = `output.${downloadFormat}` + const { webWorker, serializedImage } = await writeImage(model.outputs.get("output"), fileName) + + webWorker.terminate() + globalThis.downloadFile(serializedImage.data, fileName) + } + }) + + const preRun = async () => { + if (loadSampleInputs && usePreRun) { + await loadSampleInputs(model, true) + await this.run() + } + } + + const onSelectTab = async (event) => { + if (event.detail.name === 'resampleToReference-panel') { + const params = new URLSearchParams(window.location.search) + if (!params.has('functionName') || params.get('functionName') !== 'resampleToReference') { + params.set('functionName', 'resampleToReference') + const url = new URL(document.location) + url.search = params + window.history.replaceState({ functionName: 'resampleToReference' }, '', url) + await preRun() + } + } + } + + const tabGroup = document.querySelector('sl-tab-group') + tabGroup.addEventListener('sl-tab-show', onSelectTab) + function onInit() { + const params = new URLSearchParams(window.location.search) + if (params.has('functionName') && params.get('functionName') === 'resampleToReference') { + tabGroup.show('resampleToReference-panel') + preRun() + } + } + onInit() + + const runButton = document.querySelector('#resampleToReferenceInputs sl-button[name="run"]') + runButton.addEventListener('click', async (event) => { + event.preventDefault() + + if(!model.inputs.has('input')) { + globalThis.notify("Required input not provided", "input", "danger", "exclamation-octagon") + return + } + if(!model.inputs.has('referenceImage')) { + globalThis.notify("Required input not provided", "referenceImage", "danger", "exclamation-octagon") + return + } + + + try { + runButton.loading = true + + const t0 = performance.now() + const { output, } = await this.run() + const t1 = performance.now() + globalThis.notify("resampleToReference successfully completed", `in ${t1 - t0} milliseconds.`, "success", "rocket-fill") + + model.outputs.set("output", output) + outputOutputDownload.variant = "success" + outputOutputDownload.disabled = false + const outputDetails = document.getElementById("resampleToReference-output-details") + outputDetails.disabled = false + outputDetails.setImage(output) + } catch (error) { + globalThis.notify("Error while running pipeline", error.toString(), "danger", "exclamation-octagon") + throw error + } finally { + runButton.loading = false + } + }) + } + + async run() { + const options = Object.fromEntries(this.model.options.entries()) + const { output, } = await downsample.resampleToReference( this.model.inputs.get('input'), + this.model.inputs.get('referenceImage'), + Object.fromEntries(this.model.options.entries()) + ) + + return { output, } + } +} + +const resampleToReferenceController = new ResampleToReferenceController(resampleToReferenceLoadSampleInputs) diff --git a/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-load-sample-inputs.ts b/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-load-sample-inputs.ts new file mode 100644 index 000000000..62b6fdea9 --- /dev/null +++ b/packages/downsample/typescript/test/browser/demo-app/resample-to-reference-load-sample-inputs.ts @@ -0,0 +1,51 @@ +export default async function resampleToReferenceLoadSampleInputs(model, preRun = false) { + const resampleToReferenceButton = document.querySelector( + "#resampleToReferenceInputs sl-button[name=input-file-button]", + ); + if (!preRun) { + resampleToReferenceButton.loading = true; + } + + const fileName = "cthead1.png"; + const response = await fetch( + `https://bafybeih4fck4ndvsvgo6774xy5w7ip3bzcvh7x7e527m4yvazgrxdzayua.ipfs.w3s.link/ipfs/bafybeih4fck4ndvsvgo6774xy5w7ip3bzcvh7x7e527m4yvazgrxdzayua/input/${fileName}`, + ); + const data = new Uint8Array(await response.arrayBuffer()); + const inputFile = { data, path: fileName }; + const { image } = await globalThis.readImage(inputFile); + + // Sample: resample cthead1 onto its own grid (identity transform, linear + // interpolation). The moving image doubles as the reference image, so the + // sample is self-contained from the single published input and produces an + // output essentially equal to the input. The transform is optional and left + // unset (defaults to identity); upload one via the demo to exercise that path. + model.inputs.set("input", image); + model.inputs.set("referenceImage", image); + model.options.set("interpolator", "linear"); + + if (!preRun) { + const inputDetails = document.getElementById("resampleToReference-input-details"); + inputDetails.setImage(image); + inputDetails.disabled = false; + + const referenceDetails = document.getElementById( + "resampleToReference-reference-image-details", + ); + referenceDetails.setImage(image); + referenceDetails.disabled = false; + + const interpolatorElement = document.querySelector( + "#resampleToReferenceInputs sl-input[name=interpolator]", + ); + interpolatorElement.value = model.options.get("interpolator"); + + resampleToReferenceButton.loading = false; + } + + return model; +} + +// Use this function to run the pipeline when this tab group is select. +// This will load the web worker if it is not already loaded, download the wasm module, and allocate memory in the wasm model. +// Set this to `false` if sample inputs are very large or sample pipeline computation is long. +export const usePreRun = true; diff --git a/packages/downsample/typescript/test/browser/resample-to-reference.spec.ts b/packages/downsample/typescript/test/browser/resample-to-reference.spec.ts new file mode 100644 index 000000000..ab1963b03 --- /dev/null +++ b/packages/downsample/typescript/test/browser/resample-to-reference.spec.ts @@ -0,0 +1,55 @@ +import { test, expect } from "@playwright/test"; +import { readFileSync } from "fs"; + +test("resampleToReference", async ({ page }) => { + await page.goto("/"); + + const testFile = readFileSync("../test/data/input/cthead1.png"); + + // Navigate to resample tab + await page.click('sl-tab[panel="resampleToReference-panel"]'); + + // Upload the moving image + await page.setInputFiles('#resampleToReferenceInputs input[name="input-file"]', { + name: "cthead1.png", + mimeType: "image/png", + buffer: testFile, + }); + + // Wait for moving-image details to appear + await expect(page.locator("#resampleToReference-input-details")).toContainText( + "imageType" + ); + + // Upload the reference image (reuse cthead1 so the output grid matches the + // moving image -- an identity resample that is self-contained from a single + // input, mirroring the sample-inputs loader). + await page.setInputFiles( + '#resampleToReferenceInputs input[name="reference-image-file"]', + { + name: "cthead1.png", + mimeType: "image/png", + buffer: testFile, + } + ); + + // Wait for reference-image details to appear + await expect( + page.locator("#resampleToReference-reference-image-details") + ).toContainText("imageType"); + + // Select the interpolator + const interpolatorInput = page.locator( + '#resampleToReferenceInputs sl-input[name="interpolator"] input' + ); + await interpolatorInput.clear(); + await interpolatorInput.fill("linear"); + + // Run the pipeline + await page.click('#resampleToReferenceInputs sl-button[name="run"]'); + + // Wait for results + await expect(page.locator("#resampleToReference-output-details")).toContainText( + "imageType" + ); +}); diff --git a/packages/downsample/typescript/test/node/resample-to-reference-test.js b/packages/downsample/typescript/test/node/resample-to-reference-test.js new file mode 100644 index 000000000..dae61c9df --- /dev/null +++ b/packages/downsample/typescript/test/node/resample-to-reference-test.js @@ -0,0 +1,220 @@ +import test from 'ava' +import path from 'path' + +import { readImageNode } from '@itk-wasm/image-io' +import { readTransformNode } from '@itk-wasm/transform-io' +import { compareImagesNode } from '@itk-wasm/compare-images' +import { + PixelTypes, + Transform, + TransformType, + TransformParameterizations, + FloatTypes +} from 'itk-wasm' + +import { resampleToReferenceNode } from '../../dist/index-node.js' +import { testInputPath, testBaselinePath } from './common.js' + +// A single-entry TransformList holding a float64 TranslationTransform (dimension inferred from the offset). +// A Translation is a distinct parameterization from Affine, with only `dimension` parameters (the offset) and +// no fixed parameters -- the pipeline reconstructs it generically rather than forcing it into an affine. +function translationTransform (offset) { + const dimension = offset.length + const transformType = new TransformType(TransformParameterizations.Translation, FloatTypes.Float64, dimension, dimension) + const transform = new Transform(transformType) + transform.name = 'TranslationTransform' + transform.numberOfFixedParameters = 0 + transform.numberOfParameters = dimension + transform.fixedParameters = Float64Array.from([]) + transform.parameters = Float64Array.from(offset) + return [transform] +} + +// A single-entry TransformList holding a float64 AffineTransform. ITK's MatrixOffsetTransformBase packs its +// parameters as the row-major matrix followed by the translation, and its fixed parameters as the center of +// rotation -- so parameters = [...matrixRowMajor, ...translation], fixedParameters = center. +function affineTransform (matrixRowMajor, translation, center) { + const dimension = translation.length + const transformType = new TransformType(TransformParameterizations.Affine, FloatTypes.Float64, dimension, dimension) + const transform = new Transform(transformType) + transform.name = 'AffineTransform' + transform.numberOfFixedParameters = center.length + transform.numberOfParameters = matrixRowMajor.length + translation.length + transform.fixedParameters = Float64Array.from(center) + transform.parameters = Float64Array.from([...matrixRowMajor, ...translation]) + return [transform] +} + +test('Test resampleToReferenceNode linear with transform', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const referenceFilePath = path.join(testInputPath, 'cthead1-resample-reference.nrrd') + const transformFilePath = path.join(testInputPath, 'cthead1-resample-transform.h5') + const baselineFilePath = path.join(testBaselinePath, 'cthead1-resample-linear.nrrd') + + const moving = await readImageNode(movingFilePath) + const reference = await readImageNode(referenceFilePath) + const transform = await readTransformNode(transformFilePath) + + const { output } = await resampleToReferenceNode(moving, reference, { transform, interpolator: 'linear' }) + const baseline = await readImageNode(baselineFilePath) + + const { metrics } = await compareImagesNode(output, { baselineImages: [baseline, ] }) + + t.true(metrics.almostEqual) +}) + +test('Test resampleToReferenceNode nearest_neighbor with transform', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const referenceFilePath = path.join(testInputPath, 'cthead1-resample-reference.nrrd') + const transformFilePath = path.join(testInputPath, 'cthead1-resample-transform.h5') + const baselineFilePath = path.join(testBaselinePath, 'cthead1-resample-nearest-neighbor.nrrd') + + const moving = await readImageNode(movingFilePath) + const reference = await readImageNode(referenceFilePath) + const transform = await readTransformNode(transformFilePath) + + const { output } = await resampleToReferenceNode(moving, reference, { transform, interpolator: 'nearest_neighbor' }) + const baseline = await readImageNode(baselineFilePath) + + const { metrics } = await compareImagesNode(output, { baselineImages: [baseline, ] }) + + t.true(metrics.almostEqual) +}) + +// The label_image interpolator (ITK's GenericLabelInterpolator remote module) is +// not available in the `itk` Python wheel, so no independent baseline could be +// generated in Phase 04. Instead, mirror the C++ `resample-to-reference-label-image` ctest: +// resample the multi-label image `2th_cthead1.png` onto its own geometry with the +// identity transform. A grid-aligned identity resample samples each output point +// at an exact input pixel centre, so the label interpolator reproduces the input +// labels exactly -- the input image is therefore its own trusted baseline. +test('Test resampleToReferenceNode label_image interpolator', async t => { + const labelImageFilePath = path.join(testInputPath, '2th_cthead1.png') + + const labelImage = await readImageNode(labelImageFilePath) + + const { output } = await resampleToReferenceNode(labelImage, labelImage, { interpolator: 'label_image' }) + const baseline = await readImageNode(labelImageFilePath) + + const { metrics } = await compareImagesNode(output, { baselineImages: [baseline, ] }) + + t.true(metrics.almostEqual) +}) + +// VectorImage (multi-component) path. itkwasm reads apple.jpg as `RGB` and the +// reference .mha as `Vector`, but resample's SupportInputImageTypes dispatch only +// matches `VariableLengthVector`, so reassign the pixelType on both the moving and +// reference images before calling resample (as test_downsample.py's vector test does). +// The independent baseline uses the identity transform (grid change only). +test('Test resampleToReferenceNode VectorImage', async t => { + const movingFilePath = path.join(testInputPath, 'apple.jpg') + const referenceFilePath = path.join(testInputPath, 'apple-resample-reference.mha') + const baselineFilePath = path.join(testBaselinePath, 'apple-resample-linear.mha') + + const moving = await readImageNode(movingFilePath) + moving.imageType.pixelType = PixelTypes.VariableLengthVector + const reference = await readImageNode(referenceFilePath) + reference.imageType.pixelType = PixelTypes.VariableLengthVector + + const { output } = await resampleToReferenceNode(moving, reference, { interpolator: 'linear' }) + const baseline = await readImageNode(baselineFilePath) + + const { metrics } = await compareImagesNode(output, { baselineImages: [baseline, ] }) + + t.true(metrics.almostEqual) +}) + +// Generic (non-affine) parameterization: a Translation transform must be applied as a real translation, not +// coerced into an affine. It maps the output grid by x -> x + offset, identical to an affine with the identity +// matrix and the same translation -- so both resamples produce the same image. (The previous affine-only reader +// copied the 2 translation parameters into the affine's first 2 matrix slots, silently producing a shear.) +test('Test resampleToReferenceNode applies a non-affine translation like the equivalent affine', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const moving = await readImageNode(movingFilePath) + + const offset = [12, -7] + const { output: viaTranslation } = await resampleToReferenceNode( + moving, moving, { transform: translationTransform(offset), interpolator: 'linear' }) + const { output: viaAffine } = await resampleToReferenceNode( + moving, moving, { transform: affineTransform([1, 0, 0, 1], offset, [0, 0]), interpolator: 'linear' }) + + // The two transforms encode the identical mapping, so the resampled images match. + const { metrics } = await compareImagesNode(viaTranslation, { baselineImages: [viaAffine, ] }) + t.true(metrics.almostEqual) +}) + +// A single-entry TransformList holding the Composite marker itkwasm uses to serialize an +// itk::CompositeTransform: the marker carries no parameters of its own; the component transforms follow it. +function compositeMarker (dimension) { + const transformType = new TransformType(TransformParameterizations.Composite, FloatTypes.Float64, dimension, dimension) + const transform = new Transform(transformType) + transform.name = 'CompositeTransform' + transform.numberOfFixedParameters = 0 + transform.numberOfParameters = 0 + transform.fixedParameters = Float64Array.from([]) + transform.parameters = Float64Array.from([]) + return [transform] +} + +// Chained transforms: the list [A, B] is composed with itk::CompositeTransform semantics -- the LAST entry is +// applied to the point first, so the mapping is A(B(x)). Here A = scale-by-2 about the origin and +// B = translate(10, 6): A(B(x)) = 2*(x + (10, 6)) = 2x + (20, 12). Every value is exactly representable in +// floating point and the arithmetic is exact, so the chained resample is identical to the single equivalent +// affine (matrix [2,0;0,2], translation (20,12)). +test('Test resampleToReferenceNode composes a multi-transform chain', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const moving = await readImageNode(movingFilePath) + + const chain = [ + ...affineTransform([2, 0, 0, 2], [0, 0], [0, 0]), + ...translationTransform([10, 6]) + ] + const { output: viaChain } = await resampleToReferenceNode( + moving, moving, { transform: chain, interpolator: 'linear' }) + + const { output: viaSingle } = await resampleToReferenceNode( + moving, moving, { transform: affineTransform([2, 0, 0, 2], [20, 12], [0, 0]), interpolator: 'linear' }) + + const { metrics } = await compareImagesNode(viaChain, { baselineImages: [viaSingle, ] }) + t.true(metrics.almostEqual) +}) + +// Composite-marker form: the same chain serialized the way transform-io serializes an itk::CompositeTransform +// (a Composite marker entry followed by the component transforms) must compose identically to the bare chain. +test('Test resampleToReferenceNode applies a composite transform list', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const moving = await readImageNode(movingFilePath) + + const composite = [ + ...compositeMarker(2), + ...affineTransform([2, 0, 0, 2], [0, 0], [0, 0]), + ...translationTransform([10, 6]) + ] + const { output: viaComposite } = await resampleToReferenceNode( + moving, moving, { transform: composite, interpolator: 'linear' }) + + const { output: viaSingle } = await resampleToReferenceNode( + moving, moving, { transform: affineTransform([2, 0, 0, 2], [20, 12], [0, 0]), interpolator: 'linear' }) + + const { metrics } = await compareImagesNode(viaComposite, { baselineImages: [viaSingle, ] }) + t.true(metrics.almostEqual) +}) + +// Background value: output samples that map outside the moving image get the default pixel value. A large +// translation pushes the entire output grid outside the moving image, so with nearest-neighbor sampling every +// output pixel becomes exactly the background value -- 200 when set, and the ITK default of 0 when unset. +test('Test resampleToReferenceNode fills out-of-bounds samples with the background value', async t => { + const movingFilePath = path.join(testInputPath, 'cthead1.png') + const moving = await readImageNode(movingFilePath) + + const farOutside = translationTransform([100000, 100000]) + + const { output: background } = await resampleToReferenceNode( + moving, moving, { transform: farOutside, interpolator: 'nearest_neighbor', defaultValue: 200 }) + t.true(background.data.every((v) => v === 200), 'every out-of-bounds pixel is the 200 background') + + // Unset -> ITK's default of 0. + const { output: zeroed } = await resampleToReferenceNode( + moving, moving, { transform: farOutside, interpolator: 'nearest_neighbor' }) + t.true(zeroed.data.every((v) => v === 0), 'every out-of-bounds pixel defaults to 0') +}) diff --git a/packages/downsample/typescript/vite.config.js b/packages/downsample/typescript/vite.config.js index ad85ff8ed..3832e7ca3 100644 --- a/packages/downsample/typescript/vite.config.js +++ b/packages/downsample/typescript/vite.config.js @@ -18,7 +18,7 @@ export default defineConfig({ format: 'es' }, optimizeDeps: { - exclude: ['itk-wasm', '@itk-wasm/image-io', '@itk-wasm/mesh-io', '@thewtex/zstddec', '@itk-viewer/io'] + exclude: ['itk-wasm', '@itk-wasm/image-io', '@itk-wasm/mesh-io', '@itk-wasm/transform-io', '@thewtex/zstddec', '@itk-viewer/io'] }, plugins: [ // put lazy loaded JavaScript and Wasm bundles in dist directory @@ -28,6 +28,7 @@ export default defineConfig({ { src: '../../../dist/pipelines/*', dest: 'pipelines' }, { src: '../../../node_modules/@itk-wasm/image-io/dist/pipelines/*.{js,wasm,wasm.zst}', dest: 'pipelines' }, { src: '../../../node_modules/@itk-wasm/mesh-io/dist/pipelines/*.{js,wasm,wasm.zst}', dest: 'pipelines' }, + { src: '../../../node_modules/@itk-wasm/transform-io/dist/pipelines/*.{js,wasm,wasm.zst}', dest: 'pipelines' }, ], }) ],